SSH

生成公钥与私钥

使用 ssh-keygen 命令生成,默认会保存在 .ssh/ 目录中,生成两个文件,即私钥 id_rsa,公钥 id_rsa.pub

$ ssh-keygen -t  rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
69:65:32:1e:dc:e8:59:1f:72:90:0a:a2:73:cb:07:48 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|          ..     |
|  E . .. o..     |
| . o . .*.* o    |
|  + o  o.X + .   |
|   + o  S   .    |
|    o ..         |
|     .           |
|                 |
|                 |
+-----------------+

用私钥生成公钥

如果公钥丢失,可以用私钥重新生成:

$ ssh-keygen -y -f id_rsa > key.pub

authorized_keys

使用 OpenSSH 时,在服务器端,通常会把授权的公钥放在其默认配置文件 ~/.ssh/authorized_keys 中。

SSH 的配置文件 /etc/ssh/sshd_config 中,AuthorizedKeysFile 指令用于告诉服务器去哪里查找授权的密钥。该选项可以包含不止一个位置,中间用空格分隔。

如何不用密码连接 SSH

使用 keychain 免输入 SSH 密码

参考文章

agent forwarding

SSH 协议会使用 转发客户端 机制,即 agent forwarding。SSH 客户端允许 SSH 服务器 使用其 本地的 ssh-agent 客户端程序,感觉就像该客户端是从服务器本地连接进来的。此时,远端的客户端程序会先与 ssh-agent 通信,服务器与远端客户端的通信都会通过它进行 中转

如要实现转发客户端,必须在客户端的配置中启用 ForwardAgent 选项,同时服务器端也要启用 AllowAgentForwarding 选项。

解决办法
  • 生成私钥和公钥,如 .ssh/id_rsa.ssh/id_rsa.pub
  • 在客户端上,在 /etc/ssh/ssh_config 中配置 ForwardAgent yes
  • 在服务端上,在 /etc/ssh/sshd_config 中配置 PubkeyAuthentication yes,如果需要也可以配置 StrictModes no AllowAgentForwarding yes
  • 安装 keychain,在客户端 ~/.bash_profile 中加入以下内容:
/usr/local/bin/keychain $HOME/.ssh/id_rsa
source $HOME/.keychain/${HOSTNAME}-sh

keychain id_rsa 会生成 .keychain/${HOSTNAME}-sh 文件,其内容为:

SSH_AUTH_SOCK=/tmp/ssh-65d6SFQYJPFs/agent.2093; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2094; export SSH_AGENT_PID;
  • 在 crontab 的脚本中,添加以下内容,即可以免去输入密码的步骤:
source $HOME/.keychain/${HOSTNAME}-sh