*实践场景,用户通过Windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录,架构图如下。
实践多用户登陆一台服务器无密码
实践单用户登陆多台服务器免密码*
1.windows客户端使用Xshell生成秘钥对,并下发公钥至跳板机
我们在跳板机上 设置一下,禁止root用户登录, 禁止密码登录
SSH安全优化(linux ssh 优化)/etc/ssh/sshd_config
- Xshell-->选择工具->新建密钥生成工具
- 生成公钥对,选择下一步
- 填写秘钥名称。秘钥增加密码则不建议配置
- Windows会提示密码,继续即可
- 生成秘钥后,点击Xshell->工具->用户秘钥管理者->选择对应秘钥的属性
- 选择对应秘钥的公钥,将其复制
- 将从WIndows下复制好的公钥粘贴至跳板机~/.ssh/authorized_keys中,然后测试
在跳板机 的 baimei 用户下, 创建文件夹:
mkdir -p .ssh
.ssh隐藏目录权限必须为700 (chmod 700 .ssh
)
cd .ssh
vim authorized_keys
# authorized_keys 添加windows公钥 (chmod 600 authorized_keys)
必须为600权限
成功!!!
2.跳板机下发公钥至后端主机
1) 在跳板机上生成秘钥对
[root@m01 ~]# ssh-keygen -t rsa -C manager@qq.com
2) 拷贝跳板机上的密钥至后端主机,如果SSH不是使用默认22端口, 使用-p指定对应端口
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub "-p22 root@172.16.1.31"
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub "-p22 root@172.16.1.41"
3) 在m01管理机上测试是否成功登陆两台服务器
[root@m01 ~]# ssh root@172.16.1.41 [root@nfs01 ~]# exit
[root@m01 ~]# ssh root@1172.16.1.31 [root@backup ~]# exit
3.通过跳板机能实现scp拷贝文件免密码
[root@m01 ~]# scp zls.txt root@172.16.1.31:/tmp
zls.txt 100% 0 0.0KB/s 00:00
[root@m01 ~]# scp zls.txt root@172.16.1.41:/tmp
zls.txt 100% 0 0.0KB/s 00:00
4.通过跳板机获取所有机器的load,CPU,Memory
等信息(思考:如果服务器数量多,如何并发查看和分发数据)
[root@m01 ~]# cat all.sh #!/usr/bin/bash [ $# -ne 1 ] && echo "请输入执行的命令" && exit 1
for i in 31 41 do echo "#########172.16.1.$i#####" ssh root@172.16.1.$i "$1" done
5.脚本实现(跳板机)
#!/bin/bash #jumpserver lb01=10.0.0.5 lb02=10.0.0.6 web01=10.0.0.7 web02=10.0.0.8 web03=10.0.0.9 nfs=10.0.0.31 backup=10.0.0.41 db01=10.0.0.51 m01=10.0.0.61 zabbix=10.0.0.71
menu(){ cat <<-EOF +-------------------------+ | 1) lb01 | | 2) lb02 | | 3) web01 | | 4) web02 | | 5) web03 | | 6) nfs | | 7) backup | | 8) db01 | | 9) m01 | | 10) zabbix | | h) help | +-------------------------+ EOF } #菜单函数 menu
#连接函数 connect(){ ping -c 1 -w 1 $1 &>/dev/null if [ $? -eq 0 ];then ssh root@$1 else echo -e "\033[5;4;40;31m 别连了,我的哥,$2:$1机器都没开!!!\033[0m" fi }
#控制不让输入ctrl+c,z trap "" HUP INT TSTP while true do read -p "请输入要连接的主机编号:" num case $num in 1|lb01) connect $lb01 lb01 ;; 2|lb02) connect $lb02 lb02 ;; 3|web01) connect $web01 web01 ;; 4|web02) connect $web02 web02 ;; 5|web03) connect $web03 web03 ;; 6|nfs) connect $nfs nfs ;; 7|backup) connect $backup backup ;; 8|db01) connect $db01 db01 ;; 9|m01) connect $m01 m01 ;; 10|zabbix) connect $zabbix zabbix ;; h|help) clear menu ;; close) break ;; esac done
6.脚本实现(图形化跳板机)
#!/bin/bash
lb01=10.0.0.5 lb02=10.0.0.6 web01=10.0.0.7 web02=10.0.0.8 web03=10.0.0.9 nfs=10.0.0.31 backup=10.0.0.41 db01=10.0.0.51 db02=10.0.0.52 m01=10.0.0.61 zabbix=10.0.0.71
title="欢迎进入lnb跳板机-$m01"
#跳板机函数 JUMP(){ OPTION=$(whiptail --title "$title" --menu "请选择你要连接的服务器:" 25 60 11
"1" "连接 lb01"
"2" "连接 lb02"
"3" "连接 web01"
"4" "连接 web02"
"5" "连接 web03"
"6" "连接 nfs"
"7" "连接 backup"
"8" "连接 db01"
"9" "连接 db02"
"10" "连接 m01"
"11" "连接 zabbix" 3>&1 1>&2 2>&3)exitstatus=$? if [ $exitstatus = 0 ]; then case $OPTION in 1) connect $lb01 ;; 2) connect $lb02 ;; 3) connect $web01 ;; 4) connect $web02 ;; 5) connect $web03 ;; 6) connect $nfs ;; 7) connect $backup ;; 8) connect $db01 ;; 9) connect $db02 ;; 10) connect $m01 ;; 11) connect $zabbix ;; 12) connect $te ;; 13) connect $te_web ;; esac fi
}
#主机函数 HOST_INFO (){ HOST=$(whiptail --title "$title" --checklist
"请选择要发送的主机名:" 25 60 11
"$lb01" "发送给lb01" OFF
"$lb02" "发送给lb01" OFF
"$web01" "发送给web01" OFF
"$web02" "发送给web02" OFF
"$web03" "发送给web03" OFF
"$nfs" "发送给nfs" OFF
"$backup" "发送给backup" OFF
"$db01" "发送给db01" OFF
"$db02" "发送给db02" OFF
"$m01" "发送给m01" OFF
"$zabbix" "发送给zabbix" OFF 3>&1 1>&2 2>&3) }SER_INFO(){ SER=$(whiptail --title "$title" --checklist
"请选择要检查的服务:" 25 60 10
"nginx" "检查nginx" OFF
"mysqld" "检查mysqld" OFF
"php" "检查php" OFF
"tomcat" "检查tomcat" OFF
"sshd" "检查sshd" OFF
"httpd" "检查httpd" OFF
"vsftpd" "检查vsftpd" OFF
"docker" "检查docker" OFF
"saltstack" "检查saltstack" OFF
"rsyncd" "检查rsyncd" OFF 3>&1 1>&2 2>&3) }#连接函数 connect(){ whiptail --title "$title" --yesno "你确定要连接这台机器么?想好了啊!!!" 10 60 if [ $? -eq 0 ];then { ping -c 1 -w 1 $1 >/tmp/ping.txt 2>/dev/null if [ $? -ne 0 ];then for ((i = 0 ; i <= 100 ; i+=30)); do sleep 1 echo $i done fi } | whiptail --gauge "emmmm...我正在连接$1,检测网络中,等我一哈子..." 6 60 0 grep 'ttl' /tmp/ping.txt &>/dev/null if [ $? -eq 0 ];then ssh root@$1 else whiptail --title "$title" --msgbox "网络检测失败,别连了,我的哥,$1机器都没开" 10 60 fi
fi }
#推送文件函数 SCP (){ HOST_INFO
PA=$(whiptail --title "$title" --inputbox "请输入需要推送的文件本地路径:" 10 60 /etc/passwd 3>&1 1>&2 2>&3) DEST=$(whiptail --title "$title" --inputbox "请输入需要分发到主机的哪个目录:" 10 60 /tmp 3>&1 1>&2 2>&3) { for H in ${HOST};do echo "scp $PA ${H}:${DEST}"|bash &>/dev/null for ((i = 0 ; i <= 100 ; i+=50));do sleep 1 echo $i done done } | whiptail --gauge "别着急,正在传送中..." 6 60 0
}
#检查磁盘函数 CHECK_DISK (){ HOST_INFO
for H in ${HOST};do echo "ssh $H 'df -h' "|bash > /tmp/disk whiptail --title "$(date +%F-%T) | $H 磁盘信息" --msgbox "$(cat /tmp/disk)" 10 60 done
}
#检查内存函数 CHECK_MEM (){ HOST_INFO
for H in ${HOST};do echo "ssh $H 'free -m' "|bash > /tmp/meminfo whiptail --title "$(date +%F-%T) | $H 内存信息" --msgbox "$(cat /tmp/meminfo)" 30 80 done
}
#查看服务状态 CHECK_SER (){ HOST_INFO SER_INFO
for H in ${HOST};do for S in ${SER};do HO=`echo "$H"|awk -F \" '{print $2}'` PROC=`ssh $HO "ps -ef|grep $S|wc -l"` NUM=$( expr $PROC - 3 ) if [[ $PROC > 3 ]];then whiptail --title "$(date +%F-%T) | $H 服务信息" --msgbox "${S} 存活 | 进程数:$NUM" 10 60 else whiptail --title "$(date +%F-%T) | $H 服务信息" --msgbox "${S} 没有存活| 进程数:$NUM" 10 60 fi done done
}
#批量之心命令函数 EXEC_CMD(){ HOST_INFO
CMD=$(whiptail --title "$title" --inputbox "请输入要执行的命令:" 10 60 ifconfig 3>&1 1>&2 2>&3) for H in ${HOST};do HO=`echo "$H"|awk -F \" '{print $2}'` RES=`ssh $HO "$CMD"` whiptail --title "$(date +%F-%T) | $H 命令执行结果" --msgbox "$RES" 40 80 done
}
#退出函数 EXIT(){ pass=$(whiptail --title "$title" --passwordbox "请输入你的退出密码" 10 60 3>&1 1>&2 2>&3) if [ $pass == '123456' ];then exit else whiptail --title "$title" --msgbox "密码错误,你不是运维,小样的~~~" 10 60 continue fi }
whiptail --title "$title" --msgbox "lnb跳板机,给你全新不一样的feel,进去了,就不想出来" 10 60
#抓取键盘信号 trap "" HUP INT TSTP while true;do OPTION=$(whiptail --title "$title" --menu "请选择你的动作(轻点...)" 15 60 8
"1" "SSH远程连接"
"2" "推送文件"
"3" "查看磁盘空间"
"4" "查看内存空间"
"5" "查看服务状态"
"6" "批量执行命令"
"7" "轻松一下(game)"
"8" "退出" 3>&1 1>&2 2>&3)exitstatus=$? if [ $exitstatus = 0 ]; then case $OPTION in 1) JUMP ;; 2) SCP ;; 3) CHECK_DISK ;; 4) CHECK_MEM ;; 5) CHECK_SER ;; 6) EXEC_CMD ;; 7) sh /root/eluosi.sh ;; 8) EXIT ;; esac fi
done