原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1670233

我撰写本文原来的意图是想把“复制SSH渠道”和"copy SSH Session"这样的功能从远程ssh客户端中剔除掉.因此想到可以在SSH服务端设置一下,但查阅了sshd_config的man手册,发现里面的看起来限制ssh连接数量的参数(MaxSessions ,ClientAliveCountMax等)在复制SSH渠道中并不好用,即一个远程ssh客户端可以通过这种方式几乎无限制的建立ssh会话,未免让人觉得“不爽”。

例如,我正在做一件事情,突然想出去,但我不想改变当前终端中的任何操作,也不想让别人在我出去后过来动我正在做的工作,那我可以简单的按下Ctrl+S来锁定终端数据输入输出(尽管输入并不能锁定,但输入将对用户不可见),当我回来时可以再通过按下Ctrl+Q来解除“屏幕锁定”,这样不熟悉Linux的同事就不会来干扰我的工作,而不用锁定整个系统。但自己却知道我可以通过复制SSH渠道/会话的方式来建立一个可用的新的SSH连接,而这样的操作在以后繁杂的工作中是不可能逐一去查看的,因此想直接写个shell脚本来实现这个需求。

思路还是比较简单的,代码也没有几行。首先这个脚本一定有循环,这样才能起到持续化监测的能力,通过命令不断的查询sshd端口的连接用户和每个用户的连接数量,如果数量超过我设定的最大连接数量,则再通过命令找到这些连接的会话,再通过命令结束这些会话,从而实现目的。

但这其中有几个问题需要考虑:

  1. 用户按键,特别是快捷键(如Ctrl+D,Ctrl+C或Ctrl+\等的处理)

  2. pts的数值可能会shell脚本中的最大值,除非新登录的用户的pts数值只增加不减少

  3. PAM安全模块也许有更好的解决方案(shell脚本肯定不是最佳方案)

通过测试的脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
# This shell script will knock out extra ssh connection
# max_number_of_ssh_client 
max_number_of_ssh_client=3
# lsof is essential
if [[ ! -x `which lsof` ]]; then
    yum install lsof -y
    RETVAL=$?
    if [[ "$RETVAL" -ne "0" ]]; then
        echo "ERROR: can NOT use lsof command, please check your internet connection or install lsof by manual! "
        exit $RETVAL
    fi
else
    # TODO
    # for awk, grep, etc
    echo "SUCCESS: This shell script will knock out extra ssh connection "
fi
# a main worker
# loop
while : ; do
    ssh_port=`netstat -anopt | grep sshd | awk '{print $4}' awk -F ':' '{print $2}' grep -v ^$ | uniq `
    ssh_clients=`lsof -i:$ssh_port | grep \> | awk '{print $9}' awk -F ':' '{print $(NF-1)}' uniq awk -F '>' '{print $2}'`
    for ssh_client in $ssh_clients; do
        number_of_ssh_client=`lsof -i:$ssh_port | grep $ssh_client | wc -l`
        if [[ $number_of_ssh_client -gt $max_number_of_ssh_client ]]; then
            number_pts=`w -hs | grep $ssh_client | awk '{print $2}' awk -F '/' '{print $2}' awk 'BEGIN {max=0} {if ($1>max) max=$1 fi} END {print max}'`
            # TODO
            # another solution maybe exist
            # kill extra logins
            pkill -kill -t pts/$number_pts
            if [[ $? -eq 0 ]]; then
                echo "SUCCESS: extra connections  $ssh_client@pts/$number_pts has been knocked out! "
            else
                echo "WARNNING: can NOT knock out extra connections! "
            fi
        else
            # TODO
            # too many INFO displayed
            echo "INFO: number of ssh connections is NORMAL! "
            # sleep 1
            sleep 1
        fi
    done
done

注释:脚本中的几个TODO可以多考虑考虑,其次里面的蹩脚英语请自行略过,:)

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1670233

