SFTP 로그인 상태를 테스트하는 스크립트?

SFTP 로그인 상태를 테스트하는 스크립트?

SFTP 서버에 연결된 자동 백업 작업을 수행해야 합니다. 첫 번째 단계에서는 서버에 연결하여 서버 연결을 테스트합니다. 올바른 서버에 연결되어 있는지 확인하기 위해 StrictHostKeyCheckingssh_config를 yes로 설정했습니다.

SFTP 서버에 연결할 때 서버의 응답을 스크립팅하는 방법은 무엇입니까? 의사 코드는 다음과 같습니다.

If connection success
  disconnect
  initiate backup procedure

Else
  log error
  exit script

추가 정보:

ForceCommand internal-sftp백업 서버에서 sshd_config를 사용하고 있어서 ssh명령 실행이 불가능합니다.

답변1

대부분의 SSH 파일 전송 프로토콜(SFTP) 클라이언트는 기본적으로/원래 대화형 사용을 위해 구축되었습니다.

그렇다고 배치 모드 옵션 등이 부족하다는 의미는 아니지만 SSH 프로토콜을 통한 스크립트 기반 파일 전송을 찾고 있다면 scp또는 lftp.

lftp(집)이는 내가 모든 자동화된 파일 전송에 사용하는 것이며 오류 처리가 뛰어나고 종료 상태가 안정적입니다. 신뢰성을 염두에 두고 설계되었습니다.

수많은 옵션이 있으며 사용할 특정 커넥터를 지정하는 등 원하는 대로 lftp제공할 수 있습니다 .ssh-oStrictHostKeyChecking=yes

예:

MYSSHOPTIONS="-oStrictHostKeyChecking=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

예제가 좀 깁니다. 명령 파일을 생성하고, 일부 옵션을 설정하고, 한 파일을 업로드하고, localfile선택적으로 다른 파일을 반대편에 업로드합니다.remotepathname


이를 사용하지 않으려면 sftp 변형을 사용할 수 있습니다 lftp.

SFTP 로그인 액세스를 확인하는 데 관심이 있는 경우 이 템플릿을 추가 실험의 시작점으로 사용할 수 있습니다.

#!/bin/sh -

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

깨끗하다(​​) {
  rm -f ${tmp파일}
}
트랩 정리 0

# 이는 ~/.ssh/config의 옵션을 따릅니다(아마도 /etc/ssh/ssh_config.d/*.conf일 수도 있음)
# /etc/ssh/ssh_config에 포함된 경우 거기에 제공된 옵션이 적용됩니다.
sftp -i $mykey -oPubkeyAuthentication=yes -oPasswordAuthentication=no -oKbdInteractiveAuthentication=no -oStrictHostKeyChecking=yes ${remusr}@${remhost} ${tmpfile} 2>&1
  목차
  출구
EOF
ST=$?

$ST -ne 0을 테스트하는 경우
그 다음에
  echo SFTP 로그인에 실패했습니다. RC=${ST} 1>&2
  $ST 종료
필리핀 제도

cat ${tmpfile} # 아니면 영리한 grep 연산을 수행합니다.

$ST 종료

답변2

나는 이것을 하기 위해 Expect와 bash 스크립트를 작성했습니다... (비록 언급했듯이 더 멋질 수 있지만).

Bash 스크립트: 사용자, 패스 및 호스트의 세 가지 매개변수로 실행됩니다. 예를 들어./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 파일 사용

또한 [예상 홈페이지]:http://expect.sourceforge.net/ 매우 편리할 수도 있습니다.

마지막으로 직접 방법에 대한 귀하의 의견을 읽으면 간단히 사용하여 nc호스트:포트가 작동하는지 확인할 수 있습니다. 이렇게 하려면 다음을 사용할 수 있습니다.

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

답변3

혹시 백업 스크립트가 Python 기반인 경우 다음을 살펴보는 것이 좋습니다.check_sftp, Checkmk가 제공하는 소위 활성 검사입니다. SFTP 서버를 확인하는 특정 사용 사례가 있습니다. Python과 순수 Python SSH 구현을 기반으로 하기 때문에파라미코, Python만 있으면 됩니다. 여기에는 비밀번호 저장 및 OMD_ROOT 통합과 같은 일부 Checkmk 세부 정보가 포함되어 있으며 독립적으로 작동하려면 제거해야 할 수도 있습니다. 하지만 PUT 또는 GET 파일 옵션을 포함하고 서버의 타임스탬프를 비교하는 등 약간 복잡하므로 시도해 볼 가치가 있습니다. 따라오니까Nagios 검사 플러그인 가이드, 성공을 위해 종료 코드를 사용할 수 있습니다 0.

또 다른 Python 기반 옵션은 다음과 같습니다.구조(또한 Paramiko 기반) 또는 사용Paramiko용 SFTP 모듈곧장.

답변4

sftp연결 테스트를 수행하여 ssh연결을 테스트 할 수 있습니다 .

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

서버가 이를 허용하지 않으면 를 ssh사용할 수 있지만 nmap이는 키 인증을 테스트하지 않습니다.

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

관련 정보