我正在尝试在远程计算机上动态设置 PS1 提示符。这个想法是,当我对远程计算机执行 ssh 时,我还将发送将设置为该远程计算机的提示的值。我已经有一个 Expect 脚本,它可以自动 ssh 登录到远程计算机。现在我尝试修改脚本,使其执行自动 ssh 操作,并使用通过 ssh 传递的值设置 PS1 提示符。下面是我的脚本
#!/usr/bin/expect -f
set password Mayy@029Mayy@029
# now connect using ssh
spawn ssh -t [email protected] "'export PS1='bvdev@429[\w]#'; exec bash -l"
expect "*?assword:*"
send -- "$password\r"
send -- "\r"
interact
执行上述脚本时出现错误。Inavalid command name w while executing \w
。
我不确定我是否以正确的方式接近它?我的脚本适合这项任务吗?请帮我
答案1
因为expect是Tcl的扩展,所以我们必须了解Tcl的语法规则
spawn ssh -t [email protected] "'export PS1='bvdev@429[\w]#'; exec bash -l"
在双引号内,Tcl 使用方括号作为命令替换机制。此外,反斜杠的作用是:\w
不是特殊字符(如\t
is)。
您需要使用 Tcl 的非插值引用机制(如 shell 的单引号),即大括号
spawn ssh -t [email protected] {export PS1='bvdev@429[\w]#'; exec bash -l}
然而,bash -l
将处理用户的点文件,因此您设置的导出 PS1 很可能会被忽略。
spawn ssh -t [email protected] {
export PS1='bvdev@429[\w]#'
exec bash --noprofile --norc -i
}
然而(再次),我不会那样做。我会在登录后发送所需的 PS1
spawn ssh -t [email protected]
expect "*?assword:*"
send -- "$password\r"
send -- "\r"
send -- {PS1='bvdev@429[\w]#'}
send -- "\r"
interact