您可以在bash中运行一半脚本,而在期望中运行另一半

时间:2019-05-17 09:51:29

标签: bash ssh sftp expect

我正在尝试使脚本自动进行ssh登录并为文件中保存的多个IP地址下载文件,即时通讯使用undefined,问题是cat函数在预期中起作用,所以我无法在可解释为期望的脚本上使用它。 我想知道是否有可能使脚本的一半由bash解释,另一半由期望这样的解释

for i in $(cat /dir/file)

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

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

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

1 个答案:

答案 0 :(得分:3)

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,“已连接到服务器”等)。

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