【问题标题】:Escape Password variable in expect script在期望脚本中转义密码变量
【发布时间】:2013-02-05 19:21:41
【问题描述】:

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

【问题讨论】:

    标签: expect


    【解决方案1】:

    你需要做的是:

    send -- "$passwd\r"
    

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

    您可能希望养成这种习惯,并为每个发送命令都这样做。

    【讨论】:

      【解决方案2】:

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

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

          W $$RBLDSTS^VPRJ()
      

      所以当我使用:

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

      我明白了:

          can't read "RBLDSTS": no such variable
      

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

      转义 $
          set command \$\$RBLDSTS^VPRJ()
          send "W $command\r";
      

      【讨论】:

        猜你喜欢
        • 2014-08-13
        • 2015-11-28
        • 2019-09-04
        • 1970-01-01
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        • 2016-01-17
        • 1970-01-01
        相关资源
        最近更新 更多