iterm2使用expect配置快速ssh

工欲善其事,必先利其器。打造一款好用的终端工具,对于一位yaml民工来说可谓之锦上添花,增加了不少工作效率,有时候也能让你的心情都好很多。

而目前终端工具层出不穷,比如Windows上倍受欢迎的Xshell,MacOS上的iterm2Tabby,当然还有其他的一些终端,有部分我自己都没有去使用。

用下来这么多款终端工具,个人认为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 0argv 1argv 2argv 3 三个参数依次为: ip、端口号、用户名、密码。

  • iterm2的配置登录如下:
图片[1]-iterm2使用expect配置快速ssh-不念博客
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配置
图片[2]-iterm2使用expect配置快速ssh-不念博客
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脚本还有进一步的优化空间,欢迎各位前辈指出。

如果各位前辈还有其他更好的方案或者其他更好的终端工具推荐,也欢迎下方评论!

© 版权声明
THE END
喜欢就支持一下吧
点赞96赞赏 分享
评论 抢沙发
头像
欢迎光临不念博客,留下您的想法和建议,祝您有愉快的一天~
提交
头像

昵称

取消
昵称代码图片

    暂无评论内容