Script para testar o status de login do SFTP?

3

Eu preciso executar uma tarefa de backup automatizada que se conecta a um servidor SFTP. O primeiro estágio envolve testar a conexão do servidor conectando-se a ela. Para ter certeza absoluta de que está se conectando ao servidor correto, estou configurando o StrictHostKeyChecking em ssh_config para sim.

Assim, quando a conexão com o servidor SFTP é feita, como faço o script da resposta do servidor. O pseudo código é o seguinte:

If connection success
  disconnect
  initiate backup procedure

Else
  log error
  exit script

Informações adicionais:

Estou usando ForceCommand internal-sftp no sshd_config do servidor de backup, portanto, executar o comando ssh está fora de questão.

    
por Question Overflow 04.08.2014 / 12:56

3 respostas

1

A maioria dos "clientes SSH File Transfer Protocol (SFTP)" são principalmente / inicialmente criados para uso interativo.

Isso não significa que eles não tenham opções de modo em lote e tal, mas se você estiver procurando por uma transferência de arquivos baseada em script através do protocolo SSH, dê uma olhada em scp ou lftp .

lftp (homepage) é o que eu uso em todas as minhas transferências automáticas de arquivos, e tem excelente tratamento de erros com saída confiável status. Foi projetado com confiabilidade em mente.

Existem toneladas de opções para lftp , e você pode fornecer qualquer ssh das opções que desejar, como -oStrictHostKeyChecking=yes se você especificar um programa de conexão específico para usar.

Exemplo:

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

O exemplo é um pouco longo. Ele cria um arquivo de comando que define algumas opções e carrega um arquivo localfile com opcionalmente outro remotepathname no outro lado.

variante sftp se você não quiser usar lftp :

Se você estiver interessado em verificar o acesso ao login do sftp, poderá usar esse modelo como ponto de partida para novas experiências:

#!/bin/sh -

mykey=/home/localuser/.ssh/id_rsa
remusr=bupuser
remhost=server.destination.domain.com
tmpfile=/tmp/sftptest.$$

cleanup() {
  rm -f ${tmpfile}
}
trap cleanup 0

sftp -i $mykey -oPubkeyAuthentication=yes -oPasswordAuthentication=no -oKbdInteractiveAuthentication=no -oStrichtHostKeyChecking=yes ${remusr}@${remhost}  ${tmpfile} 2>&1
  dir
  exit
EOF
ST=$?

if test $ST -ne 0
then
  echo SFTP LOGIN FAILURE. RC=${ST} 1>&2
  exit $ST
fi

cat ${tmpfile} # or do some clever grepping on it

exit $ST
    
por 04.08.2014 / 15:56
2

Eu escrevi scripts de esperar e bash para trabalhar isso ... (embora possa ser mais chique como mencionado acima).

Script de bash: executado com três argumentos: user, pass e host. Por exemplo ./bwrap.sh ninja_user ninja_star1234 ninja.com

O script cria um arquivo de log que mais tarde é usado para verificar log in / out bem-sucedido.

#!/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

Agora, para o script expect, ele tem um tempo limite de 10 segundos e, na verdade, prefiro trabalhar sem a chave host restrita. Se você quiser trabalhar com chave de host restrita, edite a linha relevante e adicione um "sim / não" esperado ....

#!/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

Espero que isso ajude.

Para sftp de conexão, por favor: adicione linha ao script bash em que $4 é porta

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

adicione linha ao script expect :

set port [lindex $argv 3];

substituir no script de espera

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

com

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

e

 expect "*$ "

com

expect "sftp>"

Como não tenho um servidor SFTP para testá-lo, as alterações são feitas com base em [esta pergunta]: sftp um arquivo usando o shell script

Além disso, [esperar página inicial]: o link pode ser útil.

Por último, lendo seu comentário sobre uma abordagem direta, é possível simplesmente usar nc e ver se o host: port está ativo. Para isso você pode usar:

#!/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 

Para executar o último script, use: ./test.sh host port

    
por 04.08.2014 / 15:53
0

Você pode testar a conectividade sftp fazendo apenas um teste de conexão ssh :

if $(ssh -q [email protected] exit)
then
    echo yes
fi

Se o servidor não permitir ssh , você poderá usar nmap , mas isso não testa a autenticação principal:

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

Tenho certeza de que existem soluções mais sofisticadas, mas espero que isso ajude.

    
por 04.08.2014 / 15:39