Linux Shell 脚本限制ssh最大用户登录数

简介:

  我撰写本文原来的意图是想把“复制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可以多考虑考虑,其次里面的蹩脚英语请自行略过,:)




本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1670233,如需转载请自行联系原作者

相关文章
|
10天前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
|
11天前
|
Shell
Shell脚本有哪些基本语法?
【9月更文挑战第4天】
35 17
|
11天前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
26 12
|
9天前
|
网络协议 关系型数据库 MySQL
Shell 脚本案例
Shell 脚本案例
26 8
|
10天前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
15天前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
15天前
|
Linux
探索Linux操作系统:命令行与脚本编程基础
【8月更文挑战第31天】在这篇文章中,我们将一起踏上一段旅程,深入探索Linux操作系统的奥秘。通过学习命令行的使用和编写简单的脚本,你将能够更高效地与你的计算机进行交流。无论你是新手还是有经验的用户,本文都将为你打开一扇通往Linux世界的大门。准备好了吗?让我们开始吧!
|
15天前
|
运维 监控 Shell
自动化运维之宝:编写高效的Shell脚本
【8月更文挑战第31天】在运维的世界里,Shell脚本是一把瑞士军刀,它让日常任务变得简单而高效。本文将通过浅显易懂的语言和实际案例,带你领略Shell脚本的魅力,并教你如何打造属于自己的自动化工具箱。无论你是初学者还是资深运维,这篇文章都将为你打开一扇窗,让你看到不一样的风景。让我们一起探索Shell脚本的世界吧!
|
16天前
|
运维 监控 Linux
深入理解Linux系统运维:命令行与脚本的奥秘
【8月更文挑战第30天】在Linux的世界里,命令行是运维人员的灵魂之窗。掌握命令行,就像握住了一把钥匙,能开启系统管理的宝藏箱。本文将带你走进Linux的命令行世界,通过实际代码示例,解锁那些高效管理和维护系统的秘籍。你将学到不仅仅是命令本身,更是如何将这些命令编织成强大的脚本,让日常的运维工作变得游刃有余。准备好跟随我的步伐,一起深入探索Linux命令行与脚本的奥秘吧!
|
18天前
|
Linux 网络安全
Linux开启ssh
Linux开启ssh
30 0