1

背景:我正在尝试编写一个用于测试特殊字符密码的期望脚本。我无法执行的测试用例之一是密码前有特殊字符“-”。例如:“-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"

问题:有没有办法让我在发送命令中转义密码,以便我可以将它用于密码中特殊字符的所有排列(例如 $foo 和 f$oo 和 -foo)?

4

2 回答 2

1

如果要转义的字符是 $ 怎么办

我需要发送以下命令,但期望一直将其视为变量:

    W $$RBLDSTS^VPRJ()

所以当我使用:

    send "W $$RBLDSTS^VPRJ()\r";

我得到:

    can't read "RBLDSTS": no such variable

在这种情况下,我必须将我的命令分配给一个变量并用 \ 转义 $

    set command \$\$RBLDSTS^VPRJ()
    send "W $command\r";
于 2013-12-19T19:19:54.517 回答
1

你需要做的是:

send -- "$passwd\r"

--表示后面任何以破折号开头的单词都不会视为发送命令的选项。

您可能希望养成这种习惯,并为每个发送命令执行此操作。

于 2013-02-05T22:58:34.080 回答