2018年8月14日星期二

iTerm2 免密登录 SSH

Windows 上有 xshell 工具可以做收藏,但是 Mac 配置后可能更加方便和强大,网上有很多这方面的文章,这里自己也记录一下,方便以后查阅。下面介绍 2 种方式:

  1. sshpass
  2. expect

一、使用 sshpass

(1)安装
第一次需要安装 sshpass 执行脚本,这里使用 brew 进行安装。

brew install http://git.io/sshpass.rb

(2)验证

在终端输入 sshpass 如下输出帮助说明即安装正确:

$ sshpass

(3)查看安装路径

where sshpass
# 或者
which sshpass

# 我本地输出如下
/usr/local/bin/sshpass

通过上面的步骤后,下面进行 iTerm2 的相关配置。


(1)基本配置

打开 iTerm2 的设置,然后点击 Profiles,这里的 Profiles 就是我们自己收藏的一些配置,我这里以自己的腾讯云服务器 SSH 登录为例子。配置列表如下:

  • 其中最重要的就是 Command 表示启动 Profiles 时候自动执行的命令,这里我们使用 sshpass 来登录;
  • Name 表示配置的昵称,自己配置即可;
  • Tags 表示对 Profiles 进行分组,我这里设置为 云服务器
  • Badge 表示在 SSH 登录后,在终端的右上角显示登录的服务器ID,这里我设置为 QQ,主要用于标记(先要打开 Profile Name),可看下图。



基本配置就是这些,下面看一下 sshpass 的用法:

/usr/local/bin/sshpass -p <password> ssh -p<port> <username>@<ip>

这里 -p <password> 的方式能够使用 -f 读取配置文件的方式,可以将密码放在一个文件中,这里我建立一个:

touch ~/ssh_pass/qq_pass && echo "mypassword" > qq_pass

然后上面的 Command 配置就变成了:

/usr/local/bin/sshpass -f ~/ssh_pass/qq_pass ssh -p<port> <username>@<ip>

port 一般默认 22。这样就配置完成了,启动的时候就很方便了,直接点击 Profiles 即可登录。

其中 云服务器 就是分组,QQ-yun 就是具体的 Profile,点击即可登录。
也能够点击 Open Profiles 来查看配置列表,然后双击也能够登录,这能自己尝试。

这里要注意的是,第一次登录需要去授权 ssh,可以手动在终端登录一次,如果出现授权问题可以删除 known_hosts,然后重新授权,一般存在于:~/.ssh/known_hosts

二、使用 shell 脚本

上面是使用了别人写的东西,下面介绍一下简单的脚本来实现。这里不会只是使用 shell 执行的方式,会采用 expect,这个工具很实用,能够做终端的自动打包、备份、重启等功能。

(1)安装

brew install expect

(2)查看

# /usr/bin/expect
which expect

(3)实现一个 SSH 登录云服务器,命名为 qq.sh

#!/usr/bin/expect -f

# 设置超时时间,可以设置 -1 永不超时
set timeout 3
# 基本的服务器信息
set password <server_password>
set port 22
set user <your_username>
set ip <your_ip>

# 执行的命令
spawn ssh -p $port $user@$ip
# 交互式输出
expect "$user$ip's password:"
# 模拟输入密码,并且回车登录,这里有一定延迟,也可以手动自己回车
send "$password\r"
# 表示操作完成,用户继续可以交互操作
interact

(4)设置当前 qq.sh 为可执行文件

sudo chmod a+x qq.sh

(5)在终端输入 ./qq.sh 即可自动登录

注:如果提示 spawn 不存在,那么需要理解下 sh 的方式。如果是使用 sh qq.sh 的方式会让 #! 第一行命令声明失效,所以要采用可执行脚本的方式 ./qq.sh

(6)结合 iTerm2 来使用 shell

这个可以结合交互式参数来输入,也可以配置好 shell 过后直接在 Profiles 中的 Command 直接引入该 shell。

其实也有最方便的形式,就是写一个 shell 直接帮忙跑 ssh 即可,不过结合 iTerm2 应该是最方便管理的方式,还有分组、标记等功能。