你能 运行 一半脚本在 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 $?
这里的关键词是<<-EOF
和EOF
。中间的代码由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 $?
我正在尝试制作一个脚本来自动执行 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 $?
这里的关键词是<<-EOF
和EOF
。中间的代码由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 $?