如何将字符串存储到包含$ using linux bash

时间:2017-08-02 19:09:22

标签: linux variables expect

我正在尝试使用bash脚本向远程服务器发送密码。这工作正常,直到我们需要将密码更改为更复杂的密码,其中一个新密码包含$字符(即P@$sw0rd)。

我已经包含了不再有效的代码段:

password="'P@$sw0rd'"

spawn ssh "$deviceType@$device"
expect {
  "*no)?" {send "yes\r"}
  "*assword:" {send "$password\r"}
  "*assword:" {send "$password\r"}
}

每次发送密码时,远程系统都会尝试查找变量$sw0rd

我知道问题在于密码本身中的$字符,但有没有办法在不将所有远程服务器上的这个密码更改为不包含{{1}的密码的情况下执行此操作字符?

我尝试了不同的方法来存储$字符:

$

这些都没有奏效。

请帮助。

2 个答案:

答案 0 :(得分:4)

当您使用spawn命令时,您可能实际拥有expect脚本而非bash脚本。这应该适用于expect

set password P@\$sw0rd

当然,您还必须使用expect来运行该脚本,方法是在顶部添加#!/usr/bin/env expect或在终端中直接使用expectexpect <SCRIPT>

答案 1 :(得分:0)

@ArkadiuszDrabczyk有你的答案。

您需要使用exp_continue让登录工作:

spawn ssh "$deviceType@$device"
expect {
  "*no)?" {send "yes\r"; exp_continue}
  "*assword:" {send "$password\r"; exp_continue}
  "*your prompt pattern here"
}
# ... carry on with the script

exp_continue允许您保持当前的expect命令并继续寻找其他模式。你确实需要其他东西才能让你突然出现。