Linux Shell 스 크 립 트 ssh 최대 사용자 로그 인 수 제한

제 가 본 고 를 작성 한 의 도 는 'SSH 채널 복사' 와 'copy SSH Session' 같은 기능 을 원 격 ssh 클 라 이언 트 에서 제거 하려 는 것 입 니 다. 그래서 SSH 서버 에 설정 할 수 있다 고 생각 했 지만 sshd 를 찾 아 보 았 습 니 다.config 의 man 매 뉴 얼 은 ssh 연결 수량 을 제한 하 는 것 처럼 보 이 는 인자 (MaxSessions, Client Alive Countmax 등) 가 SSH 채널 을 복사 하 는 데 사용 되 지 않 는 다 는 것 을 발견 했다. 즉, 원 격 ssh 클 라 이언 트 는 이런 방식 으로 ssh 세 션 을 거의 제한 없 이 만 들 수 있어 서 '불쾌 하 다' 는 것 을 알 수 있다.
  예 를 들 어 저 는 한 가지 일 을 하고 있 습 니 다. 갑자기 나 가 고 싶 지만 현재 터미널 의 어떠한 조작 도 바 꾸 고 싶 지 않 습 니 다. 다른 사람 이 제 가 나 간 후에 제 가 하고 있 는 일 을 움 직 이게 하고 싶 지 않 습 니 다. 그러면 저 는 Ctrl + S 를 누 르 면 터미널 데이터 의 입 출력 을 잠 글 수 있 습 니 다. (입력 이 잠 겨 있 지 않 지만 입력 은 사용자 에 게 보이 지 않 습 니 다)내 가 돌아 올 때 Ctrl + Q 를 누 르 면 '화면 잠 금' 을 해제 할 수 있다. 그러면 리 눅 스 에 익숙 하지 않 은 동료 들 이 내 일 을 방해 하지 않 고 시스템 전 체 를 잠 그 지 않 아 도 된다.그러나 저 는 SSH 채널/세 션 을 복사 하 는 방식 으로 사용 가능 한 새로운 SSH 연결 을 만 들 수 있다 는 것 을 알 고 있 습 니 다. 이런 조작 은 앞으로 복잡 한 작업 에서 하나씩 볼 수 없 기 때문에 셸 스 크 립 트 를 직접 써 서 이 수 요 를 실현 하고 싶 습 니 다.
  생각 은 비교적 간단 하고 코드 도 몇 줄 이 없다.우선 이 스 크 립 트 는 순환 이 있어 야 지속 적 인 모니터링 능력 을 가 질 수 있 습 니 다. 명령 을 통 해 sshd 포트 의 연결 사용자 와 모든 사용자 의 연결 수량 을 계속 조회 하고 제 가 설정 한 최대 연결 수량 을 초과 하면 명령 을 통 해 이 연 결 된 세 션 을 찾 은 다음 명령 을 통 해 이 세 션 을 끝 냅 니 다.
  그러나 그 중 몇 가지 문 제 는 고려 해 야 한다.
  • 사용자 버튼, 특히 단축 키 (예: Ctrl + D, Ctrl + C 또는 Ctrl +\등의 처리)
  • pts 의 수 치 는 셸 스 크 립 트 의 최대 값 일 수 있 습 니 다. 새로 로그 인 한 사용자 의 pts 수치 가 증가 하지 않 는 한
  • PAM 보안 모듈 에 더 좋 은 해결 방안 이 있 을 수 있 습 니 다 (셸 스 크 립 트 는 최선 의 방안 이 아 닐 것 입 니 다)
  •   테스트 를 통과 한 스 크 립 트 는 다음 과 같 습 니 다:
    #!/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 는 많이 고려 할 수 있 습 니 다. 그 다음 에 어 설 픈 영 어 는 스스로 생략 하 십시오.:)

    좋은 웹페이지 즐겨찾기