Всем приветЕсть скрипт expect для общения с одной редкой железякой по telnet. Есть админка на php, которая исполняет этот скрипт.
В скрипте expect есть такая команда:
stty rows 1000Она указывает скрипту, что у него в терминале - 1000 строк.
Если я вызываю скрипт из консоли, все работает. Если вызываю через web, эта строчка не работает. Кто-нибудь может подсказать, почему?
приветКак обнаружено что именно эта строчка не работает? Какое значение имеет переменная TERM в обоих случаях? Под каким пользователем выполняется php? Из терминала под этим же пользователем запускаете expect скрипт или под другим?
Спасибо, что откликнулись> Как обнаружено что именно эта строчка не работает?
Когда запускаю скрипт в консоли, железяка отдает 1000 строк (ну или столько, сколько укажу в stty rows). Если вызываю из админки - отдает только 15.
>Какое значение имеет переменная TERM в обоих случаях?
TERM в обоих случаях пустой.
> Под каким пользователем выполняется php?
php - apache. expect скрипт выполняется из под root (через sudo)
>Из терминала под этим же пользователем запускаете expect скрипт или под другим?
Пробовал и под apache, и под root. В консоли в обоих случаях скрипт работает (железяка отдает 1000 строк).
Ooops... Ошибка. Через sudo ничего не выполняется. Все выполняется из под apache.На всякий случай вот примерное содержание скриптов:
script.php:
<?php echo shell_exec("/path/to/expect_scipt.exp"); ?>expect_scipt.exp:
#!/usr/bin/expectstty rows 1000
spawn telnet 10.0.0.1
expect "login:"
send "admin\n"
expect "assword:"
send "admin\n"
expect ">"
send "en\n"
expect "assword:"
send "admin\n"
expect "#"
send "show cable modem\n"
expect "#"
exit
Что делаю для проверки:
#su apache
$php script.php
отдает 1000 строчекоткрываю script.php в браузере - отдает 15 строчек.
Что в логах ошибок апача? Покажите readlink /proc/self/fd/0 из под "su - apache" и из <?php echo shell_exec("readlink /proc/self/fd/0"); ?>Пробовали вызывать stty rows 1000 _после_ spawn telnet 10.0.0.1?
> Что в логах ошибок апача?пусто
>Покажите readlink /proc/self/fd/0 из под "su - apache" и из <?php echo shell_exec("readlink /proc/self/fd/0"); ?>
Тут вывод различается:
Команда readlink из под apache (да или просто если shell_exec("readlink.. запускаю в консоли) выдает /dev/pts/0
Когда открываю php-скрипт в браузере - выдает /dev/null> Пробовали вызывать stty rows 1000 _после_ spawn telnet 10.0.0.1?
пробовал. результат тот же (железка отдает только 15 строчек).
Попробуйте:trap {
stty rows 1000 < $spawn_out(slave, name)
}WINCHпосле
spawn telnet 10.0.0.1
> Попробуйте:
> trap {
> stty rows 1000 < $spawn_out(slave, name)
> }WINCH
> после
> spawn telnet 10.0.0.1Пробую. Все равно отдает 15 строчек.
>> Попробуйте:
>> trap {
>> stty rows 1000 < $spawn_out(slave, name)
>> }WINCH
>> после
>> spawn telnet 10.0.0.1
> Пробую. Все равно отдает 15 строчек.А, так: stty rows 1000 < $spawn_out(slave, name) ?
>>> Попробуйте:
>>> trap {
>>> stty rows 1000 < $spawn_out(slave, name)
>>> }WINCH
>>> после
>>> spawn telnet 10.0.0.1
>> Пробую. Все равно отдает 15 строчек.
> А, так: stty rows 1000 < $spawn_out(slave, name) ?И так тоже не работает (в общем я уже испробовал кучу вариаций. все, что в гугле смог найти по поводу... ниче не помогает) :-(
В общем-то все решилось несколько иным способом. Оказалось, что в железяке (CMTS casa systems) есть аналог cisco-вской команды "terminal length 0" - "page-off" (из-за такого непохожего на цисковский аналог названия я ее сразу и не заметил). В общем, команда отключает постраничный вывод последующих команд, что мне, в общем-то, и нужно.
Sproot, спасибо Вам огромное за столько убитого на меня и мой expect-скрипт (будь он неладен) времени.
>[оверквотинг удален]
> И так тоже не работает (в общем я уже испробовал кучу вариаций.
> все, что в гугле смог найти по поводу... ниче не помогает)
> :-(
> В общем-то все решилось несколько иным способом. Оказалось, что в железяке (CMTS
> casa systems) есть аналог cisco-вской команды "terminal length 0" - "page-off"
> (из-за такого непохожего на цисковский аналог названия я ее сразу и
> не заметил). В общем, команда отключает постраничный вывод последующих команд, что
> мне, в общем-то, и нужно.
> Sproot, спасибо Вам огромное за столько убитого на меня и мой expect-скрипт
> (будь он неладен) времени.Хорошо, что хоть так все разрешилось :) Просто, было интересно ;)
>[оверквотинг удален]
> И так тоже не работает (в общем я уже испробовал кучу вариаций.
> все, что в гугле смог найти по поводу... ниче не помогает)
> :-(
> В общем-то все решилось несколько иным способом. Оказалось, что в железяке (CMTS
> casa systems) есть аналог cisco-вской команды "terminal length 0" - "page-off"
> (из-за такого непохожего на цисковский аналог названия я ее сразу и
> не заметил). В общем, команда отключает постраничный вывод последующих команд, что
> мне, в общем-то, и нужно.
> Sproot, спасибо Вам огромное за столько убитого на меня и мой expect-скрипт
> (будь он неладен) времени.быть может кому-то будет полезно
возникла похожая проблема
нужно было через веб-браузер вызывать исполнение expect скрипта, который бы собирал на маршрутизаторе дамп и забирал его на веб-сервер для дальнейшей обработки
при запуске php скрипта через консоль все обрабатывалось отлично. При вызове через веб - болты, nginx не дожидался ответа от php (апач, пхп-мод) и давал отбой по таймауту
Пол дня ломал голову, перерыл все мыслимые-немыслимые конфиги
все оказалось на поверхности:
в консоли скрипт запускал из под рута, и конектился спокойно по ssh - все работает.
при вызове же через веб, процесс запускался от имени апача, и требовалось принять публичный ключ от устройства. Это мой скрипт не обрабатывал и загибался в состоянии ожидания предложения ввести пароль. А устройство ожидало, пока апач примет ключ.
Для решения либо 1 раз нужно было законектится из под apache по ssh к устройству, что бы apache созранил у себя ключик и далее подключался уже без вопросов.Ниже мой скрипт:
#!/usr/bin/expect -fspawn ssh admin@***.***.***.***
#ниже команды, что бы принять ключ, 1 раз выполнил потом закоментил
#expect "Are you sure you want to continue connecting (yes/no)?"
#send "yes\r"#просим устройство(microtic routerBoard) собрать дамп
expect "admin@***.***.***.***'s password:"
send "*******\r"
expect login
expect eof
send "tool torch src-address=0.0.0.0/0 dst-address=0.0.0.0/0 \"ether4\"\r"
expect eof
send "D"
sleep 1
send "Q"
expect eof
send "quit\r"
expect eof
# забираем дамп с устройства на веб сервер
spawn ftp ***.***.***.***
expect "Name (***.***.***.***:***):"
send "adminftp\r"
expect "Password:"
send "*******\r"
expect "ftp>"
send "get dump.txt /var/www/dump.txt\r"
expect "ftp>"
send "quit\r"