TOC

SSH 相关知识点总结

基础

ssh localhost  # 默认使用当前用户名

ssh root@127.0.0.1

# 指定端口(SSH 默认端口:22)
ssh root@127.0.0.1 -p 19822

密钥

除了密码之外,SSH 还支持通过特殊算法生成的密钥对实现认证(用的更多)。
服务器端拿公钥,客户端拿密钥,然后,我也不知道这个算法是怎么做的,反正...挺好用的。

ssh-keygen 命令

# 按照提示操作
# 如果没有密钥,一路回车就行了
# 会自动创建密钥(~/.ssh/id_rsa)和公钥:(~/.ssh/id_rsa.pub)
ssh-keygen

# 命令中增加所有需要填写的参数,一步完成
# 加密方式:RSA
# 密码:空字符串(即没有密码)
# 注释:9527@markjour.com(这里填写的是个人邮箱地址)
ssh-keygen -t rsa -N '' -C 9527@markjour.com

# 测试密钥对
# 如果匹配就没有输出,不匹配会有一大段输出
diff <( ssh-keygen -y -e -f id_rsa ) <( ssh-keygen -y -e -f id_rsa.pub )

SSH 密钥是可以可以弄一个密码的,如果设置了密码,那么每次使用这个密钥都需要输入密码。
注意:不是对方机器的密码,而是这个密钥本身的密码。

似乎工作到现在,从来没有用过,也没有看到别人用过,这个劳什子(密钥密码)。

SSH 指定密钥

ssh root@127.0.0.1 -i ~/.ssh/another_key

ssh-copy-id 命令

配置文件

authorized_keys

SSH 服务在用户登录的时候会检测对应用户主目录下的 ~/.ssh/authorized_keys 文件,如果公钥在里面,就不会要求输入密码。

ssh-copy-id 其实就是将公钥写到指定主机指定用户的 ~/.ssh/authorized_keys 文件。直接写这个文件同样有效,比如:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

这样的话,ssh localhost 就不需要密码了,可以试一下。

config

比如:

  1. 连接某台机器时使用指定用户名,就像是连接 GitHub 的时候使用 git 这个用户名;
  2. 连接某台机器时使用指定端口,很多服务器都修改了 SSH 端口;
  3. 连接某台机器时使用指定密钥文件;
  4. 还有更多好的用法,在以后遇到 “要是 SSH 支持 XXX 就好了” 之类的问题,就来 SSH 的 config 文件里面找找答案吧!
Host *
IdentityFile ~/.ssh/id_rsa
# 保证每 60 秒发一个空包,避免长时间没有操作,服务器那边断开连接
ServerAliveInterval 60

Host 192.168.*
User root

Host 10.1.*
User root

Host git.oschina.net
User git

Host github.com
User git

Host 192.168.64.100
Port 19822

Host vdi
User vagrant
Port 12622
# 下面的几行都是为了在对某一台主机使用相同用户名同时保持多个连接的场景中复用连接
# 创建一个新连接之后,就可以直接复制这个连接(SSH 隧道),ssh 连接速度就能快一点
ControlMaster auto
ControlPath /tmp/ssh-%r@%h:%p
ControlPersist 8h

提示:

  • 不要在研究别人写的一个小工具上花费太多时间和精力(我以前有这样的毛病),多写代码多思考。
  • 需要用到的时候知道去哪里找资料就好。man、谷歌、stackoverflow 都是好帮手。

其他

sshpass

这是一个帮忙输密码的工具,在不方便导入密钥的场景下挺方便的。

sshpass -p 123456 ssh root@192.168.64.100

比如在公司,研发服务器密码都一样,且老重装,ssh-copy-id 相对来说还是不方便,这个时候,sshpass 就好用了。
我定义一个 Shell 函数:

function jj () {
    sshpass -p 123456 ssh root@192.168.$1 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
}

这样的话,jj 64.100 就能自动连接到服务器 192.168.64.11 了,赞吧!

PS:关于 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
按照默认配置,SSH 连接成功之后会将对方主机的一个 “指纹”(按照某种算法搜集的机器码)记录在本地文件 ~/.ssh/known_hosts 中,下一次连接发现指纹不对,那么就怀疑是有人在冒充对方主机,给出提示问是否需要继续连接,就像这样:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
96:a1:4d:28:3d:71:af:74:bf:3e:21:de:4f:b8:5e:f7.
Please contact your system administrator.
Add correct host key in /home/markjour/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/markjour/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/markjour/.ssh/known_hosts" -R 192.168.65.3
RSA host key for 192.168.65.3 has changed and you have requested strict checking.
Host key verification failed.

我们的研发服务器经常重装,“指纹”当然也随之更换,我不想看到这个提示,所以加了这两个参数,意思是,对于这个连接,不检查也不记录机器指纹。

参考