use-expect-to-ssh-and-solve-a-problem

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

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

脚本

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 "[email protected]:*" # 远程主机名 pc

send "clear\r" # 清屏

interact # 退出脚本,控制交给用户
1
2
3
4
5
vim ~/.bashrc

# 添加一个别名

alias as='/path/auto_ssh.sh'

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

但是我不得不忍受下面的情形:

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

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

解决

使用下面的脚本代替:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/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 "[email protected]:*"

send "clear\r"

interact

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

参考文档1文档2文档3

---------本文结束感谢阅读---------
Title - Artist
0:00