現在存在するすべてのローカルシェルとリモートシェルを繰り返し印刷する方法はありますか?
たとえば、私のローカルコンピュータから別のコンピュータに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、rootとしてsudo、通常のUID 501にsudo、その後rootに戻る)。
[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