我有以下功能。它测试 SFTP 服务器连接。它完成了它应该做的事情,但它有一个让我头疼的边缘情况。当变量 SFTP_SERVER_PASSWORD 包含美元符号时,它将不起作用,因为期望脚本认为它必须搜索变量。
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
}
我尝试了各种解决方案:
send $SFTP_SERVER_PASSWORD"\r"
send "$SFTP_SERVER_PASSWORD\r"
send "'$SFTP_SERVER_PASSWORD'\r"
但是他们最终都遇到了同样的错误:
'can't read "[few letters after dollar-sign in password]": no such variable'.
我想这很难,因为它在期望脚本中使用 Bash 变量。但我仍然认为这个问题应该是可以解决的。有人对如何解决这个问题有任何想法吗?
从Tcl语言的角度来看:
如果你想按字面意思发送 $,你必须转义
$
:
send "\$your password\r"
但是您的文本很复杂,因为您向 Tcl 传递了一个字符串,该字符串由 shell 进行插值。这意味着如果您有一个 shell 变量
SFTP_SERVER_PASSWORD
,并且该变量包含 $
,则不会有转义。
一种解决方案是用字符串
$
替换 shell 变量中的每个 \$
。但在我看来,这很麻烦而且容易出错。类似的可能性是在调用 Tcl 之前将 shell 变量放入环境中,即
export SFTP_SERVER_PASSWORD
然后在你的 Tcl 脚本中执行一个
send $env(SFT_SERVER_PASSWORD)