如何实现推送公钥脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#交互生成密钥对,需要按3个回车,才会生成密钥对
[root@m01 ~]# ssh-keygen

# 1.免交互生成密钥对,不需要输入回车,直接生成密钥对
[root@m01 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null

我们在使用ssh root@10.0.0.31远程连接时,会让我们交互输入对方主机的密码才可进行连接
# 2.免交输入密码 安装sshpass
[root@m01 ~]# yum install -y sshpass
[root@m01 ~]# sshpass -p 1 ssh root@10.0.0.31
sshpass -p 密码 ssh root@10.0.0.31

#3.第一次远程连接时,需要指纹认证和输入密码,这些都可以使用如下命令做到免交互
[root@m01 ~]# sshpass -p root ssh -o strictHostKeyChecking=no root@10.0.0.31

sshpass -p 密码 ssh -o strictHostKeyChecking=no root@10.0.0.31
-p:指定密码
-o strictHostKeyChecking=no:忽略指纹认证


# 编写脚本
[root@m01 ~]# vim push_public_key.sh
#!/bin/bash
#判断公钥是否存在
if [ ! -f ~/.ssh/id_rsa ]
then
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
fi
for ip in {5,6,7,8,31,41,51,61,71};do
ping -c1 -W1 172.16.1.$ip &>/dev/null
#忽略指纹认证推送公钥
[ $? -eq 0 ] &&\
sshpass -p root ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub root@172.16.1.$ip &>/dev/null &&\
echo "172.16.1.$ip 推送成功..." ||\
echo "172.16.1.$ip 推送失败..."
done




如果脚本里面带密码,为了安全,就可以把文件变成二进制文件
将脚本变成二进制文件(加密文件内容)安装shc
## 将脚本变成二进制文件
[root@m01 ~]# yum install -y shc
[root@m01 ~]# shc -f ip_host.sh

shc -f 文件名
会生成.x .x.c 的文件,把.x的文件进行执行就可以
./文件名 :二进制文件使用./执行

expect免交互语言(了解)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 1.安装expect
[root@m01 ~]# yum install -y expect

#!/usr/bin/expect
set ip 10.0.0.41
set pass root
set timeout 30
spawn ssh root@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
}
expect "root@*" {send "df -h\r"}
expect "root@*" {send "exit\r"}
expect eof


## 循环多台机器
[root@m01 ~]# !vim
vim 1.exp
#!/bin/expect
set pass 1
foreach ip {"7" "8" "31" "41"} {
puts "当前IP地址: $ip"
spawn ssh root@172.16.1.$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
}
expect "root@*" {send "df -h\r"}
expect "root@*" {send "exit\r"}
expect eof
}

-------------------------免交互推送公钥,免指纹认证脚本,一步到位------------------
#!/bin/bash
#创建一个IP地址文件。
>ip.txt
pass=root
#检测expect是否安装,检测公钥是否创建。
rpm -q expect &> /dev/null
if [ $? -ne 0 ] ;then
echo "开始安装expect,请稍等一会..."
yum install -y expect &> /dev/null
echo "expect安装完成"
fi
if [ ! -f ~/.ssh/id_rsa ];then
echo "开始创建密钥对..."
ssh-keygen -P "" -f ~/.ssh/id_rsa &> /dev/null
echo "密钥对创建完成"
fi
#使用for循环ping测试主机是否在线。
for i in {2..254}
do
{
ip=10.0.0.$i
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ];then
echo "$ip" >> ip.txt
/usr/bin/expect <<-EOF
set timeout 10
spawn ssh-copy-id $ip
expect {
"yes/no" { send "yes\r"; exp_continue } &> /dev/null
"password:" { send "$pass\r" } &> /dev/null
}
expect eof
EOF
fi
}&
done
wait
echo "推送公钥和免交互工作已完成,你现在可以直接远程登陆机器了"



expect的变量定义: set 变量名 变量值

\r 回车
\n 换行符

SSH安全优化

SSH作为远程连接服务,通常我们需要考虑到该服务的安全,所以需要对该服务进行安全方面的配置。
1.更改远程连接登陆的端口
2.禁止ROOT管理员直接登录
3.密码认证方式改为密钥认证
4.重要服务不使用公网IP地址
5.使用防火墙限制来源IP地址

SSH服务登录防护需进行如下配置调整,先对如下参数进行了解

1
2
3
4
5
Port 6666                       # 变更SSH服务远程连接端口
PermitRootLogin no # 禁止root用户直接远程登录
PasswordAuthentication no # 禁止使用密码直接远程登录
UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数
GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟

将如下具体配置添加至/etc/ssh/sshd_config文件中,参数需根据实际情况进行调整

1
2
3
4
5
6
7
###SSH###
#Port 6666
#PasswordAuthentication no
#PermitRootLogin no
GSSAPIAuthentication no
UseDNS no
###END###