通过 ssh 设置 PS1 提示符的正确方法

通过 ssh 设置 PS1 提示符的正确方法

我正在尝试在远程计算机上动态设置 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不是特殊字符(如\tis)。

您需要使用 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

相关内容