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更新されたパスワードが一致しない場合(ファイルをインポートしたソースサーバーでパスワードが変更されたため)など、場合によってはスクリプトが中断されます。この場合、パスワード入力は2つの応答(yesと$ pass1)を受け取り、最初の2つの応答が正しくないため、3番目のパスワードプロンプトで停止します。ここでは長い間停止します(場合によっては停止しません。これは別の混乱です。なぜこのような場合には起こらないのですか)。

それにもかかわらず、これが起こった場合は、SFTPセッションタイムアウトがすぐに発生したいと思います。パスワードがまったく一致しない場合、セッションタイムアウトをすばやく設定するにはどうすればよいですか?私はすでに1つを使用していますtimeout。通常のセッションでは、私のスクリプトがサーバーに接続し、ファイルをローカルシステムにFTPするのに最大30〜35秒かかります。

誰かがこの問題を解決する方法についていくつかのアドバイスを提供できますか?

ベストアンサー1

sftpコマンドにオプションを追加できます。

-o NumberOfPasswordPrompts=1

パスワードを2回尋ねるのをやめてください。また試すことができます

-o ConnectTimeout=20
-o ConnectionAttempts=1

おすすめ記事