SFTP 서버에 연결된 자동 백업 작업을 수행해야 합니다. 첫 번째 단계에서는 서버에 연결하여 서버 연결을 테스트합니다. 올바른 서버에 연결되어 있는지 확인하기 위해 StrictHostKeyChecking
ssh_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'