【问题标题】:Two commands or command pipe command - Spawn Expect两个命令或命令管道命令 - Spawn Expect
【发布时间】:2017-06-03 01:53:54
【问题描述】:

我正在尝试在 bash 脚本中执行一个期望脚本,但是当我尝试在没有“| tee -a xxx.log”的情况下执行 shell 时(其中 xxx.log 是一个文件,而不是我想要写入来记录 ssh 会话)。

这段代码运行良好:

comlog="ssh $USR@192.168.228.20"
expect -c"
    spawn \"$comlog\"
    expect \"Password:\"
    send \"$PASS\r\"
    interact
"

但是当我尝试添加“tee -a”命令来保存 ssh 会话时,问题是

invalid command name "ssh"
while executing

这是我获取错误消息的完整命令

 comlog="ssh $USR@192.168.228.20 | tee -a /home/xxx.log"
 expect -c"
    spawn \"$comlog\"
    expect \"Password:\"
    send \"$PASS\r\" #Already Obteined
    interact
 "

我尝试以这种方式更改“comlog”变量,但不起作用:(

 cssh $USR@192.168.228.20 \| tee -a /home/xxx.log

有谁知道另一种保存从expect 开始的ssh 会话的方法?或者我怎样才能在同一个 spawn 命令中发送这两个命令。

【问题讨论】:

标签: linux bash shell ssh expect


【解决方案1】:

您可以通过这种方式捕获期望会话输出:

 comlog="ssh $USR@192.168.228.20"
 expect -c"
    spawn \"$comlog\"
    expect \"Password:\"
    send \"$PASS\r\" #Already Obteined
    interact
 " >/home/xxx.log

【讨论】:

    【解决方案2】:

    如果你想像管道一样放置 shell 元字符,你必须生成一个 shell 来处理它们。使用 here-doc 对引用也有很大帮助

    comlog="ssh $USR@192.168.228.20 | tee -a /home/xxx.log"
    expect <<"END_EXPECT"
    spawn sh -c "$comlog"
    ... rest of expect script
    END_EXPECT
    

    【讨论】:

    • glen_jackman 新错误 :( 执行“END_EXPECT”时命令名称“END_EXPECT”无效
    • 确保 END_EXPECT 行没有多余的空格 - 不要缩进
    • 这是代码(我无法粘贴它) comlog="ssh $USR@192.168.228.20 | tee -a /home/xxx.log" /usr/bin/ expect
    • 我的错误,使用 &lt;&lt; 而不是 &lt;&lt;&lt; -- 有 2 个符号是 here-doc,但有 3 个符号是 here-string,所以我将文字字符串“END_EXPECT”发送为整个期望脚本。我编辑了我的答案
    猜你喜欢
    • 2012-06-18
    • 2016-11-11
    • 2012-09-12
    • 2012-03-19
    • 2016-08-22
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多