현재 있는 모든 로컬 및 원격 쉘을 반복적으로 인쇄하는 방법이 있습니까?
예를 들어 내 로컬 컴퓨터에서 다른 컴퓨터로 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