2013-08-14 7 views
1

Я создал скрипт с expect + ssh + bash executed command для автоматизации процесса на удаленной машине.Ожидать с ssh не работает каждый раз

Проблема в том, что она не работает каждый раз.

  • Иногда он висит на password:
  • Иногда Входы правильно, но не execute remote command, только выхода после тайм-аута.

Вот Баш скрипт:

#!/bin/bash 

USER="user" 
PASSWORD="password" 
MACHINES="host1 host2 host3 host4" 

ex() { 

expect -c " 
       log_file ${MACHINE}.log;# 
       set timeout 8; 
       spawn ssh [email protected]$MACHINE 
       expect -re \".*ssword: \" {send \"$PASSWORD\n\"} 
       expect -re \".*host-.* \" { send \"sudo su -\r\"} 
       expect -re \".*user: \" { send \"$PASSWORD\r\"} 
       expect -re \".*# \" { send \"/usr/local/bin/REMOTE.COMMAND.sh\r\"} 
       expect -re \".*# \" { send \"exit\r\"} 
       expect -re \".*host-.* \" { send \"exit\r\"} 


" 

} 

machines() { 

for MACHINE in $MACHINES ; do 

ex & 
sleep 0.5 

done 
} 


machines 

Вот мой рабочий раствор - если есть что-то неправильно/не эффективный комментарий, пожалуйста:

#!/bin/bash 

USER="user" 
PASSWORD="password" 
MACHINES="host1 host2 host3 host4" 

ex() { 

expect -c " 
     log_file ${MACHINE}.log;# 
     match_max 100000; 
     set timeout 30; 
     spawn ssh [email protected]$MACHINE 
     expect { 
       -re \".*ssword: \" {send \"$PASSWORD\r\"; exp_continue } 
       -re \".*[email protected]*\" { send \"sudo su -\r\"; exp_continue } 
       -re \".*ssword.*:.*\" {send \"$PASSWORD\r\"; exp_continue } 
       -re \".*host-.*# \" { send \"/usr/local/bin/REMOTE.COMMAND.sh\r\"; } 
     } 
     expect { 
       -re \".*host-.*# \" { send \"exit\r\"; } 
     } 
     expect { 
       -re \".*[email protected]*\" { send \"exit\r\"; } 
     } 

" 

} 

machines() { 

for MACHINE in $MACHINES ; do 

ex & 
sleep 0.5 

done 
} 

machines 
+0

Не уверен, но, возможно, вам нужно поставить 'exp_continue' после' send \ '$ PASSWORD \ n \ ";' ... – anishsane

+0

Просто или после каждой строки? А как насчет \ n или \ r в конце команды? – mike

ответ

0

Я имел некоторые аналогичные проблемы раз ,

Проблема возникла из-за моей истории использования SSH и моих данных ~/.ssh/known_hosts.

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

Например:

 
ssh -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no 

Вы можете использовать различные виды аутентификации с возможностью PubkeyAuthentication.

+0

Как насчет сценария ожидания? Правильно ли он установлен? Должен ли я заканчивать строки с помощью \ r или \ n? Может быть, это нужно сделать другим путем? – mike

+0

Я не могу сказать, я использовал его через модуль ожидания python. – Thibault

0

Попробуйте ?:

expect -c " 
    log_file ${MACHINE}.log;# 
    set timeout 8; 
    spawn ssh [email protected]$MACHINE 
    expect { 
     -re \".*ssword: \" {send \"$PASSWORD\n\";exp_continue} 
     -re \".*host-.* \" { send \"sudo su -\r\";exp_continue} 
     -re \".*user: \" { send \"$PASSWORD\r\";exp_continue} 
     -re \".*# \" { send \"/usr/local/bin/REMOTE.COMMAND.sh\r\";exp_continue} 
     -re \".*# \" { send \"exit\r\"} 
     -re \".*host-.* \" { send \"exit\r\"} 
    }  
" 

Кроме того, я никогда не использовал expect в фоновом процессе.

+0

Это не работает для меня, похоже, что для команд нет очереди/порядка. Может быть, проблема с совпадением PROMPT? Как правильно установить такой тип: 'user @ host-city: ~ $'? У меня проблема с знаками '$' и '~'. – mike

+0

oh wait .... можете ли вы запустить его для одного МАШИНА, на переднем плане? в какой точке сценарий останавливается? вы можете обновить сценарий на основе этой информации. – anishsane

+0

Я думаю, что исправил эту проблему. Кажется, у меня были проблемы с обнаружением 'right prompt', с' end '\ r "вместо' \ n "' и 'splitting -re в 3 ожидать {} строки', поэтому он не переходит в цикл при попытке выйти из машины и вернуться к тому же приглашению в том же ожидании {}. – mike

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