你能 运行 一半脚本在 bash 中,另一半在 expect 中吗

can you run half a script in bash and the other half in expect

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

#!/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

基本上return到正常的终端状态

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 $?

这里的关键词是<<-EOFEOF。中间的代码由expect.

执行

编辑: 请注意,sftp 仅在您期望 *> 时有效。字符串 * 太宽泛,导致 expect 对过早的文本做出反应(例如 motd、"Connected to server." 等)。

#!/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 $?