현재의 모든 원격 셸을 재귀적으로 인쇄할 수 있나요?

현재의 모든 원격 셸을 재귀적으로 인쇄할 수 있나요?

현재 있는 모든 로컬 및 원격 쉘을 반복적으로 인쇄하는 방법이 있습니까?

예를 들어 내 로컬 컴퓨터에서 다른 컴퓨터로 SSH를 통해 연결합니다. 여기에서 사용자를 전환할 수 있습니다(다른 셸 열기). 그런 다음 다시 로컬 컴퓨터로 SSH를 통해 연결합니다. 상황을 더욱 복잡하게 만드는 것은 일반적으로 여러 개의 셸 탭(또는 창)이 있기 때문에 일반적으로 각 탭을 추적할 수 없다는 것입니다.

내가 원하는 것은 각 회의를 내가 있는 곳에서 정확하게 인쇄하는 것입니다. 또는 적어도 내가 exit현재 쉘이라면 어떤 쉘로 돌아가게 될까요?

며칠 또는 몇 주 동안 여러 개의 쉘을 연 후 를 입력하면 어디로 전송될지 알 수 없습니다 exit. 내 쉘 창이 닫히나요("루트" 쉘에 있으므로)? 다른 서버로 쫓겨나나요?

즉, SSH 홉을 추적하고 싶습니다.

답변1

프로세스 트리 위로 올라가서 목록 위로 올라갈 때 고유한 사용자 이름/pid/실행 파일/무엇이든 인쇄하고 마지막으로 터미널을 떠날 때 중지하는 스크립트를 작성할 수 있습니다. sshd는 일반적으로 사용자를 setuid()한 후 TTY 수신을 시작하므로 TTY에 연결하는 가장 빠른 프로세스는 로그인한 사용자로 실행됩니다.

이는 이 개념의 Linux 전용 Bash 스크립트 버전입니다.

스크립트 출력:

루트에 대한 간단한 sudo:

[root@ditirlns04 ~]# ./test.sh
Current User: 0
Previous UID: 504

UID 504는 상자에 로그인하는 방법이므로 작동합니다.

[root@ditirlns04 ~]# logname
jadavis6
[root@ditirlns04 ~]# id jadavis6
uid=504(jadavis6) gid=504(jadavis6) groups=504(jadavis6),16777216(enterprise admins),16777217(ncatsys),16777218(sms admins),16777219(domain admins),16777220(aggieanywhere),16777221(group policy creator owners),16777222(tlh-test),16777223(dba admins),16777224(domain controllers),16777225(cupsadmin),16777226(linuxusers),16777227(da admins),16777228(webdev),16777229(schema admins),16777230,16777231(changeauditor operators - ncat),16777232(configmgr remote control users),16777233(changeauditor administrators - ncat),16777234(telnetclients),16777235(denied rodc password replication group)

위와 동일합니다. 중간 사용자를 통해서만 가능합니다(예: 로그인 504, 루트로 sudo, 일반 UID 501로 sudo, 그런 다음 루트로 돌아감).

[root@ditirlns04 ~]# ./test.sh
Current User: 0
Previous UID: 501
Previous UID: 0
Previous UID: 504
[root@ditirlns04 ~]#

따라서 각 UID 전환은 발생한 역순으로 캡처됩니다. 동일한 순서로 변환해야 하는 경우 스크립트를 함수에 넣어 출력을 얻으면 됩니다.

[root@ditirlns04 ~]# ./test.sh | tac
Previous UID: 504
Previous UID: 0
Previous UID: 501
Current User: 0
[root@ditirlns04 ~]#

스크립트 본문:

#!/bin/bash

currentPID=$$
currentUser=$(id -u)
currentTTY=$(awk '{print $7}' /proc/$$/stat)

echo "Current User: $currentUser"

while /bin/true; do

  parentPID=$(awk '{print $4}' /proc/$currentPID/stat)
  parentTTY=$(awk '{print $7}' /proc/$currentPID/stat)

  if [ $parentTTY -ne $currentTTY ]; then
     break
  fi

  parentUser=$(awk '/^Uid:/ {print $2}' /proc/$currentPID/status)

  if [[ "x$parentUser" != "x$currentUser" ]]; then
     echo "Previous UID: $parentUser"
  fi

  currentPID=$parentPID
  currentUser=$parentUser

done

