使用 expect 实现一个简单命来使用 ssh 连上远程主机,并解决一个恼火的问题。

正常的远程连接主机的方法是ssh user@ip -p port,根据提示输入密码,很是繁琐。 expect 能过实现交互式的脚本命令。

脚本

expect 一般需要自己额外安装,ubuntu为例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
sudo apt-get install expect

# 创建脚本
vim auto_ssh.sh


#!/usr/bin/expect -f
set timeout 10 # 脚本超时时间
spawn ssh [email protected]
expect "[email protected]'s password: "
send "mypassword\r" # 密码

expect "rachpt@pc:*" # 远程主机名 pc

send "clear\r" # 清屏

interact # 退出脚本,控制交给用户

1
2
3
4
5
vim ~/.bashrc

# 添加一个别名

alias as='/path/auto_ssh.sh'

之前一直用这个脚本,开始时很是爽,只需 as 一下,就自动连接。

但是我不得不忍受下面的情形: use-expect-to-ssh-and-solve-a-problem-1.jpg

连上后如果改变 terminal 大小,远程的大小不会随着变。

后来发现不是我一个人遇到这问题。

解决

使用下面的脚本代替:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/expect -f
#trap sigwinch spawned
trap {
 set rows [stty rows]
 set cols [stty columns]
 stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

set timeout 10
spawn ssh [email protected]
expect "[email protected]'s password: "
send "mypassword\r"

expect "rachpt@pc:*"

send "clear\r"

interact

原因是没有传输窗口改变信号,加一个 trap在前面即可。

参考文档1文档2文档3