Linux Shell 脚本限制ssh最大用户登录数相关推荐

  1. linux远程连接最大数是多少,Linux Shell 脚本限制ssh最大用户登录数

    我撰写本文原来的意图是想把"复制SSH渠道"和"copy SSH Session"这样的功能从远程ssh客户端中剔除掉.因此想到可以在SSH服务端设置一下,但查 ...

  2. linux ssh最大会话数,Linux Shell 脚本限制ssh最大用户登录数

    我撰写本文原来的意图是想把"复制SSH渠道"和"copy SSH Session"这样的功能从远程ssh客户端中剔除掉.因此想到可以在SSH服务端设置一下,但查 ...

  3. Linux运维:Shell脚本实现ssh免密登录远程服务器

    LInux系统日常运维过程中,经常需要在本地运行脚本执行对远程主机的命令,正常情况下,ssh登录远程服务器时会提示输入密码,这会影响到脚本的自动执行(因为shell脚本中没有自动填充密码的命令).有三 ...

  4. linux下怎么查看ssh的用户登录日志

    linux下登录日志在下面的目录里:  cd /var/log  查看ssh用户的登录日志:  less secure  linux日志管理: 1. 日志简介 日志对于安全来说,非常重要,他记录了系统 ...

  5. Shell脚本实现SSH免密登录及批量配置管理

    1.SSH免密登录及批量配置管理 场景分析 ssh免密登录 pssh工具批量管理 SHELL自动化脚本 本篇总结 场景分析 作为一个运维工程师,不是每个人工作的环境都想阿里.腾讯那样,动不动就上亿的P ...

  6. Linux-----Ubuntu通过shell脚本将SSH多次登录失败的IP自动加入黑名单

    一:与登录相关文件介绍 ubuntu三个文件日志介绍: 1:/var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记录系统启动时间: 2:/v ...

  7. linux sh脚本 while,Linux shell脚本使用while循环执行ssh的注意事项

    原标题:Linux shell脚本使用while循环执行ssh的注意事项 如果要使用ssh批量登录到其它系统上操作时,我们会采用循环的方式去处理,那么这里存在一个巨大坑,你必须要小心了. 一.场景还原 ...

  8. linux脚本用户输入,如何在Linux shell脚本中提示用户输入

    本篇文章给大家介绍关于如何在Linux shell脚本中提示用户输入?下面来看具体的内容. 我们首先来看一下命令# read var # read -s "Waiting for input ...

  9. 批量ping脚本shell_30个Linux Shell脚本经典案例(上)

    在学习Linux运维时,普遍反馈是:Linux Shell是一个很难的知识板块.虽然大家都认真学,基本的语法也都掌握了,但有需求时,很难直接上手编程,要么写了很久,要么写不好! 也有很多做运维很多年的 ...

最新文章

  1. linux系统之编译安装mysql
  2. 【Windows】如何判断当前鼠标是否按下左键或右键
  3. 设计模式08: Composite 组合模式(结构型模式)
  4. insert sort
  5. SSM开发环境的搭建(方式二)
  6. ISO27001(BS7799/ISO17799)国标
  7. WebSocket connection to ‘ws://localhost:8081/ws‘ failed: Invalid frame header
  8. 极大似然估计和最大似然估计定义
  9. pytorch 使用netron可视化
  10. 2021职业技能鉴定2021维修电工证(中级)考试题
  11. Canvas 自由落体
  12. 赤诚的火焰--致时代里永远不变的规矩
  13. 语音信号的短时平均过零率
  14. 公众号二维码怎么生成
  15. 因果倒置的实验名称是“延迟实验”(Wheeler's delayed choice experiment)
  16. svg转成jpg/png图片跨域图片
  17. ubuntu20.04 外接显示器检测不到 未知的显示器 显卡安装黑屏 解决方案
  18. Vijos P1794 文化之旅
  19. 虾皮马来西亚热销产品有哪些?
  20. 算法描述 100的阶乘

热门文章

  1. Oracle DBA学习互联网化的内容
  2. RHEL5+PXE+DHCP+Apache+Kickstart安装RHCE5.1 i386实验室环境
  3. 2010.10.30 OA 项目组一周工作报告
  4. docker上传自己的镜像
  5. Node.js入门(含NVM、NPM、NVM的安装)
  6. Mongo、Redis、Memcached对比及知识总结
  7. 使用Oracle调度程序自动完成任务
  8. iOS-UIViewController视图控制器跳转界面的几种常用方法
  9. poj 3662 Telephone Lines spfa算法灵活运用
  10. 电视信号——行场同步