51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

SSH场景实践

*实践场景,用户通过Windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录,架构图如下。
实践多用户登陆一台服务器无密码
实践单用户登陆多台服务器免密码*

1.windows客户端使用Xshell生成秘钥对,并下发公钥至跳板机

我们在跳板机上 设置一下,禁止root用户登录, 禁止密码登录

SSH安全优化(linux ssh 优化)/etc/ssh/sshd_config

  1. Xshell-->选择工具->新建密钥生成工具

  1. 生成公钥对,选择下一步

  1. 填写秘钥名称。秘钥增加密码则不建议配置

  1. Windows会提示密码,继续即可

  1. 生成秘钥后,点击Xshell->工具->用户秘钥管理者->选择对应秘钥的属性

  1. 选择对应秘钥的公钥,将其复制

  1. 将从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 &quot;$title&quot; --inputbox &quot;请输入需要推送的文件本地路径:&quot; 10 60 /etc/passwd 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)
            DEST=$(whiptail --title &quot;$title&quot; --inputbox &quot;请输入需要分发到主机的哪个目录:&quot; 10 60 /tmp 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)
            {
            for H in ${HOST};do
                    echo &quot;scp $PA ${H}:${DEST}&quot;|bash &amp;&gt;/dev/null
                    for ((i = 0 ; i &lt;= 100 ; i+=50));do
                            sleep 1
                            echo $i
                    done
            done
            } | whiptail --gauge &quot;别着急,正在传送中...&quot; 6 60 0

}

#检查磁盘函数 CHECK_DISK (){ HOST_INFO

            for H in ${HOST};do
        echo &quot;ssh $H 'df -h' &quot;|bash &gt; /tmp/disk
        whiptail --title &quot;$(date +%F-%T) | $H 磁盘信息&quot; --msgbox &quot;$(cat /tmp/disk)&quot; 10 60
            done

}

#检查内存函数 CHECK_MEM (){ HOST_INFO

            for H in ${HOST};do
                    echo &quot;ssh $H 'free -m' &quot;|bash &gt; /tmp/meminfo
                    whiptail --title &quot;$(date +%F-%T) | $H 内存信息&quot; --msgbox &quot;$(cat /tmp/meminfo)&quot; 30 80
            done

}

#查看服务状态 CHECK_SER (){ HOST_INFO SER_INFO

    for H in ${HOST};do
        for S in ${SER};do
            HO=`echo &quot;$H&quot;|awk -F \&quot; '{print $2}'`
            PROC=`ssh $HO &quot;ps -ef|grep $S|wc -l&quot;`
            NUM=$( expr $PROC - 3 )
            if [[ $PROC &gt; 3 ]];then
                whiptail --title &quot;$(date +%F-%T) | $H 服务信息&quot; --msgbox &quot;${S} 存活 | 进程数:$NUM&quot; 10 60
            else
                whiptail --title &quot;$(date +%F-%T) | $H 服务信息&quot; --msgbox &quot;${S} 没有存活| 进程数:$NUM&quot; 10 60
            fi
        done
    done

}

#批量之心命令函数 EXEC_CMD(){ HOST_INFO

    CMD=$(whiptail --title &quot;$title&quot; --inputbox &quot;请输入要执行的命令:&quot; 10 60 ifconfig 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)
            for H in ${HOST};do
        HO=`echo &quot;$H&quot;|awk -F \&quot; '{print $2}'`
        RES=`ssh $HO &quot;$CMD&quot;`
        whiptail --title &quot;$(date +%F-%T) | $H 命令执行结果&quot; --msgbox &quot;$RES&quot; 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

赞(7)
未经允许不得转载:工具盒子 » SSH场景实践