Цикл пока не подключен к SSH - PullRequest
3 голосов
/ 14 марта 2012

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

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

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

Как мне получить этот цикл детали, пока он на самом деле не соединится правильно?

ОБНОВЛЕНИЕ: (Решение)

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

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

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

export SSHPASS=$sshpassword

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

until sshpassFunc; do
    sleep 1
done

(не тестировалось)

0 голосов
/ 14 марта 2012

Я не эксперт по сценариям оболочки, но я проверял бы возвращаемое значение 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. Неверный / неверный пароль
  6. Открытый ключ хоста неизвестен. sshpass выходит без подтверждения нового ключа.

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

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

Sidenote: почему вы используете sshpass вместо аутентификации с открытым ключом (без пароля)? Это более безопасно (вам не нужно записывать свой пароль) и делает вход через обычный ssh так же просто, как ssh username@host.

Существует даже простой инструмент для настройки: ssh-copy-id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...