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

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

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

たとえば、私のローカルコンピュータから別のコンピュータに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またはコマンド名を印刷するために上記の内容を簡単に変更できなければなりませんが、一般的にこれについて考える人は、どのシェルで実行するのか、誰で実行するのかに興味があります。

おすすめ記事