"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
重新连接的时候,就还需要输入密码了,原因是进程不能共享一些环境变量。下面的方法可以搞定这个问题。
#!/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
就可以继续穿梭了。