期望脚本中的Escape Password变量

时间:2013-02-05 19:21:42

标签: expect

后台:我正在尝试编写一个用于测试特殊字符密码的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)?

2 个答案:

答案 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";