后台:我正在尝试编写一个用于测试特殊字符密码的expect脚本。我无法执行的测试用例之一是在密码前面加上特殊字符“ - ”。例如:“ - foo” 注意:假设ssh密钥是不可能的 注意:假设bash shell是我正在使用的shell
我的代码: 这是我的连接功能,由维基百科提供:
proc connect {passwd} {
expect {
"yes/no" {
send "yes\r"
}
}
expect {
"?assword:" {
send "$passwd\r"
expect {
"sftp*" {
return 0
}
}
}
}
# timed out
return 1
}
set user [lindex $argv 0]
set passwd [lindex $argv 1]
set host [lindex $argv 2]
spawn sftp $user@$host
puts '$passwd'\r
set rez [connect $passwd]
在我的bash脚本中,我有:
passwd="-foo"
./sftp_test $user $passwd $host
我尝试了什么:据我所知,问题是shell正在扩展变量,因此命令被解释为send -foo,它表示send有一个无效的密码。
我尝试使用单引号作为一般解决方案,但密码被拒绝(我怀疑单引号被保留)。 发送'$ passwd'“\ r”
问题:有没有办法让我在send命令中转义密码,以便我可以将它用于密码中特殊字符的所有排列(例如$ foo和f $ oo)和-foo)?
答案 0 :(得分:1)
您需要做的是:
send -- "$passwd\r"
--
表示以破折号开头的任何后续单词 not 将被视为发送命令的选项。
您可能希望将此作为习惯,并为每个发送命令执行此操作。
答案 1 :(得分:1)
如果要转义的字符是$
,该怎么办?我需要发送以下命令,但期望将其视为变量:
W $$RBLDSTS^VPRJ()
所以当我使用:
send "W $$RBLDSTS^VPRJ()\r";
我明白了:
can't read "RBLDSTS": no such variable
在这种情况下,我必须将我的命令分配给变量并使用\
转义$ set command \$\$RBLDSTS^VPRJ()
send "W $command\r";