в моем цикле bash над списком некоторых серверов, если ssh соединяет выход из bash-скрипта - PullRequest
2 голосов
/ 09 июля 2010

У меня есть быстрый скрипт для запуска команды на каждом сервере с использованием ssh (я уверен, что есть много лучших способов сделать это, но он был предназначен просто для быстрой работы !!). Для test1 и т. Д. Сервер отсутствует, поэтому сценарий продолжается, сценарий также продолжается в случае сбоя аутентификации pubkey. Однако, если скрипт соединяется, дата печатается, но цикл ssh завершается ...

#!/bin/bash -x

cat <<EOF |
##file servers
test1
test2
server1
server2
EOF
while read line
do
if [ "${line:0:1}" != "#"  ]; then

ssh -q -oPasswordAuthentication=no -i id_dsa user1@${line} date

fi
done

echo read line must have exited

вывод выглядит так;

+ cat
+ read line
+ '[' t '!=' '#' ']'
+ ssh -q -oPasswordAuthentication=no -i id_dsa user1@test1 date
+ read line
+ '[' t '!=' '#' ']'
+ ssh -q -oPasswordAuthentication=no -i id_dsa user1@test2 date
+ read line1
+ '[' s '!=' '#' ']'
+ ssh -q -oPasswordAuthentication=no -i id_dsa user1@server1 date
Fri Jul  9 09:04:16 PDT 2010
+ read line
+ echo read line must have exited
read line must have exited`enter code here`

что-то, что связано с успешным возвратом команды ssh, связано с условием цикла или переменной ... какие-либо предложения по поводу чего?

Ответы [ 2 ]

9 голосов
/ 09 июля 2010

Вы должны передать флаг -n в ssh, чтобы он не запутался в stdin:

ssh -n -q -oPasswordAuthentication=no -i id_dsa user1@${line} date

Я проверил это на своем собственном сервере и воспроизвел проблему, добавив -n, решив ее.Как написано на справочной странице ssh:

Перенаправляет стандартный ввод из / dev / null (фактически, предотвращает чтение из стандартного ввода)

В вашем примере ssh должен прочитать из стандартного ввода, что портит ваше чтение в цикле.

0 голосов
/ 09 июля 2010

Я думаю, причина в том, что когда ssh разветвляется и выполняется exec'd в вашем bash-скрипте, стандартный ввод скрипта открывается, поэтому ваш read одновременно завершается. Попробуйте переделать его следующим образом:

for line in test1 test2 server1 server2
do
    if [ "${line:0:1}" != "#"  ]; then
        ssh -q -oPasswordAuthentication=no -i id_dsa user1@${line} date
    fi
done

или, может быть, запустить ssh в подоболочке:

( ssh -q -oPasswordAuthentication=no -i id_dsa user1@${line} date )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...