假如有100台服务器,每次都用ssh输入用户名密码的方式登录,这样输入用户名密码就成为一件繁重的工作。

这时候,可以考虑利用主服务器的公钥在各个服务器间登录,避免输入密码。接下来是具体的操作步骤:

生成公私钥对

首先,需要在主服务器上用ssh-keygen生成一个公私钥对,然后把公钥写入需要管理的每一台机器的authorized_keys文件中。如下图所示:我们使用ssh-keygen主服务器中生成公私钥对。

  • 使用mkdir -p创建~/.ssh目录,-p的优势是当目录不存在时,才需要创建,且不会报错。
  • cd切换到.ssh目录,然后执行ssh-keygen。这样会在~/.ssh目录中生成两个文件,id_rsa.pub公钥文件和is_rsa私钥文件。

可以看到id_rsa.pub文件中是加密的字符串,我们可以把这些字符串拷贝到其他机器对应用户的~/.ssh/authorized_keys文件中,当ssh登录其他机器的时候,就不用重新输入密码了。

分发公钥

我们已经在主服务器生成了公私钥,接下来就需要将公钥分发到其他服务器。这个传播公钥的能力,可以用一个shell脚本执行,这里我用transfer_key.sh实现。

首先我们先写一个foreach.sh脚本来批量执行,并写一个transfer_key.sh配合foreach.sh的工作。

foreach.sh

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/bash

readarray -t ips < iplist

for ip in ${ips[@]}

do

sh ./transfer_key.sh $ip

done

tranfer_key.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#注意:“=”左右两边不能有空格
ip=$1

pubkey=$(cat ~/.ssh/id_rsa.pub)

echo "login ... $ip"

ssh lagou@$ip "

sudo mkdir -p ~/.ssh

sudo echo $pubkey >> ~/.ssh/authorized_keys

sudo chmod 700 ~/.ssh

sudo chmod 600 ~/.ssh/authorized_keys

"
  • foreach.sh中我们执行 transfer_key.sh,并且将 IP 地址通过参数传递过去。
  • 在 transfer_key.sh 中,用$1读出 IP 地址参数, 再将公钥写入变量pubkey,然后登录到对应的服务器,执行多行指令。
  • mkdir指令检查.ssh目录,如不存在就创建这个目录。最后我们将公钥追加写入目标机器的~/.ssh/authorized_keys中。

chmod 700chmod 600是因为某些特定的linux版本需要.ssh的目录为可读写执行,authorized_keys文件的权限为只可读写。而为了保证安全性,组用户、所有用户都不可以访问这个文件。

给两个文件赋予可执行权限chmod +x,执行foreach.sh需要输入两次密码。

完成上述操作后,我们再登录这两台服务器就不需要输入密码了。我们来尝试一下:

大功告成 ^ - ^