linux — исполняемый файл php дает другой результат, нежели запуск скрипта в оболочке

Я сделал ожидаемый скрипт для управления маршрутизатором Mikrotik из оболочки (код ниже).

Запуск скрипта из оболочки:

sudo -u www-data sh -c '/usr/bin/expect /full/path/to/Mikrotik_wifi.sh 192.168.0.1 username TopSecretPassword wlan1 status > /tmp/expect.log 2>&1'

Дает ожидаемый результат (информация о Wi-Fi после ‘Wifi Status:’):

$ cat /tmp/expect.log
Starting SSH Connection to 192.168.0.1
Sending credentials
Logged in
Wifi Status:
/interface wireless print where name=wlan1
Flags: X - disabled, R - running
0  R name="wlan1" mtu=1500 mac-address=AA:BB:CC:DD:EE:FF arp=enabled interface-type=Atheros AR9300 mode=ap-bridge ssid="SOMENAME" frequency=2412 band=2ghz-b/g
channel-width=20mhz scan-list=default wireless-protocol=802.11 vlan-mode=no-tag vlan-id=1 wds-mode=disabled wds-default-bridge=none wds-ignore-ssid=no
bridge-mode=disabled default-authentication=yes default-forwarding=yes default-ap-tx-limit=0 default-client-tx-limit=0 hide-ssid=no
security-profile=WiFi-Sec compression=no
[username@APNAME] >

Logged out

Попытка запустить его из exec php ()

exec("sh -c '/usr/bin/expect /full/path/to/Mikrotik_wifi.sh 192.168.0.1 username TopSecretPassword wlan1 status > /tmp/expect.log 2>&1'");
echo readfile("/tmp/expect.log");

выдает неожиданные результаты в браузере (отсутствует информация Wi-Fi):

Starting SSH Connection to 192.168.0.1
Sending credentials
Logged in
Wifi Status:

[username@APNAME] >

Logged out

Мой сценарий ожидания

$ cat /full/path/to/Mikrotik_wifi.sh
#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set username "$username+tc80w"set password [lindex $argv 2]
set interface [lindex $argv 3]
set command [lindex $argv 4]
set pass "password:"set prompt "] >"
# display on screen
log_user 0

# Connect
send_user "Starting SSH Connection to $host\n"spawn /usr/bin/ssh -o StrictHostKeyChecking=no $username@$host

expect "$pass";
sleep .1;
send_user "Sending credentials\n"send "$password";
sleep .1;
send "\n";
sleep .1;

expect "$prompt";
send_user "Logged in\n"
# Perform command
switch -regexp -- $command {
{on} {
send "/interface wireless enable numbers=$interface"sleep .1
send "\r"send_user "Wifi ON\n"}
{off} {
send "/interface wireless disable numbers=$interface"sleep .1
send "\r"send_user "Wifi OFF\n"}
{status} {
send_user "Wifi Status:\n"send "/interface wireless print where name=$interface"sleep .1
send "\r"expect "$prompt";
puts $expect_out(buffer)
}
default {
send_user "Please select command: on, off, status\n"}
}

# Logout
sleep .1;
send "/quit";
sleep .1;
send "\n";
send_user "Logged out\n"exit

я пытался

  • отключение цвета и размера оболочки микротика: username + tc80w (http://wiki.mikrotik.com/wiki/Manual%3aConsole_login_process#FAQ)
  • в том числе stderr: 2>&1
  • запись в файл вместо вывода прямо в браузер:> /tmp/expect.log
  • включая оболочку (sh -c) в вызов exec
  • пробовал разные варианты исполнения exec: exec, shell_exec, system, passthru
  • увеличение размера буфера exec: буфер 2000
  • удаление скрытых символов из $ Exec_out (буфера) exec: set clean [regsub -all {[^., = [: alnum:]]} $ lineOfBuffer «»]
  • send_user vs put не имеет значения

Системная информация

Debian GNU/Linux 8.2 (jessie)
expect version 5.45
PHP Version 5.6.14-0+deb8u1

Любые предложения о том, как это исправить / отладить?


Обновление (1):

Я пробовал сценарий ожидания с

log_user 1

Хотя это не меняет результат, в браузере отображаются следующие символы:

  • [9999B
  • [K

Обновление (2):

Я пробовал сценарий ожидания с

exp_internal 1

Это дает мне следующий соответствующий вывод:

Wifi Status:
send: sending "/interface wireless print where name=wlan1" to { exp5 }
send: sending "\r" to { exp5 }

expect: does " " (spawn_id exp5) match glob pattern "] >"? no

expect: does " \r[username@APNAME] > \u001b[K/interface wireless print where name=wlan1" (spawn_id exp5) match glob pattern "] >"? yes
expect: set expect_out(0,string) "] >"

Может ли быть так, что команда не выполняется — и как я могу это проверить (логи mikrotik не показывают это …) — однако, команды включения / выключения Wi-Fi работают нормально …

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]