2010-07-12 4 views
3

* Пожалуйста, не наваливайте и не говорите мне, чтобы использовать SSH-ключи. Если вам кажется, что я так делаю, делайте вид, что я пытаюсь подключиться к telnet. :-) *Использование Expect для администрирования компьютеров через SSH, но не выполняет все задачи

Я использую сценарий ожидания для запуска некоторых рутинных команд на множестве серверов под моим контролем через ssh. Скрипт должен запускать множество команд (например, svn update ~/folderx \ r ") на каждом из компьютеров. Мой текущий скрипт делает все, что я хочу, чтобы он делал ... иногда. Иногда он выходит из ssh-соединения, прежде чем он завершит один из последних нескольких команд.

Любые мысли о том, как я могу установить соединение до тех пор, пока все команды не будут завершены? Код успешно успешно работает, успешно запускает первые две команды или около того (ap-get update и один из SVN обновлений), а затем отсоединяется.

#!/usr/bin/expect -f 

spawn ssh [email protected] 
set timeout -1 
expect "Are you sure you want to continue connecting" {send "yes\r"; exp_continue} "password:" {send "*******\r"; exp_continue 
    } "[email protected]" {send "sudo apt-get update\r"} 
expect "password" {send "*******\r"; exp_continue} "[email protected]" {send "sudo svn update ~/folder1\r"} 
expect "password" {send "*******\r"; exp_continue} "[email protected]" {send "sudo svn update ~/folder2\r"} 
expect "password" {send "*******\r"; exp_continue} "[email protected]" {send "sudo svn update ~/folder3\r"} 
expect "password" {send "*******\r"; exp_continue} "[email protected]" {send "sudo reboot\r"} 
close 
+1

не забывайте возврат каретки после отправки «да» ' –

ответ

2

Оказалось, что причина, по которой он был раньше, заключалась в том, что шаблон приглашения, который я сопоставлял, соответствовал не только приглашению, но и некоторым выводам из команд svn, которые я выполнял. Я сопоставлял только часть «имени пользователя» шаблона запроса (форма запроса была «username @ machine: ~ $»). Как только я изменил скрипт, чтобы он соответствовал только «username @», он начал работать так, как ожидалось.

p.s. сценарий ssh, который поддерживает ссылки на выше, работает очень хорошо.

3

Использование Ожидать обычно неправильно делать такого рода вещи. правильный путь для установки ключей SSH, так что вы можете SSH и выполнять команды на го e, не поставляя пароль. Вот как это сделать:

0. Create public/private key pair on local machine. 
    (Only needs to be done once on local machine for all remote machines.) 
    Go to the ~/.ssh directory on your local machine and do this: 
    % ssh-keygen -t rsa 
1. Copy the public key to the remote machine: 
    % scp ~/.ssh/id_rsa.pub [email protected]:. 
2. Append that key to the authorized_keys file on the remote machine: 
    % ssh [email protected] 'cat id_rsa.pub >> .ssh/authorized_keys; /bin/rm id_rsa.pub' 
3. Finally, in case it doesn't work, check permissions, which must be just so: 
    (or maybe it's just that they can't be group/world writeable) 
    % cd ~; ls -ld . .ssh .ssh/authorized_keys 
    drwxr-xr-x . 
    drwxr-xr-x .ssh 
    -rw-r--r-- .ssh/authorized_keys 

Вот скрипт, который делает выше одним махом:

http://jakehofman.com/code/sshkey

Вы можете запускать команды на удаленной машине, как так:

ssh [email protected] ./foo args 

Для запуска команд на удаленной машине с помощью sudo, однако, может быть другой рассказ. Надеюсь, что другие могут перезвонить об этом. Но в качестве первого шага вам следует избегать Expect для первоначального входа.

+0

Dang. Я забыл включить в свой первоначальный вопрос упреждающий «пожалуйста, не говорите мне просто использовать клавиши ssh». :-) – vlasits

+0

Ха, не проблема. Но теперь мне любопытно, почему бы не использовать ключи ssh, по крайней мере, для первоначального входа? – dreeves

+0

Нет причин вообще. На самом деле, учитывая это, я, вероятно, должен был пропустить исходные строки ввода/вывода в моем фрагменте, поскольку на самом деле проблема не возникает. В интересах честности я признаю, что я не тестировал ее с помощью ключей, но я уверен, что проблема, с которой я столкнулась, сохранится, даже если бы я это сделал. Хорошо ... ты говорил мне об этом ... Я попробую это с помощью ключей. – vlasits