为什么要让两台Linux服务器建立信任关系?
因为需要,当我使用scp
命令从一台服务器上拷贝文件到另一台服务器上,或者从一台服务器上上传文件到另一台服务器上,都需要输入密码,每执行一次scp
命令都需要输入密码,很麻烦,为了解决这个问题,我们让它们建立信任关系,以后就不需要输入密码了。
为了区分两台服务器的身份,分别赋予它们一个叫做本地服务器,一个叫做远程服务器。通常把执行scp
命令的服务器叫做本地服务器,而把另外一台叫做远程服务器。
而让它们建立信任关系使用的是一种被称为“公私钥”的认证方式进行SSH登录。
首先,在本地服务器A(即要执行scp
命令拷贝上传文件的服务器)上执行如下命令,然后一直按回车键,表示不设置证书密码,将在用户的家目录下的.ssh目录下生成两个文件:私钥证书id_rsa
和公钥证书id_rsa.pub
。
ssh-keygen -t rsa
接着在远程服务器B(即只能被拷贝或被上传文件的服务器)执行如下命令把本地服务器A上的id_rsa.pub
公钥证书文件复制到远程服务器B的家目录下的.ssh子目录中:
scp root@192.168.40.90:/root/.ssh/id_rsa.pub /root/.ssh #参数说明: # root@192.168.40.90指的是本地服务器A的用户名和IP地址 # :这个冒号是必须的 # /root/.ssh/id_rsa.pub指的是本地服务器A生成的公钥证书文件 # /root/.ssh指的是远程服务器B目录,将本地服务器A生成的公钥证书文件复制到该目录下 # 下面这段话可忽略 # 注意,这里有点绕,因为按照scp命令的语法来说,root@192.168.40.90:/root/.ssh/id_rsa.pub指的是“远程服务器192.168.40.90”上的/root/.ssh/id_rsa.pub,而/root/.ssh才是“本地服务器”,但这是针对scp命令的两个参数来说的,而这里建立信任关系的远程和本地服务器是针对谁执行scp命令来说的。所以本地和远程服务器只是相对的划分。 # 其实可以不执行下面的scp和mv命令,它们的作用就是将本地服务器A上的id_rsa.pub公钥证书文件复制到远程服务器B上的/roo/.ssh子目录下并且重命名为authorized_keys,我们可以直接把本地服务器A上的id_rsa.pub公钥文件的内容复制下来,然后在远程服务器B上的/root/.ssh子目录下新创建一个名为authorized_keys的文件并且将复制的内容写入进去,这就避免了这里的scp命令的执行,也就不会有本地和远程服务器到底是谁的区分了。
然后在远程服务器B执行如下命令将id_rsa.pub
文件重命名为authorized_keys
。
mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
经过上面两步,我们已经在本地服务器A和远程服务器B之间建立了安全信任关系。
接着我们在本地服务器A进行测试,在本地服务器A执行scp
命令从远程服务器B复制文件,也可以从本地服务器A上传文件到远程服务器B,都不需要输入密码了。
即本地服务器A被远程服务器B信任,本地服务器A可以从远程服务器B上复制文件、上传文件到远程服务器B,但远程服务器B并不被本地服务器A所信任,如果远程服务器B要从本地服务器A复制文件或者上传文件到本地服务器A都需要输入本地服务器A的密码。
上面说的本地服务器A被远程服务器B信任,是把本地服务器A上生成的公钥证书文件id_rsa.pub
放到了远程服务器B的/root/.ssh
目录下并且改名为authorized_keys
。
那么如果想要让远程服务器B被本地服务器A信任,只需要让远程服务器生成公钥证书文件id_rsa.pub
,然后将生成的公钥证书文件放到本地服务器A的/root/.ssh
目录下并且改名为authorized_keys
。
所以如果要本地服务器和远程服务器相互信任,只需要让它们都生成公钥证书文件id_rsa.pub
,然后放到对方的/root/.ssh
目录下并且改名为authorized_keys
。
这样双方互相信任,复制和上传文件都不需要输入密码了。
就不演示具体如何操作了,只是把上面的操作再来一次就可以了。
假设我们有如下5台服务器:
现在需要将五台服务器都发送一样的文件,服务器少我们可以打开FTP工具一个一个的复制粘贴,但如果服务器不止上面五台呢?那么使用FTP工具复制粘贴的方式很麻烦很耗费时间。
所以我们会考虑写一个脚本来解决这个问题,先将待发送的文件复制到其中一台服务器上,然后执行脚本批量(使用循环)把文件依次复制到其他服务器指定位置上。
我们需要先选一台服务器来放置上传的文件,选任何一台都可以,这里就选服务器A吧。然后在服务器A上执行脚本将指定文件复制到其他的服务器上,但是,我们知道如果两台服务器之间没有建立信任关系的话执行scp
命令复制文件就需要输入密码。这里的问题变成了一台对应着多台服务器建立信任关系,也就是如果想要服务器A向服务器B、C、D、E使用scp
命令复制文件而不需要输入密码就要同它们建立信任关系,通过上面我们知道只需要将服务器A生成的公钥证书文件id_rsa.pub
放到服务器B、C、D、E的/root/.ssh
目录下并且改名为authorized_keys
就可以了。
具体操作很简单:只是由原来的一个服务器变成了多个服务器。在这里服务器A作为了本地服务器,而服务器B、C、D、E都是远程服务器。
如果有多台本地服务器需要向一台远程服务器复制或上传文件,那么该如何建立信任关系呢?
其实也很简单,还是把它们看成一对一就可以了,本地服务器B与远程服务器A建立信任关系、本地服务器C与远程服务器A建立信任关系、本地服务器D与远程服务器A建立信任关系、本地服务器E与远程服务器A建立信任关系。
即在本地服务器B生成公钥证书文件id_rsa.pub
然后放到远程服务器A的/root/.ssh
目录下并且改名为authorized_keys
,这样本地服务器B和远程服务器A就建立了信任关系;接着本地服务器C也生成公钥证书文件id_rsa.pub
,但是是在远程服务器A的/root/.ssh
目录下的authorized_keys
文件的最后一行添上本地服务器C的公钥证书文件内容,因为服务器A的/root/.ssh
目录下的authorized_keys
文件已经存在,已经同本地服务器B建立了信任关系,如果想要建立新的信任关系必须在authorized_keys
文件的最后一行上添加上服务器C的公钥证书文件内容,因为不可能把原有的给覆盖删除掉,同样服务器D、E也是如此操作。
authorized_key
文件是可以添加多条公钥证书文件内容的,每一行都是一条。
就是多台本地服务器和多台远程服务器相互把对方的公钥证书文件id_rsa.pub
内容添加到自己的/root/.ssh
目录下的authorized_keys
文件中,这样双方都相互信任了。
id_rsa.pub
内容添加到自己的/root/.ssh
目录下的authorized_keys
文件中。scp
等命令而不需要输入密码所做的事情,也就是做这些的目的就是为了在执行scp
等命令时不需要输入对方服务器的密码。