現在のすべてのリモートシェルを再帰的に印刷できますか?

現在のすべてのリモートシェルを再帰的に印刷できますか?

現在存在するすべてのローカルシェルとリモートシェルを繰り返し印刷する方法はありますか?

たとえば、私のローカルコンピュータから別のコンピュータに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

関連情報