Expect와 함께 SFTP를 사용할 때 스크립트 응답이 크게 지연됩니다.

Expect와 함께 SFTP를 사용할 때 스크립트 응답이 크게 지연됩니다.

원격 서버에서 일부 로그를 가져오기 위해 SFTP 서비스를 호출하는 스크립트를 사용하고 있습니다. 이는 일반적인 상황에서는 잘 작동하지만 어떤 경우에는 서버에서 비밀번호를 요구할 때 약 30분 이상 지연이 발생하는 것을 발견했습니다. 다음은 내가 사용하는 코드입니다.

#!/bin/bash

dirdate=`/bin/date +%Y%m%d -d "1 day ago"`

INPUT_DIR="/root/SDP_BHC/input"
CREDENTIALS_FILE="/root/FTP_TEST/Credentials.csv"

# Loop to read credentials and other details from an external file.
while IFS=','; read node_id node_name ip1 ip2 ip3 user1 pass1 user2 pass2 user3 pass3 installed location circle sdpno hwtype
do

        # Generate Input Directory for IP-Node
        mkdir -p $INPUT_DIR/"$node_id"/"$node_name"/IP/"$dirdate"

        echo -e "\n[INFO] Node IP: $ip1"
        echo -e "=============================\n"

        SOURCE_FILE="/var/opt/fds/statistics/*PSC-TrafficHandler_8*1_A_*_System*$dirdate*stat"
        TARGET_DIR="$INPUT_DIR/$node_id/$node_name/IP/$dirdate"


set prompt "(%|#|\\$|%\]) $"
spawn /usr/bin/sftp $user1@$ip1
expect { "$prompt" }
#expect "Are you sure you want to continue connecting (yes/no)?"
#bin prompt
send "yes\r"
#expect "Password:"
expect { "$prompt" }
send "$pass1\r"
expect "sftp>"
send "mget $SOURCE_FILE $TARGET_DIR\r"
set timeout 2000
expect "sftp>"
send "bye\r"
EOD

.
.
.

done < $CREDENTIALS_FILE

CREDENTIALS_FILE업데이트된 비밀번호가 일치하지 않는 경우(파일을 가져온 원본 서버에서 비밀번호가 변경되었기 때문에) 등 일부 경우에는 스크립트가 중단됩니다. 이 경우 암호 입력은 두 개의 응답(yes 및 $pass1)을 받은 다음 처음 두 개의 응답이 올바르지 않기 때문에 세 번째 암호 프롬프트에서 정지됩니다. 여기서는 오랫동안 멈춥니다(어떤 경우에는 멈춤이 없습니다. 이는 또 다른 혼란스러운 일입니다. 왜 이런 경우에는 발생하지 않는지).

그럼에도 불구하고 이런 일이 발생하면 SFTP 세션 시간 초과가 빨리 발생하고 싶습니다. 비밀번호가 전혀 일치하지 않는 경우 세션 시간 초과를 빠르게 설정하려면 어떻게 해야 합니까? 나는 이미 하나를 사용하고 있습니다 timeout. 일반 세션의 경우 내 스크립트가 서버에 연결하고 파일을 로컬 시스템에 FTP하는 데 최대 30-35초가 걸립니다.

누군가 이 문제를 해결하는 방법에 대한 몇 가지 조언을 제공할 수 있습니까?

답변1

sftp 명령에 옵션을 추가할 수 있습니다.

-o NumberOfPasswordPrompts=1

비밀번호를 두 번 묻는 것을 중지하세요. 당신은 또한 시도할 수 있습니다

-o ConnectTimeout=20
-o ConnectionAttempts=1

답변2

이 수정된 스크립트를 사용할 수 있습니다. set timeout 2000먼저 이를 사용해야 합니다 mget.

#!/bin/bash

dirdate=`/bin/date +%Y%m%d -d "1 day ago"`

INPUT_DIR="/root/SDP_BHC/input"
CREDENTIALS_FILE="/root/FTP_TEST/Credentials.csv"

# Loop to read credentials and other details from an external file.
while IFS=','; read node_id node_name ip1 ip2 ip3 user1 pass1 user2 pass2 user3 pass3 installed location circle sdpno hwtype
do

        # Generate Input Directory for IP-Node
        mkdir -p $INPUT_DIR/"$node_id"/"$node_name"/IP/"$dirdate"

        echo -e "\n[INFO] Node IP: $ip1"
        echo -e "=============================\n"

        SOURCE_FILE="/var/opt/fds/statistics/*PSC-TrafficHandler_8*1_A_*_System*$dirdate*stat"
        TARGET_DIR="$INPUT_DIR/$node_id/$node_name/IP/$dirdate"


set prompt "(%|#|\\$|%\]) $"
spawn /usr/bin/sftp $user1@$ip1
expect { "$prompt" }
#expect "Are you sure you want to continue connecting (yes/no)?"
#bin prompt
send "yes\r"
#expect "Password:"
expect { "$prompt" }
send "$pass1\r"
expect "sftp>"
set timeout 2000;
send "mget $SOURCE_FILE $TARGET_DIR\r"
expect "sftp>"
send "bye\r"
EOD

.
.
.

done < $CREDENTIALS_FILE

관련 정보