Intereting Posts
Глобальный буфер обмена неспособен копировать новый контент, если работает браузер на основе webkit В pfSense каковы значения столбцов «Целевые категории» и «Целевые категории для нерабочего времени» на экране ACL групп? Переименовать маску файла BASH с помощью счетчика Могу ли я восстановить свой .bash_profile с открытой вкладки «Терминал»? Кто-нибудь еще использует MINIX? Как я могу увидеть историю использования памяти? Является ли тест или [или [более переносимым как между оболочками bash, так и между другими оболочками? Как настроить клиент RTP от pulseaudio для прослушивания RTP-сервера vlc? Почему / etc / passwd открыт для публики для чтения? Как загрузить файл, а затем проверить его и запустить некоторые другие команды, используя только ssh, cat и diff в одном сеансе SSH? Почему QEMU не может использовать память буферов памяти Linux? Отображение и обновление счетчика в bash Пропустить USB-устройство fastboot для VirtualBox Windows VM от ArchLinux Как один «хороший» PID через htop после начала процесса? запустить графический веб-браузер в подсистеме Windows для Linux?

Скрипт для проверки статуса входа SFTP?

Мне нужно выполнить задачу автоматического резервного копирования, которая подключается к SFTP-серверу. Первый этап включает тестирование соединения с сервером путем подключения к нему. Чтобы быть абсолютно уверенным, что он подключается к правильному серверу, я устанавливаю StrictHostKeyChecking в ssh_config в yes.

Итак, когда соединение с SFTP-сервером выполняется, как мне сценарировать ответ с сервера. Псевдокод выглядит следующим образом:

 If connection success disconnect initiate backup procedure Else log error exit script 

Дополнительная информация:

Я использую ForceCommand internal-sftp в sshd_config сервера резервного копирования, поэтому запуск команды ssh может быть и речи.

Большинство «SSH File Transfer Protocol (SFTP) клиентов» в первую очередь / первоначально построены для интерактивного использования.

Это не означает, что им не хватает параметров пакетного режима и т. Д., Но если вы ищете передачу файлов на основе сценария по протоколу SSH, посмотрите на scp или lftp .

lftp (домашняя страница) – это то, что я использую во всех моих автоматических передачах файлов, и имеет отличную обработку ошибок с надежным статусом выхода. Он был разработан с учетом надежности.

Есть много вариантов для lftp , и вы можете предоставить любые параметры ssh , которые вам нравятся, например -oStrictHostKeyChecking=yes если вы укажете конкретную программу подключения для использования.

Пример:

 MYSSHOPTIONS="-oStrichtHostKeyChecking=yes" CONNPROG="ssh -a -x ${MYSSHOPTIONS}" cat > ${cmdfile} <<- EOF set sftp:max-packets-in-flight 16 set sftp:connect-program ${CONNPROG} open -u ${remoteuser},${password-unless-pubkey-setup} sftp://${remotehost} put localfile -o remotepathname EOF lftp -f ${cmdfile} > ${sendlog} 2>&1 RC=$? if test $RC -ne 0 then failed else reliably OK fi 

Пример немного длинный. Он создает командный файл, который задает некоторые параметры и загружает один файл remotepathname файла с необязательным другим remotepathname с другой стороны.


sftp, если вы не хотите использовать lftp :

Если вы заинтересованы в проверке входа в систему sftp, вы можете использовать этот шаблон в качестве отправной точки для дальнейшего эксперимента:

 #! / bin / sh -

 MyKey = / дом / Локальный_пользователь / .ssh / id_rsa
 remusr = bupuser
 remhost = server.destination.domain.com
 tmpfile = / TMP / sftptest $$.

 cleanup () {
   rm -f $ {tmpfile}
 }
 очистка ловушек 0

 sftp -i $ mykey -oPubkeyAuthentication = yes -oPasswordAuthentication = no -oKbdInteractiveAuthentication = no -oStrichtHostKeyChecking = yes $ {remusr} @ $ {remhost} $ {tmpfile} 2> & 1
   реж
   Выход
 EOF
 ST = $?

 если тест $ ST -ne 0
 тогда
   echo SFTP LOGIN FAILURE.  RC = $ {ST} 1> & 2
   выход $ ST
 фи

 cat $ {tmpfile} # или сделать некоторые умные grepping на нем

 выход $ ST

Я написал сценарии ожидания и bash для работы … (хотя он может стать более привлекательным, как упоминалось выше).

Сценарий Bash: выполняется с тремя аргументами: user, pass и host. Например ./bwrap.sh ninja_user ninja_star1234 ninja.com

Сценарий создает файл журнала, который позже использовался для проверки успешного входа в систему.

 #!/bin/bash # log file log="connection_test.log" if [ -f $log ]; then echo "Older file $log exists, removing and creating new..." rm -rf $log touch $log else echo "Creating log file" touch $log fi # running expect script. # arg 1 is user, arg 2 is pass, arg 3 is host ./one.exp $1 $2 $3 >> $log # checking log for connections if grep --quiet logout $log; then echo "connection successful, proceeding to backup" >> $log else echo "connection failed, please check server" >> $log exit 1 fi 

Теперь к сценарию ожидания он имеет тайм-аут в 10 секунд, и я предпочитаю работать без строгих ключей хоста. Если вы хотите работать со строгим ключом хоста, отредактируйте соответствующую строку и добавьте ожидание «да / нет» ….

 #!/usr/bin/expect -f set user [lindex $argv 0]; set password [lindex $argv 1]; set host [lindex $argv 2]; set timeout 10 # now ssh spawn ssh $user@$host -o StrictHostKeyChecking=no match_max 100000 # Look for passwod prompt expect "*?assword:*" # Send password aka $password send -- "$password\r" expect "*$ " send -- "whoami\r" expect "<user name>" # change user send -- "exit\r" expect eof 

Надеюсь это поможет.

Для подключения sftp пожалуйста: добавьте строку в скрипт bash где $4 – порт

 ./one.exp $1 $2 $3 $4 >> $log 

добавить строку для expect скрипта:

 set port [lindex $argv 3]; 

заменить в сценарии ожидания

 spawn ssh $user@$host -o StrictHostKeyChecking=no 

с

 spawn sftp $host@$user -o Port=$port StrictHostKeyChecking=no 

а также

  expect "*$ " 

с

 expect "sftp>" 

Поскольку у меня нет сервера SFTP для его проверки, изменения сделаны на основе [этого вопроса]: sftp файл с использованием сценария оболочки

Кроме того, [wait homepage]: http://expect.sourceforge.net/ может быть удобно.

Наконец, прочитав ваши комментарии относительно прямого подхода, вы можете просто использовать nc и посмотреть, находится ли порт host: port. Для этого вы можете использовать:

 #!/bin/bash # log file log="connection_test.log" if [ -f $log ]; then echo "Older file $log exists, removing and creating new..." rm -rf $log touch $log else echo "Creating log file" touch $log fi # nc nc_command=`nc -z -w 5 $1 $2 | tee -a $log` if [[ $nc_command == *succeeded* ]]; then echo "Server is listening, ready for backup" | tee -a $log else echo " Server seems to be offline, please check" | tee -a $log exit 1 fi 

Для запуска последнего скрипта используйте: ./test.sh host port

Вы можете проверить подключение sftp , просто выполнив тест на соединение ssh :

 if $(ssh -q belmin@mysever.bfworks.com exit) then echo yes fi 

Если сервер не разрешает ssh , вы можете использовать nmap но это не проверяет проверку ключа:

 nmap myserver.bfworks.com -PN -p ssh | grep 'open' 

Я уверен, что есть более благоприятные решения, но надеюсь, что это поможет.