После отправки нового пароля я получаю сообщение об ошибке. Он изменит пароль, но не сделает остальную часть скрипта. Любые идеи, почему он продолжает выходить из строя. Я написал очень похожий скрипт для другого устройства, и он работает префектом, но материал после смены пароля не нужен на этом устройстве. Это устройство не будет сохранять пароль после перезагрузки, если остальное не будет завершено. Выполнение этого вручную с помощью ssh работает просто отлично, поэтому это не проблема cmds, это что-то со скриптом.Error On Expect Script
#!/usr/bin/expect
set timeout -1
#Edit for User
set user user
#Edit for Old Password
set old oldpassword
#Edit for New Password
set new newpassword
#get IP List from iplist.txt
set f [open "/iplist.txt"]
set data [read $f]
close $f
foreach line [split $data \n] {
if {$line eq {}} continue
spawn ssh [email protected]$line
expect "assword:"
send "$old\r"
sleep 10
send "passwd $user\r"
expect "assword:"
send "$new\r"
expect "assword:"
send "$new\r"
sleep 10
send "grep -v users.1.password= /tmp/system.cfg > /tmp/system.cfg.new\r"
sleep 10
send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print \$2}'` >> /tmp/system.cfg.new\r"
sleep 10
send "cp /tmp/system.cfg.new /tmp/system.cfg\r"
sleep 10
send "save && reboot\r"
close
expect eof
}
Полный сценарий много больше с с Fail-сейфами, если устройство не реагирует на SSH или исходный неверный пароль. Это не сработает, пока я не выясню, что не так с этой порцией. Я просто уменьшил его, чтобы выяснить, где эта проблема. Кроме того, эта линия, кажется, вопрос, как это делает создать system.config.new на линии перед ним:
send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print \$2}'` >> /tmp/system.cfg.new\r"
Он был и работает в SSH, как это:
send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print $2}'` >> /tmp/system.cfg.new\r"
Но посылает ошибка из-за $ 2, а затем доступна для просмотра в ожидании. Мне сказали, что положить \ $ 2 сделает его доступным только для удаленной оболочки. Любая помощь будет большой.
Первоначально он ожидал «звезды» вместо сон. Я пробовал много вещей на этом скрипте, и как только я его запускаю, включите его в свой полный скрипт. Причина, по которой я использую сон, заключается в том, что «звезда», похоже, не соответствует выходу и не работает на второй передаче $ new/r. Со сном он сделал это намного дальше. Однако у меня есть исправление. На самом деле он делает это правильно, чтобы отправить «save & & reboot \ r". Я собираюсь в конечном итоге использовать ваше предложение $ prompt из моего другого вопроса вместо сна или ожидать «звезды». При отладке на это, когда он бросает ошибку:
send: sending "save && reboot\r" to { exp4 }
expect: spawn id exp4 not open
while executing
"expect eof"
("foreach" body line 21)
invoked from within
"foreach line [split $data \n] {
if {$line eq {}} continue
spawn ssh [email protected]$line
expect "assword:"
send "$old\r"
sleep 3
send "passwd $user\r"
e..."
(file "./ubnt.sh" line 15)
«сохранить & & перезагрузка \ г» будет выгонять соединение SSH после сохраняет настройки, но это, кажется, не будет получать, что далеко , Есть ли проблема с & &, может быть, мне нужно/& &.
После каждой команды 'send'' 'ожидать' для приглашения. Без этого вы можете освободить место для незваных гостей, таких как такие ошибки. – Dinesh
Добавил дополнительную информацию об этом, если вы можете взглянуть на него. –
Я попытался расщепить сохранение и перезагрузку, так как 2 отправьте cmds, и он сохранит настройки, но будет ошибкой после отправки reboot cmd и не перезагрузки устройства. Любая идея y? –