標籤:登入限制 ssh session複製 ssh會話複製 最大登入數 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連接埠的串連使用者和每個使用者的串連數量,如果數量超過我設定的最大串連數量,則再通過命令找到這些串連的會話,再通過命令結束這些會話,從而實現目的。
但這其中有幾個問題需要考慮:
使用者按鍵,特別是快速鍵(如Ctrl+D,Ctrl+C或Ctrl+\等的處理)
pts的數值可能會shell指令碼中的最大值,除非新登入的使用者的pts數值只增加不減少
PAM安全模組也許有更好的解決方案(shell指令碼肯定不是最佳方案)
通過測試的指令碼如下:
#!/bin/bash# This shell script will knock out extra ssh connection# max_number_of_ssh_client max_number_of_ssh_client=3# lsof is essentialif [[ ! -x `which lsof` ]]; thenyum install lsof -yRETVAL=$?if [[ "$RETVAL" -ne "0" ]]; thenecho "ERROR: can NOT use lsof command, please check your internet connection or install lsof by manual! "exit $RETVALfielse# TODO# for awk, grep, etcecho "SUCCESS: This shell script will knock out extra ssh connection "fi# a main worker# loopwhile : ; dossh_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; donumber_of_ssh_client=`lsof -i:$ssh_port | grep $ssh_client | wc -l`if [[ $number_of_ssh_client -gt $max_number_of_ssh_client ]]; thennumber_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 loginspkill -kill -t pts/$number_ptsif [[ $? -eq 0 ]]; thenecho "SUCCESS: extra connections [email protected]/$number_pts has been knocked out! "elseecho "WARNNING: can NOT knock out extra connections! "fielse# TODO# too many INFO displayedecho "INFO: number of ssh connections is NORMAL! "# sleep 1sleep 1fidonedone
注釋:指令碼中的幾個TODO可以多考慮考慮,其次裡面的蹩腳英語請自行略過,:)
本文出自 “通訊,我的最愛” 部落格,請務必保留此出處http://dgd2010.blog.51cto.com/1539422/1670233
Linux Shell 指令碼限制ssh最大使用者登入數