【问题标题】:can you run half a script in bash and the other half in expect你能在 bash 中运行一半脚本,另一半在期望中运行吗
【发布时间】:2019-10-04 15:18:54
【问题描述】:

我正在尝试制作一个脚本来自动 ssh 登录和下载保存在一个文件中的多个 IP 地址的文件,我使用的是 for i in $(cat /dir/file),问题是 cat 函数正在预期中工作,所以我无法使用它在用期望解释的脚本上。 我想知道是否有可能让 bash 解释一半脚本,而期望像这样解释另一半脚本

#!/bin/bash
code........
#!/usr/bin/expect
code........

我的代码现在看起来像这样

#!/bin/bash
expect <<-EOF
    spawn sftp user@server
    expect "*password:" { send "password\r" }
    expect "*" { send "get /home/file\r" } 
    expect "*" { send "bye\r" }
EOF

我现在收到此回复

spawn sftp user@server
user@server´s password: user@hostname: /home/user

基本上恢复到正常的终端状态

【问题讨论】:

  • 看看sexpect (Expect for Shells),您可以使用它来编写仅使用shell代码Expect脚本。
  • 技术答案 - 不。实用答案 - bash 可以调用 expect,所以可以肯定。请参阅下面的 Bayou 解决方案。
  • 对于 shell heredocs,不得使用前导空格作为 heredoc 终止符:删除 "EOF" 之前的空格

标签: bash ssh sftp expect


【解决方案1】:

Heredoc 可能是您的解决方案。我之前没有使用过expect,所以它可能看起来有点错误,但是下面的脚本可以工作:

#!/bin/bash

USER=user
SERVER=server
read -sp "password: " PASSWORD

expect <<-EOF
        spawn ssh ${USER}@${SERVER}
        expect "*: "
        send "${PASSWORD}\r"
        expect "*$ "
        send "ls\r"
        expect "*$ "
        send "exit\r"
EOF
exit $?

这里的关键字是&lt;&lt;-EOFEOF。中间的代码由expect执行。

编辑: 请注意,sftp 仅在您期望 *&gt; 时有效。字符串* 太宽,导致expect 对过早的文本做出反应(例如motd、“已连接到服务器。”等)。

#!/bin/bash

USER=user
SERVER=server
read -sp "password: " PASSWORD

expect <<-EOF
        spawn sftp ${USER}@${SERVER}
        expect "* " { send "${PASSWORD}\r" }
        expect "*> " { send "get derp\r" }
        expect "*> " { send "bye\r" }
EOF
exit $?

【讨论】:

  • 这是在做一些奇怪的事情,我很确定这里的文档正在将发送命令写入我的终端,而不是让它们被期望解释。例如,如果在 spawn 之后的行中,如果我输入 expect "*" { send "${PASSWORD}\r } ,它只会将我的密码打印到终端,所以它看起来像这个 spawn ssh user@${server} ; $ PASSWORD ,如果我有它/期望 "password:" / ,它只是将 spawn 函数写入我的终端,但实际上并没有执行它
  • 我已经在我的 Debian 9 笔记本电脑上使用 Bash 4.4.12 测试了该脚本。当您一对一地复制脚本时,它对您有用吗?也许如果你用你的代码更新问题,我可以看到有什么问题:-)
  • 请注意这一关键信息:使用&lt;&lt;-EOF 时,“EOF”终止符的任何前导空格必须Tab 字符。在这种情况下,“EOF”没有前导空格,但“
  • 正如 &Glenn 正确注意到的那样,“EOF”应该位于行首。删除“EOF”之前的前导空格,我几乎可以肯定你的代码可以工作。但是,“expect”代码可以使用 8 个前导空格或一个制表符。 (几个小时前我已经测试过了,稍后会研究)。
  • 我现在收到了一个不同的奇怪错误,我更新了描述
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2016-01-17
  • 2013-02-25
  • 1970-01-01
相关资源
最近更新 更多