我正在尝试使用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}的密码的情况下执行此操作字符?
我尝试了不同的方法来存储$
字符:
$
这些都没有奏效。
请帮助。
答案 0 :(得分:4)
当您使用spawn
命令时,您可能实际拥有expect
脚本而非bash
脚本。这应该适用于expect
:
set password P@\$sw0rd
当然,您还必须使用expect
来运行该脚本,方法是在顶部添加#!/usr/bin/env expect
或在终端中直接使用expect
:expect <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命令并继续寻找其他模式。你确实需要其他东西才能让你突然出现。