• trap实现跳板机


     

    第一节 跳板机实现原理(图例)

     

    第2节 涉及到的知识点

    命令:trap

    拓展知识:进程与信号

    trap 语法,作用,使用

    [jeson@mage-jump-01 ~/]$  trap -l
       1) SIGHUP        2) SIGINT        3) SIGQUIT     4) SIGILL         5) SIGTRAP
       6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL      10) SIGUSR1

    trap -l 打印所有进程的信号
    trap -p 显示那些信号已经被设置了。
    trap “” signals(或编号) 为空表示这个信号,执行的命令为空。可以同设置多个trap “” signals1 signals2 signals N
    trap “commands” signals(编号) 收到signals指定信号时,信号功能复位同时执行commands命令。可以同时设置多个
    trap signals(或编号) 没有命令部分,信号复原默认状态。可以同时恢复多个:trap signals1 signals2 signals N

    使用方法:

    [jeson@mage-jump-01 ~/]$trap 'echo "I am a boy"' INT
    [jeson@mage-jump-01 ~/]$trap -p
      trap -- 'echo "I am a boy"' SIGINT
      trap -- '' SIGTSTP
      trap -- '' SIGTTIN
      trap -- '' SIGTTOU
    [jeson@mage-jump-01 ~/]$^CI am a boy     # 设置按下ctrl + c 的时候,执行echo "I am a boy"
    
    [jeson@mage-jump-01 ~/]$trap 2           # 取消 echo hello 的命令,还原组合键(ctrl + c)的默认
    [jeson@mage-jump-01 ~/]$trap -p
      trap -- '' SIGTSTP
      trap -- '' SIGTTIN
      trap -- '' SIGTTOU
    [jeson@mage-jump-01 ~/]$^C               # 还原Ctrl+C 的默认功能
    [jeson@mage-jump-01 ~/]$

    案例:ctrl + c 后,清理工作

    窗口1

    窗口2

    cat >touch_file.sh <<-EOF 
    #
    !/bin/bash trap "find /tmp -type f -name 'jeson_*' |xargs rm -f && exit " INT while : do touch /tmp/jeson_$(date +%F-%T) sleep 1 done EOF
    [jeson@mage-jump-01 ~/]$ bash touch_file.sh

    # 观察窗口1按下ctrl + c后,是否自动清理文件

     

     [jeson@mage-jump-01 ~/]$ watch -n 1 ls /tmp/jeson_*

    第2节 实现跳板机

     跳板机主脚本:

    窗口1:trap信号跳板机脚本

    窗口2:设置特定用户登录不受跳板机代码影响

    窗口3:测试效果

    [jeson@mage-jump-01 ~/]$cat /server/scripts/tiao_ban_ji.sh

    #!/bin/bash
    ##########################
    # Date:   01:17 2018-04-07
    # Author: Created by Jeson
    # Mail:   309769163@qq.com
    # Funcsion:This scripts funcsion is tiao ban ji
    ##########################
    function trapper(){
        trap '' INT EXIT TSTP TERM HUP
    }
    while true
    do
        trapper
        clear
        cat <<-menu
      ========= Host List =======
      1) 10.0.0.3     lb-nginx-01
      2) 10.0.0.4     lb-nginx-02
      3) 10.0.0.10    web-lnmp-01
      4) 10.0.0.11    web-lnmp-02
      0) EXIT
    menu
        read -p "Please select:" num
            case "$num" in
                1) ssh -P52113 $USER@lb-nginx-01
                ;;
                2) ssh -P52113 $USER@lb-nginx-02
                ;;
                3) ssh -P52113 $USER@web-lnmp-01
                ;;
                4) ssh -P52113 $USER@web-lnmp-02
                ;;
            # 密码式调用分发密匙脚本
                sshkey) bash /server/scripts/send_key.sh
                ;;
            # 只对特定用户有效
                0) exit
            esac
    done 

     [jeson@mage-jump-01 ~/]$ cat  /etc/profile.d/tb.sh

    [ $UID -ne 0 ] && [ $USER != 'jeson' ] &&
    
    source /server/scripts/tiao_ban_ji.sh

     只有特定用户“root”和“jeson”可以使用“0) EXIT”功能。

       ======Host List========
      1) 10.0.0.3     lb-nginx-01 
      2) 10.0.0.4     lb-nginx-02 
      3) 10.0.0.10    web-lnmp-01 
      4) 10.0.0.11    web-lnmp-02
      0) EXIT
    Please select:

     

     密匙分发脚本:

    密匙分发脚本1:cat /server/scripts/send_key.sh
    #!/bin/bash
    path_FenFa_sshKey_conf=/server/scripts/conf/sshkey.conf
    path_FenFa_sshKey_exp=/server/scripts/fenfa_sshkey.exp
    [ ! -f ~/.ssh/id_dsa ] && { ssh-keygen -t dsa -q -P '' -f ~/.ssh/id_dsa>/dev/null ; }
    while read line
    do
            remote_user=$(echo $line|awk -F "[@ -]+" '{ print $1 }')
            remote_password=$(echo $line|awk -F "[@ -]+" '{ print $2 }')
            remote_ip=$(echo $line|awk -F "[@ -]+" '{ print $3 }')
            remote_Port=$(echo $line|awk -F "[@ -]+" '{ print $4 }')
            expect $path_FenFa_sshKey_exp $remote_Port $remote_user $remote_password $remote_ip ~/.ssh/id_dsa.pub &>/dev
    /null
    done<$path_FenFa_sshKey_conf
    密匙分发exepect脚本实现非交互方式:cat /server/scripts/fenfa_sshkey.exp
    #!/bin/expect
    if { $argc != 5 } {
            send_user "usage: expect fenfa_sshkey.exp pub_key_file remote_user remote_passaword remote_ip
    "
            exit 10
    }
    # defile var
    set remote_Port  [ lindex $argv 0 ]
    set remote_user  [ lindex $argv 1 ]
    set remote_password [ lindex $argv 2 ]
    set remote_ip    [ lindex $argv 3 ]
    set remote_dsa   [ lindex $argv 4 ]
    spawn ssh-copy-id -i $remote_dsa  -p $remote_Port $remote_user@$remote_ip
    expect {
            "yes/no"     { send "yes
    ";exp_continue }
            "*password"  { send "$remote_password
    ";exp_continue }
     }
     需要分发到的主机配置文件:
    [root@web-lnmp-01 ~/]#cat /server/scripts/conf/sshkey.conf 
    root 123456 10.0.0.31 22
    jeson 123456 10.0.0.200  52113
    jeson 123456 10.0.0.10  52113
  • 相关阅读:
    windows server2012之部署HTTPS安全站点
    HTTPS站点搭建教程:Win7/Windows Server 2008R2
    https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
    SQL Server中解决死锁的新方法介绍
    WCF寄宿到Windows Service[1]
    安装程序工具 (Installutil.exe)22
    安装程序工具 (Installutil.exe)
    WebSocket使用教程
    深入理解java String 对象的不可变性
    Android 给Button加个监听
  • 原文地址:https://www.cnblogs.com/jeson-lbb/p/9734985.html
Copyright © 2020-2023  润新知