ssh原理及管理机分发公钥方法

ssh原理:在SSH安全协议的原理中, 是一种非对称加密与对称加密算法的结合。

ssh登录有2种方法:账号密码登录和公钥登录。

1.帐号密码登录,没办法公证,不像https有CA证书公证。

image.png

1.服务端收到登录请求后,首先互换公钥。

2.客户端用服务端的公钥加密账号密码并发送

3.服务端用自己的秘钥解密后得到账号密码,然后进行验证

4.服务端用客户端的公钥加密验证结果并返回

5.客户端用自己的秘钥解密后得到验证结果


2.ssh免密码登录,利用公钥登录

image.png

步骤:

1.客户端用户必须手动地将自己的公钥添加到服务器一个名叫authorized_keys的文件里,顾名思义,这个文件保存了所有可以远程登录的机器的公钥。

2.客户端发起登录请求,并且发送一个自己公钥的指纹(具有唯一性,但不是公钥)

3.服务端根据指纹检测此公钥是否保存在authorized_keys中

4.若存在,服务端便生成一段随机字符串,然后利用客户端公钥加密并返回

5.客户端收到后用自己的私钥解密,再利用服务端公钥加密后发回

6.服务端收到后用自己的私钥解密,如果为同一字符串,则验证通过


分发密钥方法:

1.使用ssh分发

[root@Management-Machine-140 ~]# ssh-keygen -t dsa -P '指定密码' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@Management-Machine-140 ~]# /usr/bin/ssh-copy-id  -i .ssh/id_dsa.pub user@IP
测试
[root@Management-Machine-140 ~]# ssh [email protected]
Last login: Wed Nov  7 14:29:38 2018 from 192.168.146.140
[root@WebA-136 ~]#

注意:密钥是针对用户的,可以使用其他用户创建密钥,在被管理机器上也需要有相同的用户。

ssh-keygen命令:

man ssh-keygen:authentication key generation, management and conversion 密钥生成、管理、转换
选项:
-t type:指定密钥类型,包括“dsa”, “ecdsa” or “rsa”
-p(小) :更改私钥的密码。程序会提示输入私钥的密码以及2次新密码
-P(大):提供私钥的旧密码。
-N:提供私钥的新密码
-f :指定密钥文件的文件名
-b:指定密钥长度
-e:读取openssh的私钥或者公钥文件

ssh-copy-id命令:

man ssh-copy-id :install your public key in a remote machine’s authorized_keys 安装公钥到远程机器的authorized keys.
语法:ssh-copy-id [-i [identity_file]] [user@]machine
选项:-i 指定要分发的公钥

2.使用expect解决交互式分发

expect脚本中常见命令:spawn, expect, send, interact...

spawn打开一个进程

expect该命令从进程接受字符串,如果接受的字符串和期待的字符串不匹配,则一直阻塞,直到匹配上或者等待超时才继续往下执行

send向进程发送字符串,与手动输入内容等效,通常字符串需要以’\r’结尾

expect{"匹配字符" send {"需要发送的"} 
"匹配字符"send{"需要发送的字符"}}
或者
expect "匹配字符" 
send "发送字符\r"

interact该命令将控制权交给控制台,之后就可以进行人工操作了。通常用于使用脚本进行自动化登录之后再手动执行某些命令。如果脚本中没有这一条语句,脚本执行完将自动退出。

set timeout 30 设置超时时间timeout为30s,expect命令阻塞超时时会自动往下继续执行。将timeout配置为-1时表示expect一直阻塞直到与期待的字符串匹配上才继续往下执行。超时时间timeout默认为10s

[lindex $argv n]可以在脚本中使用该命令获取在脚本执行时传入的第n-1个参数。argv为传入的参数,另外argc表示传入参数的个数,n是从0开始,表示第一个参数..n=1表示第二个参数

exp_continue:继续执行下面匹配

\r:linux下的回车,Windows下回车是\r\n

安装

[root@Management-Machine-140 ~]# yum install expect   #安装expect ,需要安装依赖包tcl

独立expect脚本

[root@Management-Machine-140 ~]# cat /server/script/ssh_expect.exp
#!/usr/bin/expect

set timeout 30
set ip [lindex $argv 0]                    #第1个参数,编号是0
set password [lindex $argv 1]              #第2个参数,编号是1  

spawn ssh-copy-id -i /root/.ssh/id_dsa.pub root@$ip
expect {
         "(yes/no)?"  {send "yes\r";exp_continue}
         "password:" {send "$password\r"}
}
expect eof
[root@Management-Machine-140 ~]# expect /server/script/ssh_expect.exp 192.168.146.136 111111    #192是第1个参数,编号是0 111111是第2个参数,编号是1*****
spawn ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
[email protected]'s password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

