混合远程期望脚本和本地bash命令的最佳方法是什么?

时间:2015-05-20 21:56:19

标签: linux bash expect

我在本地和远程计算机上(防火墙后面)自动执行任务。完成远程计算机上的任务后,我希望脚本返回到本地计算机上执行命令。

#!/usr/bin/expect -f
set timeout -1
spawn ssh username@host
expect "Password: "
send "mypassword\r"
expect "username@host:~$"
...do some stuff...
send "exit\r"
expect eof

[then, once on the local machine, change directories and do other things]

附加bash命令的最佳方法是什么?我想我可以从bash开始,在其中调用expect,然后只要期望完成就返回bash。

3 个答案:

答案 0 :(得分:0)

Expect基于Tcl,因此它可以运行相同的命令。但如果您的目标是运行 bash 命令,最好的办法就是将它们作为单独的脚本从bash运行,就像您在上一句中提出的那样。

答案 1 :(得分:0)

这实际上取决于您对...do some stuff...的看法。这是我最近从OSX w / s到AWS实例的一个例子

 export all_status
 init_scripts=($(ssh -q me@somehost 'ls /etc/init.d'))
 for this_init in ${init_scripts[@]};do
    all_status="${all_status}"$'\n\n'"${this_init}"$'\n'"$(ssh -q somehost \'sudo /etc/init.d/${this_init} status\')"
 done
 echo "$all_status" > ~/somehost_StatusReport.txt
 unset all_status

ssh命令末尾传递命令将导致命令在远程主机上运行。或者您可以scp远程主机的脚本并使用

运行它
 ssh somehost '/home/me/myscript'

答案 2 :(得分:0)

我最近也遇到了这种情况。我创建了一个shell supexpect.sh,它可以自动登录并执行命令。它将在最后返回到本地shell。

#!/usr/bin/expect
#Usage:supexpect <host ip> <ssh username> <ssh password> <commands>
set timeout 60
spawn ssh [lindex $argv 1]@[lindex $argv 0] [lindex $argv 3]
expect "yes/no" {
    send "yes\r"
    expect "*?assword" { send "[lindex $argv 2]\r" }
    } "*?assword" { send "[lindex $argv 2]\r" }
send "exit\r"
expect eof

执行:

./supexpect.sh 10.89.114.132 username password "ls -a;pwd;your_stuff_on_remote_host"

注意: 提示可能需要适应您自己的系统,当然您需要将执行权限传递给它。