SSH优化

实现推送公钥脚本

# 1.免交互生成密钥对
[root@m01 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa >/dev/null 2>&1
 ssh-keygen      : 这是一个用于生成SSH密钥对的命令。
 -t rsa          : 这指定了密钥对的类型为RSA
 -P ''           : 这设置了密钥对的密码为空,意味着创建密钥时不需要密码。
 >/dev/null 2>&1 : 部分将命令的标准输出和标准错误输出都重定向null
 
# 2.免交互ssh命令-------sshpass(需要安装)
[root@m01 ~]# yum install -y sshpass
[root@m01 ~]# sshpass -p 1 ssh [email protected]   
- p     : 指定所连用户的密码


# 3编写脚本
[root@m01 ~]# vim push_public_key.sh
#!/bin/bash
test -f ~/.ssh/id_rsa || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa >/dev/null 2>&1
for ip in 7 8 31 41;do
  ping -c1 -W1 172.16.1.$ip &>/dev/null
  [ $? -eq 0 ] &&\
  sshpass -p 1 ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub [email protected].$ip &>/dev/null &&\
echo "172.16.1.$ip 推送成功..." ||\
echo "172.16.1.$ip 推送失败..."
done

ping  -c -W
		-c 只发送一次ping请求
		-W 表示如果在1秒内没有收到回应,ping命令就会停止等待。
test -f ~/.ssh/id_rsa  :检测文件是否存在 
||      : 或者 左边执行成功右边不执行 ,左边执行失败右边执行
&&      :  和   都要执行成功
\    : 换行符


### 集合一下 实现创建推送公钥
vim push_public_key_v2.sh
#!/bin/bash
. /etc/init.d/functions
test -f ~/.ssh/id_dsa || ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa >/dev/null2>&1
for ip in 7 8 31 41;do
		ping -c1 -W1 172.16.1.$ip &>/dev/null
		[ $? -eq 0 ] &&\
		sshpass -p 1 ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/[email protected].$ip &>/dev/null &&\
action "172.16.1.$ip" /bin/true ||\
action "172.16.1.$ip" /bin/false
done

. /etc/init.d/functions    ## 调用图形化成功失败函数
action "172.16.1.$ip" /bin/true || action "172.16.1.$ip" /bin/false    

SSH免交互语言expect(了解)需要安装

# 1.安装expect
[root@m01 ~]# yum install -y expect

#!/usr/bin/expect
set ip 10.0.0.41       ## 定义变量
set pass 1
set timeout 30
spawn ssh root@$ip    ## 这部分使用了 expect 的 spawn 命令来启动一个SSH连接到远程主机。
expect {                             ## 一条命令下
		"(yes/no)" {send "yes\r"; exp_continue} ## 搜索到(yse/no)就输入yes回车
		"password:" {send "$pass\r"}  ## 搜索到(password:)就输入变量 $pass 回车
}
expect "root@*" {send "df -h\r"}  ## 检索到root@*   输入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 [email protected].$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
}

SSH优化

# 1.修改ssh默认端口
[root@m01 ~]# vim /etc/ssh/sshd_config
Port 2222
# 2.不允许使用root登录
PermitRootLogin No // 38
# 3.不使用DNS
UseDNS no // 115
# 4.禁止使用密码登录
PasswordAuthentication no // 65
# 5.禁止使用GSS认证

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

将sh文件变为2进制文件 (通过c转义)需要安装 shc

## 将脚本变成二进制文件
[root@m01 ~]# yum install -y shc
[root@m01 ~]# shc -f ip_host.sh