步骤以及准备
大致步骤可以分为四段,一步一步来:
- 本地,首先为 test_user 生成新的私钥和公钥;
- 本地,将公钥上传到服务器;
- 服务器,编辑 SSH 配置文件;
- 本地,编辑 SHH 相关配置文件,实现快捷登陆
以下笔记里具体会以一个 test_user 的身份记录,可以使用如下命令新建,新建完毕之后断开与服务的连接 by exit 命令,接着再使用 test_user 身份来连接服务器。
第一步:本地,首先为 test_user 生成新的私钥和公钥
首先第一步是在本地为 test_user 生成新的私钥和公钥。
根据终端中的提示,分别填入 passphrase 和保存位置路径: /User/<username>/.ssh/test_user
。这里没有使用默认 id_rsa
作为目标文件名,而是为 test_user 单独建立公钥和私钥。
第二步:本地,将公钥上传到服务器
ssh-copy-id 命令
如果过去也是使用 scp 命令进行公钥文件的上传,完成之后再进行重命名、合并、修改文件及文件夹权限等操作的话,那么 ssh-copy-id 的方法会显得分外简单,一句结束、完成所有需要的操作:
第二条命令是测试链接的操作,测试的时候应该会首先提示输入 passphrase,如果输入完毕之后仍旧提示需要输入密码,可以查看下文中关于配置那一节。
对比过去使用的 scp 命令
笔记开头就提到的使用 scp
命令上传公钥、新建、设置文件文件夹权限的操作在这里也一并记录一下,对比可见 ssh-copy-id 是多简洁高效。
首先需要在本地将 .pub 公钥文件上传到服务器:
接下来,要确保以 test_user 的身份登陆服务器,其次需要判断 .ssh 文件夹是否存在?不存在的时候需要新建,保证 .ssh 文件夹是 700 权限,而 authorized_keys
是 600 权限。如果已经存在则 cat 新的 .pub 到现有的 authorized_keys 之中,同时也需要保证文件、文件夹的对应权限。
第三步:服务器,编辑 SSH 配置文件
到了这一步,可能断开(exit)之后重新登陆没有达到预期的效果,比如以如下方式直接访问远程服务器,除了提示需要输入秘钥的 passphrase 之外,仍然会会提示需要再次输入 test_user 的登录密码,或者每次登陆都提示需要输入秘钥的 passphrase。
这里需要编辑 SSH 的配置文件,因为默认「使用公钥秘钥登陆服务器」的选项 PubkeyAuthentication
可能默认没有开启,而指定具体秘钥位置的 AuthorizedKeysFile
是被注释的状态。两者具体的位置在 /etc/ssh/sshd_config
,使用 nano、vi 等打开编辑,确保前者是开启状态,而后者的位置也指向正确。
第四步:本地,编辑 SSH 相关配置文件,实现快捷登陆
最后的一步是简化登陆步骤,比如说你很多服务器,对应很多 IP,每次需要登陆一个就需要去查一下具体 IP 地址是多少,是不是很烦,这里 ssh 为我们提供了为不同域名(IP)设置别名以致可以快速登陆的办法,牵扯到两个文件:
- 系统全局设置 SSH 的配置文件,路径:
/etc/ssh/ssh_config
和/etc/ssh/sshd_config
; - 用户自定义的 SSH 配置文件,默认没有,但是文件需要被指定在:
~/.ssh/config
。
系统全局的配置文件不需要做改动是加上 这里主要创建、编辑用户自定义文件 ~/.ssh/config
,比如说 test_user 的服务器叫做 example.com 或者直接 IP 地址:12.34.56.78,那么就可以在 ~/.ssh/config
写入如下这样一条规则:
有可能会需要重启 macOS 本地的 ssh 服务来让 config 生效:
这样,在一切配合正确的情况下,以后在终端中输入 ssh ExampleHost
就可以直接登录到远程服务器(第一次会要求输入秘钥的 passphrase)。
参考
关于 macOS 上 ssh-add 和 ssh-agent
寻找解决方案一顿乱查乱试的时候,有成功使用 ssh-add
命令在本地添加秘钥,而得以不需要反复输入 passphrase 的时候,但貌似就成功了一次,后来想起来 Github 有官方的指导说明文档《Connecting to GitHub with SSH》中的这一部分《Adding your SSH key to the ssh-agent》翻了一下才知道 macOS 10.12 需要在配置文件中写入 AddKeysToAgent yes
才能成功将 key 加入 ssh-agent
,后者 UseKeychain yes
则可以在这里调用 macOS 下的 keychain 来记录秘钥的 passphrase。相关的 issue 和 repo:
- 《Mac OS X 10.12: ssh-agent does not automatically load passphrases on the keychain during startu》
- 《Saving SSH keys in macOS Sierra keychain》
其他
- 《SSH Config File》
- 《ssh_config(5) - OpenBSD manual pages》
- 《Best way to use multiple SSH private keys on one client》
- 《What is the best practice: separate ssh-key per host and user VS one ssh-key for all hosts?》
- 《ssh-keygen 中文手册》
- 《7 Default OpenSSH Security Options You Should Change in /etc/ssh/sshd_config》
- 《Permission denied (publickey,password)》
- 《How to avoid being asked passphrase each time I push to Bitbucket》
- 《.ssh/id_rsa failed: permission denied》
- 《Convince apt-get not to use IPv6 method》
- 《SSH原理与运用(一):远程登录》
- 《SSH原理与运用(二):远程操作与端口转发》
- 《Use Public Key Authentication with SSH》
技术发展迭代很快,所以这些笔记内容也有类似新闻的时效性,不免有过时、或者错误的地方,欢迎指正 ^_^。
BEST
Lien(A.K.A 胡椒)