但是在使用SSH调用时,每次被访问服务器都要求提供用户名和密码。这对于程序调用来说过于烦琐,也不利于程序控制的调用。
有什么办法在使用SSH时不用每次都输入用户名和密码呢?
先来看SSH的安全认证机制(摘自《维基百科》http://zh.wikipedia.org/wiki/SSH)
在客户端来看,SSH提供两种级别的安全验证。
- 第一种级别(基于密码的安全验证),知道帐号和密码,就可以登录到远程主机,并且所有传输的数据都会被加密。但是,可能会有别的服务器在冒充真正的服务器,无法避免被“中间人”攻击。
- 第二种级别(基于密匙的安全验证),需要依靠密匙,也就是你必须为自己创建一对密匙,并把公有密匙放在需要访问的服务器上。客户端软件会向服务器 发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器的用户根目录下寻找你的公有密匙,然后把它和你发送过来的公有密匙进行比 较。如果两个密匙一致,服务器就用公有密匙加密“质询”(challenge)并把它发送给客户端软件。从而避免被“中间人”攻击。
在服务器端,SSH也提供安全验证。 在第一种方案中,主机将自己的公用密钥分发给相关的客户端,客户端在访问主机时则使用该主机的公开密钥来加密数据,主机则使用自己的私有密钥来解密数据, 从而实现主机密钥认证,确定客户端的可靠身份。 在第二种方案中,存在一个密钥认证中心,所有提供服务的主机都将自己的公开密钥提交给认证中心,而任何作为客户端的主机则只要保存一份认证中心的公开密钥 就可以了。在这种模式下,客户端必须访问认证中心然后才能访问服务器主机。
第二种级别的密钥授权的具体做法为:
1. 在访问服务器上输入命令,生成公钥:
#cd
#ssh-keygen
将在目录"/root/.ssh/"下生成公钥。
2. 复制公钥
#cd /root/.ssh/
#cat id_rsa.pub
复制整个公钥。
3. 在被访问服务器上输入命令,生成密钥:
#cd
#ssh-keygen
#cd /root/.ssh/
#vim authorized_keys2
【Ctrl v】将访问服务器的公钥复制到文尾,保存并退出。
4. 在访问服务器上调用被访问服务器的脚本时将不再需要输入用户名和密码。
ssh -l root 被访问服务器IP地址 /被访问服务器脚本或程序的路径/test.pl