我正在使用脚本调用 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
.对于正常会话,我的脚本最多需要 30-35 秒才能连接到服务器并将文件通过 FTP 传输到本地计算机。
有人可以提供一些有关如何解决此问题的指示吗?
答案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