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 "$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
赞(6)
未经允许不得转载:工具盒子 » SSH场景实践