您的位置:首页 > 其它

SSH实现无密码自动登陆

2015-07-14 19:54 489 查看
SSH广泛用于脚本自动化。借助SSH,我们可以在远程主机上执行命令并读取输出。SSH使用用户名和密码进行认证。在SSH命令的执行过程中提示输入密码。但是在自动化脚本中,SSH命令可能在一个循环中执行上百次,每次都得提供密码的话,显然不实际。因此,我们需要将登入过程自动化。SSH就包含了一个内建的特性,可以用SSH密钥实现自动登陆。这则攻略描述了如何创建SSH密钥并协助实现自动登陆。

    SSH采用基于公钥和基于私钥的加密技术进行自动化认证。认证密钥包含两部分:一个公钥和一个私钥。我们可以通过“ssh-keygen”命令创建认证密钥。要想实现自动化认证,公钥必须放置在服务器中(将其加入文件~/.ssh/authorized_keys),与公钥对应的私钥应该放入你用来登录的客户机的~/.ssh目录中。另一些与SSH相关的配置信息(例如,authorized_keys文件的路径与名称)可以通过修改文件/etc/ssh/sshd_config进行配置。

    设置SSH自动化认证步骤:

        1. 创建SSH密钥,这需要登录到远程主机

        2. 将生成的密钥传输到远程主机,并将其加入文件~/.ssh/authorized_keys中

    要创建SSH密钥,输入命令ssh-keygen,并规定加密算法类型为RSA:

点击(此处)折叠或打开

    renzo@renzo:/home/renzo> ssh-keygen -t rsa

    Generating public/private rsa key pair.

    Enter file in which to save the key (/home/renzo/.ssh/id_rsa): /home/renzo/.ssh/id_rsa

    Created directory '/home/renzo/.ssh'.

    Enter passphrase (empty for no passphrase):

    Enter same passphrase again:

    Your identification has been saved in /home/renzo/.ssh/id_rsa.

    Your public key has been saved in /home/renzo/.ssh/id_rsa.pub.

    The key fingerprint is:

    cc:5d:af:7b:8b:20:08:67:6a:71:79:9d:54:6c:31:78 renzo@renzo

    The key's randomart image is:

    +--[ RSA 2048]----+

    |           o+.   |

    |          ..E.   |

    |          .o.    |

    |       + + o .   |

    |    o = S +   .  |

    |     B o     .   |

    |    o . . . .    |

    |   .     . . o.  |

    |            o... |

    +-----------------+

    这时会提示输入一个口令来生。成一对公钥和私钥。如果不输入口令的话,也可以生成密钥,但是这种做法是一种不安全的行为。我们可以编写监控脚本,利用自动登录来登入多台主机。对于这种情况,在运行ssh-keygen命令时,不要填入口令,这样就能够避免在脚本运行时向你索要口令了。

    现在~/.ssh/id_rsa.pub和~/.ssh/id_ras已经生成了。id_rsa.pub是生成的公钥,id_ras是生成的私钥。公钥必须添加到远程服务器~/.ssh/authorized_keys文件中,这台服务器也就是我们想从当前主机自动登入的那台服务器。

    要添加一个密钥,可以使用:

    $ ssh USER@REMOTE_HOST "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub

上面的命令要设定登录密码。

    这样一来,自动登录就设置好了。从现在开始,SSH在运行过程中就不会再提示输入密码,完成自动登录了。

在编写脚本之前,请先安装yum install expect -y

 1.编写服务器免交互生成公钥、私钥

[lx888@C ~]$ vim ssh-keygen.exp

#!/usr/bin/expect

#set enter "\n"

spawn ssh-keygen -t dsa

expect {

        "*(/home/lx888/.ssh/id_dsa)" {send "\n\r";exp_continue}

        "*(empty for no passphrase)" {send "\n\r";exp_continue}

        "*again" {send "\n\r"}

}

expect eof

2.编写批量分发公钥到各个服务器,并免密钥认证

[lx888@C ~]$ vim fenfa_sshkey.sh

#!/bin/sh

expect ssh-keygen.exp &>/dev/null

. /etc/init.d/functions

for ip in 132 133

do

 #expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.59.$ip  >/dev/null 2>&1

 expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.59.$ip &>/dev/null

 if [ $? -eq 0 ];then

    action "192.168.59.$ip" /bin/true

 else

    action "192.168.59.$ip" /bin/false

 fi

done

[lx888@C ~]$ vim fenfa_sshkey.exp

#!/usr/bin/expect

if { $argc != 2 } {

 send_user "usage: expect fenfa_sshkey.exp file host\n"

 exit

}

#define var

set file [lindex $argv 0]

set host [lindex $argv 1]

set password "123456"

#spawn scp /etc/hosts root@10.0.0.142:/etc/hosts

#spawn scp -P52113 $file oldboy@$host:$dir

#spawn ssh-copy-id -i  $file "-p 52113 oldboy@$host"

spawn ssh-copy-id -i  $file "-p 22 lx888@$host"

expect {

        "yes/no"    {send "yes\r";exp_continue}

        "*password" {send "$password\r"}

}

expect eof

#########################################

ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2201 root@127.0.0.1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: