2016-03-28 4 views
1

я неспособен выполнять команды на удаленном хосте с использованием ожидать script.It только входит в систему на удаленном хосте и exits.Here это кодне в состоянии выполнять удаленные команды SSH с ожидать сценария

#!/usr/bin/expect 
set timeout 15 
puts "connecting to the storage\n" 
set user [lindex $argv 0] 
set host [lindex $argv 1] 
set pass "root123" 
spawn ssh "$user\@$host" 
expect { 
"Password: " { 
send "$pass\r" 
sleep 1 
expect { 
"$ " { 
    send "isi quota quotas list|grep ramesh\r" } 
"$ " { 
    send "exit\r" } 

} 
} 
"(yes/no)? " { 
send "yes\r" 
expect { 
"$ " { send "ls\r" } 
"$ " { send "exit\r" } 

"> " {} 
} 
} 
default { 
send_user "login failed\n" 
exit 1 
} 
} 

Это только получает в удаленный хост и выходы. [глубоко @ host1: ~] $ ./sshexpect user1 host2 подключения к хранилищу

spawn ssh [email protected] 
Password: 
host2$ 
[[email protected]:~]$ 

Является ли синтаксис неправильно? Я новичок в tcl-скриптах.

ответ

1

отступов поможет много:

expect { 
    "Password: " { 
     send "$pass\r" 
      sleep 1 
      expect { 
       "$ " { send "isi quota quotas list|grep ramesh\r" } 
       "$ " { send "exit\r" } 
      } 
    } 
    "(yes/no)? " { 
     send "yes\r" 
      expect { 
       "$ " { send "ls\r" } 
       "$ " { send "exit\r" } 
       "> " {} 
      } 
    } 
    default { 
     send_user "login failed\n" 
      exit 1 
    } 
} 

Проблема здесь:

  expect { 
       "$ " { send "isi quota quotas list|grep ramesh\r" } 
       "$ " { send "exit\r" } 
      } 

Вы соответствие той же схеме дважды: Я подозреваю, что ожидать, игнорирует первый блок действий, а просто используя второй; таким образом вы сразу же выходите.

Это то, что вы хотите сделать:

expect { 
    "(yes/no)? " { send "yes\r"; exp_continue } 
    "Password: " { send "$pass\r"; exp_continue } 
    timeout  { send_user "login failed\n"; exit 1 } 
    -re {\$ $} 
} 
send "isi quota quotas list|grep ramesh\r" 

expect -re {\$ $} 
send "ls\r" 

expect -re {\$ $} 
send "exit\r" 

expect eof 
+0

я понял ошибку, но я не получил то, что делает ниже линии стендов для -rE {\ $ $} А также почему мы должны put ожидать eof в конце скрипта – anudeep

+0

Параметр '-re' использует шаблон регулярного выражения вместо шаблонов шаблонов по умолчанию. Я указываю, что приглашение представляет собой знак доллара и пробел * в конце строки *. Если ожидается, увидит знак доллара и пробел, а затем другой текст, который не будет соответствовать подсказке. 'ожидать, что eof' в основном означает« подождать, пока порочный процесс не будет закрыт »- здесь не обязательно, но в целом хорошая практика. –

+0

Я пробовал, что все еще не работает для меня. Он показывает, что «login failed» и завершает работу. Он просто регистрируется в удаленном поле, а затем пуст и после некоторого выхода с «login failed» – anudeep

Смежные вопросы