2016-03-06 2 views
1

После отправки нового пароля я получаю сообщение об ошибке. Он изменит пароль, но не сделает остальную часть скрипта. Любые идеи, почему он продолжает выходить из строя. Я написал очень похожий скрипт для другого устройства, и он работает префектом, но материал после смены пароля не нужен на этом устройстве. Это устройство не будет сохранять пароль после перезагрузки, если остальное не будет завершено. Выполнение этого вручную с помощью 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 после сохраняет настройки, но это, кажется, не будет получать, что далеко , Есть ли проблема с & &, может быть, мне нужно/& &.

+0

После каждой команды 'send'' 'ожидать' для приглашения. Без этого вы можете освободить место для незваных гостей, таких как такие ошибки. – Dinesh

+0

Добавил дополнительную информацию об этом, если вы можете взглянуть на него. –

+0

Я попытался расщепить сохранение и перезагрузку, так как 2 отправьте cmds, и он сохранит настройки, но будет ошибкой после отправки reboot cmd и не перезагрузки устройства. Любая идея y? –

ответ

0

Взаимодействуйте, а не закрывайте и ожидайте, что eof - это ответ, который я обновлю с полным скриптом, когда это будет сделано. Вот рабочий UBNT сценарий смены пароля:

#!/usr/bin/expect 
    set timeout 30 
    #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" 
          expect { 
            "assword:" { 
                close 
                continue 
                }} 
          expect { 
            "*" { 
              send "passwd $user\r" 
              expect "*assword:*" 
              send "$new\r" 
              expect "*assword:*" 
              send "$new\r" 
              expect "*" 
              send "grep -v users.1.password= /tmp/system.cfg > /tmp/system.cfg.new\r" 
              expect "*" 
              send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print \$2}'` >> /tmp/system.cfg.new\r" 
              expect "*" 
              send "cp /tmp/system.cfg.new /tmp/system.cfg\r" 
              expect "*" 
              send "save && reboot\r" 
              interact 
              continue 
              }}}} 
      expect { 
        "*" { 
          close 
          continue 
          }} 
      expect eof 
    } 

Вот скрипт для паролей MikroTik:

#!/usr/bin/expect 
    set timeout 30 
    #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 -noecho ssh -q -o "StrictHostKeyChecking=no" [email protected]$line 
      expect { 
        "assword:" { 
          send "$old\r" 
          expect { 
            "assword:" { 
                close 
                continue 
                }} 
          expect { 
            "*" { 
              send "user set $user password=$new\r" 
              expect ">" 
              send "quit\r" 
              close 
              continue 
              }}}} 
      expect { 
        "*" { 
          close 
          continue 
          }} 
      expect eof 
    } 

Динеш отметил, что я не должен использовать «звезда» в моей ожидают команды и сказал, что вместо того, чтобы использовать :

set prompt "#|%|>|\\\$ $" 

И:

expect -re $prompt 

Которое я, вероятно, изменю. Сценарии также перемещаются в следующий IP-адрес в списке, если устройство не может быть достигнуто через ssh или если oldpassword не работает для устройства. Единственное другое изменение, которое я планирую сделать на обоих, состоит в том, чтобы создать 3 файла журнала, в которых перечислены успешные ips, неправильный пароль ips и can not reach ips. Это должна быть только одна команда перед каждым продолжением, но еще не исследовала, как вывести переменную в локальный файл журнала.

Спасибо за помощь в этом Динеше.