2012-03-14 3 views
3

Иногда при подключении к удаленному SSH-серверу я получаю Connection Closed By *IP*; Couldn't read packet: Connection reset by peer. Но после попытки одного или двух раз подключаться правильно.Петля до соединения с SSH

Это представляет проблему с несколькими сценариями bash, которые я использую для автоматической загрузки архивных резервных копий на сервер SSH, например;

export SSHPASS=$sshpassword 
sshpass -e sftp -oBatchMode=no -b - [email protected]$sshaddress << ! 
    cd $remotefolder 
    put $backupfolder/Qt_$date.sql.gz 
    bye 
! 

Как это сделать, пока он фактически не подключится?

UPDATE: (Solution)

RETVAL=1 
while [ $RETVAL -ne 0 ] 
do 
export SSHPASS=$sshpassword 
sshpass -e sftp -oBatchMode=no -b - [email protected]$sshaddress << ! 
    cd $remotefolder 
    put $backupfolder/Qt_$date.tgz 
    bye 
! 
RETVAL=$? 
[ $RETVAL -eq 0 ] && echo Success 
[ $RETVAL -ne 0 ] && echo Failure 
done 
+1

решить реальную проблему, "coudln't чтения пакета: сброс соединения пэром". – rapadura

+0

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

ответ

-1

Я не эксперт сценариев оболочки, но я хотел бы проверить возвращаемое значение sshpass при выходе.

От man ssh:

ssh exits with the exit status of the remote command or 
with 255 if an error occurred. 

От man sshpath:

Возвращаемые значения

Как и с любой другой программой, sshpass возвращает 0 в случае успеха. В случае отказа, используются следующие коды возврата:

  1. Недопустимый аргумент командной строки
  2. Конфликтующие аргументы приведены
  3. Общая ошибка времени выполнения
  4. Непризнанный ответа от SSH (ошибка синтаксического анализа)
  5. Invalid/неправильный пароль
  6. Открытый ключ от общественности неизвестен. sshpass выходит без подтверждения нового ключа.

Кроме того, ssh может жаловаться на человека в середине attack. Эта жалоба не идет на tty. Другими словами, даже с sshpass, сообщение об ошибке из ssh печатается со стандартной ошибкой. В таком случае возвращается код возврата ssh назад. Обычно это невообразимое (и неинформативное) «255» для всех случаев ошибок.

Так что попробуйте запустить команду и проверить ее возвращаемое значение. Если возвращаемое значение не было 0 (для SUCCESS), повторите попытку. Повторяйте, используя цикл while, пока не добьетесь успеха.

Sidenote: почему вы используете sshpass вместо public-key (passwordless) authentication? Это более безопасно (вы не должны записать свой пароль) и делает вход в через регулярные ssh так же легко, как ssh [email protected].

Там в even an easy tool to set it up: ssh-copy-id.

+0

Работаю просто отлично, и спасибо за подсказку keyfile;) – natli

+0

+1 для ключевого предложения auth. – glglgl

0

Попробуйте что-то вроде этого:

export SSHPASS=$sshpassword 

sshpassFunc() { 
    sshpass -e sftp -oBatchMode=no -b - [email protected]$sshaddress << ! 
    cd $remotefolder 
    put $backupfolder/Qt_$date.sql.gz 
    bye 
! 
} 

until sshpassFunc; do 
    sleep 1 
done 

(не проверено)

+2

И теперь каждый процесс, порожденный этим, прекрасно знает ваш пароль, потому что вы экспортировали его через переменную окружения. Для этих ситуаций используйте обмен паролями без пароля. – Marcin

+1

Я показал, что потому что натли спросить цикл for, вот и все ... –

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