背景: 有时候我们在两个主机之间复制文件的时候,提示输入密码,很不方便,那如何免密码复制呢?,就是使用通过linux公钥和秘钥,建立双机信任关系。
在整理之前,我先说下ssh免密码的要点 :
你想免密码登陆到哪个主机哪个用户, 就把你自己的公钥文件内容追加到远程主机对应用户下的authorized_keys文件中即可,对面如果没有,远程复制过去就会自动创建此authorized_keys文件,并将公钥信息存在里边。
第一种方法:
第一步:ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa 先创建秘钥对。
[root@centos7.ssh]#ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
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:
SHA256:4mYhhq/jjhz8I1QWudKRODsR6R1FnxLFFeh1YJ1+YiM root@centos7.localdomain
The key‘s randomart image is:
+---[RSA 2048]----+
| .+ =+o.o=+ . |
| = * ooo. + |
|. * =..o. o |
| = B .. E = . |
| * o o S o + |
|.. o o o |
|.o . + |
|.o+o o |
|.+=o. |
+----[SHA256]-----+
生成的公私钥对在/root/.ssh目录下:文件名分别为id_rsa.pub(公钥)id_rsa(私钥)
第二步:
1、ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.34.101 将客户端的IP公钥传送到服务器端(192.168.34.101) 其中-i是指定自己当前的路径文件
2、或者ssh-copy-id 192.168.34.101 (centos6/7默认会将本地的公钥文件直接复制过去,也不需要指定当前的路径和-i)
第三步:
就进行测试连接服务器端的IP地址,就不需要密码登陆:ssh 192.168.34.101
同理将对方的的公钥复制到本机上,对方连本机也不需要输入密码,只需要输入本机私钥的密码即可。
完成免密登录直接可以在对方机器做操作:
如: ssh 192.168.34.100 useradd wang 在对方机器上创建wang账号
重要:如果远程机器有本机的私钥文件,且本机已对私钥加密,本地想远程多个主机每次都需要输入私钥密码。
我们可以将其进行托管至代理服务即可,两条命令可以解决,但是退出代理之后,下次需要再连接时还需要输入私钥口令。
将私钥加密之后再连接需要输入私钥加密口令,比较麻烦:
ssh 192.168.34.100
输入托管代理命令之后,就不需要再输入私钥加密口令,具体操作如下:
ssh-agent bash
ssh-add
[root@R1 .ssh]# ssh-agent bash
[root@R1 .ssh]# ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
[root@R1 .ssh]# ssh 192.168.34.100
Last login: Tue Oct 22 21:47:24 2019 from 192.168.34.200
[root@centos6~]#
注意:
- 如果远程主机的端口非22端口,需要指定-p port选项。
- ssh-copy-id是由openssh-clients包提供,没有这个命令可以安装这个包。
第二种方法:
1)每个客户端都生成公私钥文件:
ssh-keygen -t rsa -P ‘‘ -f /root/.ssh/id_rsa(注:有几个主机,就在每个主机上执行几次)
2)将所有远程机器的公钥都复制到当前自己的文件下authorized_keys:
机器一进行公钥复制:ssh-copy-id -i /root/.ssh/id_rsa_pub 192.168.34.100(注:该ip为本地地址)
机器二进行公钥复制:ssh-copy-id -i /root/.ssh/id_rsa_pub 192.168.34.100
最后本机将自己的公钥文件也放入到authorized_keys中
ssh-copy-id 192.168.34.100
3)然后将本地的IP地址复制到远程机器上,实现所有的机器都有对方的公钥,也可以进行登录不需要秘钥登录:
ssh-copy-id -i /root/.ssh/authorized 机器一的IP地址
ssh-copy-id -i /root/.ssh/authorized 机器二的IP地址
最终结果:本地机器与其他主机连接一起就会免密,远程主机与本地主机连接也会免密。
实现一个循环创建秘钥对并将公钥传送到对方的脚本:
cat iplist.txt
192.168.34.100
192.168.34.101
192.168.34.102
#!/bin/bash
password=zhangsan
ssh-keygen -t rsa -p "" -f /root/.ssh/id_rsa
while read ip ;do
set timeout 10
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $user@$ip
expect {
"yes/no" {send "yes ";exp_continue }
"password" { send "$password " }
}
expect eof
EOF
done < iplist.txt