stat기본적으로 모든 PID 와 파일을 활용합니다 status. 출력을 래핑하는 보다 플랫폼 독립적인 버전을 만들 수 있지만 ps구문 분석할 형식으로 데이터를 쉽게 사용할 수 있는 경우 구문 분석 명령 출력을 신뢰하지 않기 때문에 procfs 경로를 선택했습니다.

기본적으로 새 UID를 찾을 때마다 이를 인쇄합니다. 사용자의 sudo와 동일한 순서가 보장되므로 해당 시스템의 전체 로그인 세션을 효과적으로 처리해야 합니다. 원하는 경우 PID 또는 명령 이름을 인쇄하기 위해 위의 내용을 쉽게 수정할 수 있어야 하지만 일반적으로 이와 관련하여 생각하는 사람들은 어떤 쉘로 실행할 것인지보다 누구로 실행할 것인지에 더 관심이 있습니다.

답변2

실행된 쉘은 sshd변수의 존재로 이를 인식할 수 있습니다 $SSH_CLIENT. 또 다른 변수는 $SHLVL동일한 호스트의 다른 쉘에서 시작된 쉘을 나타낼 수 있습니다. 추가 추적이 필요한 경우 변수를 선택하고 sshd원격 SSH 클라이언트에서 허용되도록 허용하세요.

답변3

다음 ps명령을 사용하여 셸을 볼 수 있습니다. 완벽하지는 않지만 멋진 트리 형식으로 쉘의 계층 구조를 잘 보여줍니다.

$ ps auxw --forest | grep -E "gnome-terminal|\_ bash|-bash|sshd|login "

다음 명령을 사용하여 현재 쉘의 PID를 확인하여 현재 어떤 쉘에 있는지 확인할 수도 있습니다 $$.

$ echo $$

$ ps auxw --forest | grep -E "gnome-terminal|\_ bash|-bash|sshd|login "
root      1751  0.0  0.0  67824   820 ?        Ss   Jun24   0:00 login -- root     
root       989  0.0  0.0 114116   928 tty2     Ss+  Jun30   0:00  \_ -bash
saml      6018  0.0  0.1 553356 13296 ?        Sl   Jun24   3:42 gnome-terminal
saml      8182  0.0  0.0 115104   992 pts/2    Ss+  Jun24   0:00  \_ bash
saml      3483  0.0  0.0 115156   936 pts/62   Ss   Jun27   0:02  \_ bash
saml      3742  0.0  0.0 114972  1712 pts/64   Ss+  Jun28   0:00  \_ bash
saml      7368  0.0  0.0 122544  4608 pts/65   Ss   Jun28   0:05  \_ bash
saml     32256  0.0  0.0 114980  6320 pts/65   S    20:54   0:00  |   \_ bash
saml      3753  0.0  0.0 115036  1960 pts/81   Ss+  Jul03   0:01  \_ bash
saml     12843  0.0  0.0 115076  5204 pts/82   Ss+  Jul03   0:01  \_ bash
saml     14702  0.0  0.0 114972  6392 pts/87   Ss   16:04   0:00  \_ bash
root     26084  0.0  0.0  75096  1152 ?        Ss   09:40   0:00 /usr/sbin/sshd
root     32345  0.0  0.0 106716  3840 ?        Ss   20:55   0:00  \_ sshd: saml [priv]
saml     32349  0.0  0.0 106716  1800 ?        S    20:55   0:00      \_ sshd: saml@pts/88
saml     32352  0.0  0.0 114908  6304 pts/88   Ss   20:55   0:00          \_ -bash
saml     32764  0.0  0.0 103380   820 pts/88   S+   21:02   0:00              \_ grep --color=auto -E gnome-terminal|\_ bash|-bash|sshd|login 

내 PID는 무엇입니까?

$ echo $$
32352
그래서 저는 여기 있습니다:

saml 32352 0.0 0.0 114908 6304 포인트/88 SS 20:55 0:00 _ -bash

 # Now if I exit
 $ exit

  # I'm in this shell now
 $ echo $$
 32256
나는 지금 여기 있다:

Samuel32256 0.0 0.0 114980 6320 포인트/65 S 20:54 0:00 _ bash

 # Another exit
 $ exit

 # I'm now here
 $ echo $$
 7368
나는 마침내 여기에 있다:

saml 7368 0.0 0.0 122544 4608 포인트/65 Ss Jun28 0:05 _ bash

관련 정보