我在本地和远程计算机上(防火墙后面)自动执行任务。完成远程计算机上的任务后,我希望脚本返回到本地计算机上执行命令。
#!/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。
答案 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"
注意: 提示可能需要适应您自己的系统,当然您需要将执行权限传递给它。