linux - 期望脚本返回 "missing close-bracket"

标签 linux bash expect

我编写了一个 bash 脚本,它从 API 获取密码并使用“发送”来设置此密码

un=admin
pw=$(get_json_value_from_file "$rsm_res_file" "password")
echo $pw
export HISTIGNORE="expect*";
expect -c "
    spawn ssh -o UserKnownHostsFile=$ap_known_hosts_file -p $PORT  $un@localhost
    expect "*ogin*"
    send \"$un\r\"
    expect "*assword*"
    send \"$pw\r\"
    interact"

它重新调整了以下异常:

  missing close-bracket
while executing "send \"f40T[2[6g%^TsMLv\r\"
    interact"

我认为是特殊字符的问题。

最佳答案

您的密码包含一个具有特殊含义的[ 字符。 Tcl/Expect 中的 [...] 语法是命令替换,就像 `...`$(.. .)Bash 中。要获得文字 [,您必须使用 \[。对于您的场景,最简单的解决方案是使用环境变量将密码从 Bash 传递到 Expect。例如:

PASSWORD=$pw expect -c "
    spawn ssh -o UserKnownHostsFile=$ap_known_hosts_file -p $PORT  $un@localhost
    expect "*ogin*"
    send \"$un\r\"
    expect "*assword*"
    send \$env(PASSWORD)\r
    interact"

export PASSWORD=$pw
expect -c "
    spawn ssh -o UserKnownHostsFile=$ap_known_hosts_file -p $PORT  $un@localhost
    expect "*ogin*"
    send \"$un\r\"
    expect "*assword*"
    send \$env(PASSWORD)\r
    interact"

关于linux - 期望脚本返回 "missing close-bracket",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39994688/

相关文章:

linux - 如何创建一个脚本来检查 ssh 是否正在运行,如果没有则重新启动它

linux tty端口一打开就自发发送数据

linux - 我们可以在多线程进程的 strace 输出中获取线程的线程 ID 吗?

c - 维护一个我不希望 Make 编译的程序列表,我可以使用 >> 和 SED 进行更改,而不是编辑 makefile?

linux - Jenkins 与 Expect 脚本集成

linux - 如何编写一个 shell 脚本来打开四个终端并在每个终端中执行一条命令?

linux - 在 Cron 中连接失败后重新运行 Rsync

string - 如何避免 Tcl 字符串中的命令替换?

linux - Expect 脚本中的 Spawn 无法访问环境变量

linux - 如何直接在终端中更改屏幕单元格的颜色?