我有一个 bash 脚本,其中包含以下代码片段:
function test_sftp_connection() {
expect << EOF
log_user 0
spawn -noecho sftp -P $SFTP_SERVER_PORTNUMBER $SFTP_SERVER_USERNAME@$SFTP_SERVER_HOSTNAME
expect "password:"
send "$SFTP_SERVER_PASSWORD\r"
expect "sftp>"
send "exit\r"
EOF
# Check the exit status of the expect command
if [ $? -ne 0 ]; then
echo "Unable to connect to the SFTP server."
exit 1
fi
}
我目前的理解是“期望“sftp>””按照它所说的那样做;它需要 sftp> 提示符。因此,如果脚本输入了错误的密码,系统会要求您再次输入密码;这显然不一样。所以我希望它停止执行;返回一个非零状态代码。
不幸的是,它并没有这样做。相反,它超时并显示状态代码 0。我不明白为什么会这样做,也不明白如何解决这个问题。如果有人知道如何处理这种情况,将不胜感激。
我已将
log_user 0
更改为 log_user 1
以启用输出日志记录,并添加了一个额外的 Expect 块来处理提示不是 sftp>
时的情况,因此在这种情况下,我使用状态代码 1 退出timeout
关键字!
看看这个:
function test_sftp_connection() {
expect << EOF
log_user 1
spawn -noecho sftp -P $SFTP_SERVER_PORTNUMBER $SFTP_SERVER_USERNAME@$SFTP_SERVER_HOSTNAME
expect "password:"
send "$SFTP_SERVER_PASSWORD\r"
expect {
"sftp>" {
send "exit\r"
expect eof
exit 0
}
timeout {
exit 1
}
}
EOF
if [ $? -ne 0 ]; then
echo "Unable to connect to the SFTP server."
exit 1
fi
}