"ssh 的无密码登陆"


无密码登陆

公钥就是锁,私钥就是钥匙。我们可以生成一对钥匙和锁,然后把给服务器上锁,把钥匙留着笔记本上,然后就可以无密码登陆了。

生成钥匙和锁

% ls -l ~/.ssh
total 0
% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/wcy123/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/wcy123/.ssh/id_rsa.
Your public key has been saved in /home/wcy123/.ssh/id_rsa.pub.
The key fingerprint is:
2b:03:51:b3:86:8c:44:9a:49:fe:ee:ff:0f:ef:77:d6 wcy123@hostname
The key's randomart image is:
+--[ RSA 2048]----+
| oo   o          |
|o= o o o         |
|+.. + o          |
|  .  o           |
|   ..   S        |
|  .  .   .       |
|   .  o..     .  |
|  .    oo  . o E |
|   .....o+. o    |
+-----------------+
% ls -l ~/.ssh                                                                                                   1 ↵
total 16
-rw------- 1 wcy123 ubuntu 1679 Apr  8 09:44 id_rsa
-rw-r--r-- 1 wcy123 ubuntu  396 Apr  8 09:44 id_rsa.pub

上面是在 linux 的笔记本上, windows 上的 putty 或者其他工具也是类似的。

id_rsa 是钥匙, id_rsa.pub 是锁。

给服务器上锁

% cat ~/.ssh/id_rsa.pub | ssh wangchunye@10.10.0.102 'chmod +w $HOME/.ssh/authorized_keys ; tee -a $HOME/.ssh/authorized_keys ; chmod 600 $HOME/.ssh/authorized_keys'
wangchunye@10.10.0.102's password:
chmod: cannot access '/home/wangchunye/.ssh/authorized_keys': No such file or directory
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIPBvlQ0sfpPFmSsgi2odj/dS9GlaiYCXZOKKm9R2t4RpxWbQafUR7OmcGbNdJNBUyrauEKaH3v1Incaz//PAJ9zalABqBPwc7qzWZfwDYQ3ojsbQMO/mherkI5ZSMYhbnQCAt0k1KqDbZnmS6icAarXpVAvY1nHVWpya/FuepTFp/fPpoq3VN3BlBeX9F4KpeO5V329dKzZs3CCez5q7Woltdr4pwz6BHW8ddoBuQlueKrRru/86rAQxz/CYG5F0QgtTEqoyIcWHVpf01BayeB3vSnKH0URFkBrRTBbY0880XVa5U0skrYc7/tDUG/fIXdjvX8iIDMQGz3RnqtCp1 wangchunye@wangchunye.local

这个命令看起来有些复杂,有些机器上有 ssh-copy-id 可以完成一样的功能。

% ssh-copy-id wangchunye@10.10.0.102

每次 ssh-agent 是本地的一个守护进程,他记录了本地的钥匙。ssh-add 用于添加删除这些钥匙

% ssh-agent
....

%

这样登陆主机就不用密码了。

随身带着钥匙

假设你配置好了笔记本 N, 然后登陆主机 A ,不用密码了,很好。然后从 A 登陆 B ,这个时候你还是需要输入密码。

你可以把 ~/.ssh/id_rsa 也就是你的钥匙,拷贝到主机 A 的 HOME 目录下,但是,这样明显有问题。主机 A 上的管理员账号 root 可以看你的钥匙,偷你的钥匙。

有一个简单的办法

ssh -A hostA

-A 这样登陆 hostA 之后,再登陆其他主机,就不用再次输入密码了,因为 hostB 会问 hostA 上的 ssh 进程,钥匙是啥,ssh 进程再问笔记本上的 ssh-agent 进程,钥匙是啥。ssh-add 已经加进去了钥匙,在你安全的笔记本上。所以这个办法很好。

tmux

我们都知道 tmux 是一个好东西。 配合使用 tmux attach 的时候,上面wangchunye@wangchunye:~ » ssh-agent SSH_AUTH_SOCK=/var/folders/_g/t1l2srf912b7yg4qnw8k5jr00000gn/T//ssh-CS0a1Qh3satx/agent.95237; export SSH_AUTH_SOCK; SSH_AGENT_PID=95238; export SSH_AGENT_PID; echo Agent pid 95238;的连续穿梭的办法就有问题了。第一次在 hostA 上创建 tmux 会话的时候,可以不用密码穿梭到 hostB 上,然后我们 tmux attach 重新连接的时候,就还需要输入密码了,原因是进程不能共享一些环境变量。下面的方法可以搞定这个问题。

stackoverflow

#!/bin/sh
SSHVARS="SSH_CLIENT SSH_TTY SSH_AUTH_SOCK SSH_CONNECTION DISPLAY"

for var in ${SSHVARS} ; do
  echo "export $var=\"$(eval echo '$'$var)\""
done 1>$HOME/.ssh/latestagent

tmux attach 之后,运行下面的命令就可以继续无密码穿梭了。

source  ~/.ssh/saveagent

这个命令很长,可以把这个放到 ~/.bashrc

alias s='source ~/.ssh/saveagent'

然后,打一个 s 就可以继续穿梭了。