[root@Management-Machine-140 ~]# ssh [email protected]
Last login: Wed Nov  7 16:46:46 2018 from 192.168.146.140
[root@WebA-136 ~]# logout
Connection to 192.168.146.136 closed.
[root@Management-Machine-140 ~]#

实现自动分发,无需手动输入ip及密码,将expect程序嵌套在shell脚本

[root@Management-Machine-140 ~]# cat /server/script/Auto-fenfa.exp
#!/bin/bash
#Create by 海中小帆船
#Date 2018-11-08
#Functions Auto fenfa miyao
#Version 1.1
key_file='/root/.ssh/id_dsa.pub'
password='Y3^K2&123&'
[ ! -e $key_file ] && ssh-keygen -t dsa -P '' -f /root/.ssh/id_dsa > /dev/null 2>&1

for ip in {136..139}
do
/usr/bin/expect << EOF > /dev/null 2>&1
spawn ssh-copy-id -i $key_file "-p22 [email protected].$ip"
expect {
        "yes/no" {send "yes\r";exp_continue}
        "password" {send "$password\r"}
}
expect eof
EOF
if [ $? -eq 0 ]
        then
echo "192.168.146.$ip 密钥分发完成"
        else
echo "192.168.146.$ip 密钥分发失败"
fi
done
[root@Management-Machine-140 ~]# sh /server/script/Auto-fenfa.exp
192.168.146.136 密钥分发完成
192.168.146.137 密钥分发完成
192.168.146.138 密钥分发完成
192.168.146.139 密钥分发完成

创建密钥、分发密钥、批量上传脚本、批量执行脚本

[root@Management-Machine-140 script]# cat Q-auto-bushu.sh
#!/bin/bash
#Create By QQ
#Date ***
#Functions ****
#Version 1.1
#########################1.创建密钥##################
. /etc/init.d/functions
[ ! -e "/root/.ssh/id_dsa.pub" ] && ssh-keygen -t dsa -P '' -f /root/.ssh/id_dsa >/dev/null 2>&1
if [ $? -eq 0 ];then
        action "创建密钥成功" /bin/true
else
        action "创建密钥失败" /bin/false
        exit 0
fi

######################2.分发密钥####################
for ip in 192.168.146.{136..139}
do
/usr/bin/expect << EOF > /dev/null 2>&1
spawn ssh-copy-id -i /root/.ssh/id_dsa.pub "-p22 $ip"
expect {
        "yes/no" {send "yes\r";exp_continue}
        "password" {send "111111\r"}
}
expect eof
EOF
if [ $? -eq 0 ];then
        action "$ip分发密钥完成" /bin/true
else
        action "$ip分发密钥失败" /bin/false
fi
done
#######################3.发送安装脚本###############
for i in 192.168.146.{136..139}
do
 scp /server/script/install_man.sh root@$i:/server/script/
 if [ $? -eq 0 ];then
        action "$i发送安装脚本成功" /bin/true
 else
        action "$i发送安装脚本失败" /bin/false
 fi
done
######################4.远程安装脚本################
for n in 192.168.146.{136..139}
do
 ssh root@$n /bin/bash /server/script/install_man.sh
 if [ $? -eq 0 ];then
                action "$n安装man完成" /bin/true
        else
                action "$n安装man失败" /bin/false
 fi
done
[root@Management-Machine-140 script]#

测试结果

[root@Management-Machine-140 script]# sh Q-auto-bushu.sh
创建密钥成功                                         [  OK  ]
192.168.146.136分发密钥完成                                 [  OK  ]
192.168.146.137分发密钥完成                                 [  OK  ]
192.168.146.138分发密钥完成                                 [  OK  ]
192.168.146.139分发密钥完成                                 [  OK  ]
192.168.146.136发送安装脚本成功                                 [  OK  ]
192.168.146.137发送安装脚本成功                                 [  OK  ]
192.168.146.138发送安装脚本成功                                 [  OK  ]
192.168.146.139发送安装脚本成功                                 [  OK  ]
192.168.146.136安装man完成                                 [  OK  ]
192.168.146.137安装man完成                                 [  OK  ]
192.168.146.138安装man完成                                 [  OK  ]
192.168.146.139安装man完成                                 [  OK  ]
[root@Management-Machine-140 script]#
[root@WebA-136 ~]# which man
/usr/bin/man


猜你喜欢

转载自blog.51cto.com/12107790/2314690
今日推荐