не может появиться (ssh) с помощью ожидаемого - PullRequest
2 голосов
/ 17 сентября 2010

при выполнении

$expect filename.exp user pwd ip

Я получил ошибку

не удалось выполнить «ssh -l user ip»: такого файла или каталога нет

Содержимое filename.exp таково:

#!/opt/sfw/bin/expect -D

set OMC_Usr  [lindex $argv 0]
set OMC_Pwd  [lindex $argv 1]
set OMC_IP  [lindex $argv 2]

set cmd "ssh -l $OMC_Usr $OMC_IP"
spawn $cmd
expect "Password:"
send "$OMC_Pwd\r"
interact

помогите мне продолжить
Спасибо ...

1 Ответ

3 голосов
/ 17 сентября 2010

Проблема в том, что spawn нужна команда и ее аргументы передаются ей в виде нескольких аргументов Tcl, как и стандартная команда Tcl exec. Исправление заключается в том, чтобы сделать это напрямую:

spawn ssh -l $OMC_Usr $OMC_IP

Или, если вы предпочитаете (и у вас есть Tcl 8.5):

set cmd "ssh -l $OMC_Usr $OMC_IP"
spawn {*}$cmd

Или, если у вас 8.4 или раньше:

eval spawn [lrange $cmd 0 end]

Но не сделать это:

eval spawn $cmd

потому что это неожиданно оборвется, если в имени пользователя (или IP-адресе есть метасимвол Tcl), но это маловероятно).


Конечно, исправление real заключается в настройке пары ключей RSA и использовании ssh-agent для управления ею. Таким образом, вам не нужно будет передавать пароли в любой командной строке; это важно, потому что командная строка процесса является общедоступной информацией о процессе. В самом деле. Вы можете найти это с помощью чего-то тривиального, например ps -efww (или эквивалент для вашей ОС). Переменные окружения также небезопасны; есть возможность ps, чтобы показать их тоже.

...