Linux 期望没有交互指令的命令不起作用

Linux expect command without interact directive not working

我想从 192.168.119.128 登录到 192.168.119.129 自动和 运行 一些命令,所以我写了一个 expect 脚本。

a.sh

#!/usr/bin/expect -f

set timeout 5
spawn ssh root@192.168.119.129
expect "password" {send "123456\r"}
expect "]#" {send "touch /tmp/a.txt\r"}
#interact

输出为:

kaiwen@kaiwen-virtual-machine:~/Work$ ./a.sh 
spawn ssh root@192.168.119.129
root@192.168.119.129's password: 
Last login: Sun Jan 22 17:36:21 2017 from 192.168.119.128
[root@localhost ~]# kaiwen@kaiwen-virtual-machine:~/Work$

我登录成功了,但是touch /tmp/a.txt命令似乎不是运行。

当我取消注释 a.sh 的最后一行 #interact 时,它起作用了,并且文件 a.txt 被创建了。

#!/usr/bin/expect -f

set timeout 5
spawn ssh root@192.168.119.129
expect "password" {send "123456\r"}
expect "]#" {send "touch /tmp/a.txt\r"}
interact

这是输出:

kaiwen@kaiwen-virtual-machine:~/Work$ ./a.sh 
spawn ssh root@192.168.119.129
root@192.168.119.129's password: 
Last login: Sun Jan 22 17:41:23 2017 from 192.168.119.128
[root@localhost ~]# touch /tmp/a.txt
[root@localhost ~]#

为什么没有 interact 指令脚本工作不正确?谢谢。

如果没有 interact,Expect 脚本将在最后一个命令 expect "]#" 后退出,并且它会终止生成的进程。这就像您在 shell 仍然存在时关闭 SSH 客户端应用程序(如 PuTTY)window 运行。

interact 是一个 long-running 命令,它等待生成的进程退出。