IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

ssh-copy-id帮你建立信任

linux大棚-roclinux.cn 2012-12-18 22:57:48 累计浏览 3,909 次
本机暂存

对于做运维的同学来说,给两台UNIX/Linux机器建立ssh信任关系是再经常不过的事情了。

不知道大家之前建立信任关系是采用什么方法,反正我是纯手工创建。

如果需要“machineA机器的nameA账号”建立到“machineB机器的nameB账号”的ssh信任关系,达到无需输密码即可登陆的目的,那么我一般是这样做的:

1 将machineA机器的/home/nameA/.ssh/id_rsa.pub文件的内容拷贝出来

2 登陆到machineB机器的/home/nameB/.ssh中,如果不存在则创建authorized_keys文件,
将第1步中的内容追加到文件尾部。

3 检查authorized_keys文件的权限,确保其group/other位没有w权限

4 登陆到machineA机器,测试ssh信任关系是否建好

其实上面的添加机器信任关系的方法很不友好,需要全手工操作,而且要两台机器之间来来回回切换,且操作正确性完全由人保证,很容易出现问题和错误。

现在,隆重推出“SSH信任关系自动化建立工具”:ssh-copy-id。(这是一个划时代的时刻,让我学会了使用工具^_^)

【五分钟学会ssh-copy-id】

在不建立ssh信任关系的情况下,从machineA机器的nameA登陆到machineB机器的nameB,可以看出是需要输入密码的:

[nameA@machineA]$ ssh nameB@machineB -p 22000
nameB@machineB's password:

我们现在就用新学到的命令建立信任关系,但是却提示“没有找到标识”,这是因为我们的nameA账号还没有自己的公钥私钥:

[nameA@machineA]$ ssh-copy-id nameB@machineB
/usr/bin/ssh-copy-id: ERROR: No identities found

我们需要现为nameA账号建立自己的公钥私钥,建立好之后,会在/home/nameA/.ssh里多出id_rsa(私钥)和id_rsa.pub(公钥)两个文件:

[nameA@machineA]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nameA/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/nameA/.ssh/id_rsa.
Your public key has been saved in /home/nameA/.ssh/id_rsa.pub.
The key fingerprint is:
bb:3b:14:be:5d:45:ab:72:27:ec:93:21:c6:a3:7d:77 nameA@machineA
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|        .   .    |
|       .X. o .   |
|       .o.  +    |
|       .*+.o     |
|       +++C+o E  |
|      . +C++ .   |
+-----------------+

好了,准备工作就绪,我们开始建立信任关系:

[nameA@machineA]$ ssh-copy-id nameB@machineB
ssh: connect to host machineB port 22: Connection refused

悲剧,新的错误提示又来了,原来我们的B机器的sshd的服务端口不是22,而是22000,但是ssh-copy-id命令却不知道这个信息。这可如何是好。

我们试试加个-p参数设置下端口:

[nameA@machineA]$ ssh-copy-id nameB@machineB -p 22000
ssh: connect to host machineB port 22: Connection refused

还是不好使,-p参数完全没有被ssh-copy-id命令识别。
如果你man ssh-copy-id就可以看到它根本就没有这个选项的。

好吧,不卖关子了,其实解决办法一点也不复杂,只是用了一个小技巧,那就是:

[nameA@machineA]ssh-copy-id "-p 22000 nameB@machineB"
nameB@machineB's password:
[nameB@machineB]

大功告成,终于可以无密码登陆了:

[nameA@machineA]$ ssh nameB@machineB -p 22000
[nameB@machineB]$

其实ssh-copy-id是一个普普通通的脚本文件:

[nameA@machineA]$ which ssh-copy-id
/usr/bin/ssh-copy-id
[nameA@machineA]$ file /usr/bin/ssh-copy-id
/usr/bin/ssh-copy-id: POSIX shell script text executable

如果你有兴趣,可以读一读这个脚本,只有短短50行,不过里面却有不少shell编程技巧可以学习。

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. WEB系统需要关注的一些点 (累计阅读 18,218)
  2. Linux如何统计进程的CPU利用率 (累计阅读 16,307)
  3. 批量添加主机到cacti+nagios的监控报警系统中 (累计阅读 14,990)
  4. 我的 RHCA 之路 (累计阅读 14,012)
  5. Linux内存点滴 用户进程内存空间 (累计阅读 13,228)
  6. 给程序员新手的一些建议 (累计阅读 13,088)
  7. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  8. 关于linux内存free的一些事情 (累计阅读 12,866)
  9. 高效Linux用户需要了解的命令行技能 (累计阅读 12,824)
  10. ps - 按进程消耗内存多少排序 (累计阅读 12,685)