我正在尝试使脚本自动进行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
基本上可以恢复到正常的终端状态
答案 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 $?
此处的关键字为<<-EOF
和EOF
。介于两者之间的代码由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 $?