工欲善其事,必先利其器。打造一款好用的终端工具,对于一位yaml
民工来说可谓之锦上添花,增加了不少工作效率,有时候也能让你的心情都好很多。
而目前终端工具层出不穷,比如Windows上倍受欢迎的Xshell
,MacOS上的iterm2
、Tabby
,当然还有其他的一些终端,有部分我自己都没有去使用。
用下来这么多款终端工具,个人认为MacOS上还是这两款最适合我自己。
很多人习惯了Xshell上的会话管理功能,但是iterm2上似乎没有什么很好的方式来配置?
这里我就来介绍一下几种配置方式。让你事半功倍!
一、什么是expect?
expect 是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。它的自动交互流程如下:spawn 启动指定进程 —> expect 获取指定关键字 —> send 向指定程序发送指定字符 —> 执行完成退出。
二、通过expect登录
1)直接通过账号密码登录
- MacOS上新建一个脚本文件:
/usr/local/bin/iterm2Login.sh
,内容如下:
#!/usr/bin/expect
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
set timeout 30
set host [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set pswd [lindex $argv 3]
spawn ssh -o "ServerAliveInterval=30" -o "StrictHostKeyChecking=no" -p $port $user@$host
expect {
"(yes/no)?" {send "yes\n";exp_continue;}
-re "(p|P)ass(word|wd):" {send "$pswd\n"}
}
send "clear\r"
interact
# 给脚本执行权限
chmod + /usr/local/bin/iterm2Login.sh
参数说明:
argv 0
,argv 1
,argv 2
,argv 3
三个参数依次为: ip、端口号、用户名、密码。
- iterm2的配置登录如下:
使用过程中发现,以上直接使用root用户和密码配合expect进行登录的方式,出现一个问题是:登录后敲任何一个命令都hang住,然后按ctrl+c命令就断开了终端连接。如果有了解的小伙伴,欢迎在下方评论。收到评论我也会尝试解决方法。
2)通过本地生成秘钥,将公钥放到远程服务器上直接ssh连接
- 本地生成秘钥,拷贝到远程服务器
# 输完命令后一路回车
ssh-keygen -t rsa
# 拷贝公钥文件到远程服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@remote_ip
# 接着输入一次密码,以后就可以直接ssh命令来登录了
- 在mac上编写一个通用的脚本
❯ cd /usr/local/bin
❯ vi iterm2KeyLogin.sh
#!/usr/bin/expect
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
set timeout 30
set host [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
spawn ssh -p $port -o "StrictHostKeyChecking=no" -o "ServerAliveInterval=30" $user@$host
send "clear\r"
interact
- iterm2配置
3)通过远程服务器的秘钥连接跳板机并切换为root用户
公司一般会有一个跳板机,给你一个普通用户的公钥文件,让你使用公钥文件进行登录。
注意: 这种方式要保证你保存到mac上的公钥文件权限为400,并且.ssh目录的权限为600
假设我这里将秘钥保存在/Users/username/.ssh/
目录下,配置方法如下:
- 编写expect脚本文件
vi LoginSrv1.sh
#!/usr/bin/expect
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
set timeout 30
set host [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
spawn ssh -i /Users/allenjol/.ssh/allenjol -o "ServerAliveInterval=30" -o "StrictHostKeyChecking=no" -p $port $user@$host
expect {
"*$*"
{send "sudo su -\n"}
}
send "clear\r"
interact
- iterm2配置
这里没有截图,配置方式和上面截图类似,这里Login Shell
下面的Send text at start
内容改成:
/usr/local/bin/LoginSrv1.sh 192.168.1.100 22 allenjol
登录服务器后,他会自动执行sudo su -
命令切换到root用户
4)通过秘钥连接跳板机再ssh到其他服务器
如果公司存在一种限制,只允许其他服务器从跳板机ssh连接过去不允许直接登录,甚至只有内网ip,那怎么办?通过跳板机登录呗。那跳板机又是普通用户,你要ssh到其他服务器root用户,就必须先切换到root,在进行ssh,下面我就告诉你怎么来进行配置!
- 编写expect脚本文件
cat /usr/local/bin/keyLogin.sh
#!/usr/bin/expect
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
set timeout 30
set host [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set internalHost [lindex $argv 3]
spawn ssh -i /Users/allenjol/.ssh/Login -o "ServerAliveInterval=30" -o "StrictHostKeyChecking=no" -p $port $user@$host
expect {
"*$*"
{send "sudo su -\n"}
}
expect {
"*#*"
{send "ssh $internalHost\n"}
}
send "clear\r"
interact
- iterm2配置
这里没有截图,配置方式和上面截图类似,这里Login Shell
下面的Send text at start
内容改成:
/usr/local/bin/keyLogin.sh 192.168.1.100 22 allenjol 172.16.18.6
这样就做到了自动化通用脚本。以后出现其他云厂商的机器或者idc机房的机器也可以直接套用这个通用脚本来进行ssh配置。
目前不念这里提出来的几种方案是完全能够解决你平常的问题的。
当然我上面的expect脚本还有进一步的优化空间,欢迎各位前辈指出。
如果各位前辈还有其他更好的方案或者其他更好的终端工具推荐,也欢迎下方评论!