【注意】最后更新于 July 26, 2018,文中内容可能已过时,请谨慎使用。
使用 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 一下,就自动连接。
但是我不得不忍受下面的情形:
连上后如果改变 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。