SSH实现无密码自动登陆

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值