0

ログインしているすべてのユーザーを、FreeBSD 刑務所でソートして表示するスクリプトを探しています。そのため、who現在実行中のすべての FreeBSD 刑務所とメインホストでもコマンドを実行する必要があります。

私はこれを作ります:

who    #main host
jls | grep -v JID | while read jid ip host path
do
    echo $jid $host
    jexec $jid who
done

しかし、jexecルートの実行が必要で、通常は非ルートとしてログインしていて、毎回 su を作成するのは苦痛です...

他に簡単な方法はありますか?

4

2 に答える 2

0

システムで sudo を有効にして、スクリプトを次のように少し変更できます。

sudo jexec $jid who

その後、スクリプトは通常のユーザーとして実行できます。

于 2013-12-22T16:17:28.250 に答える
0

FreeBSDのwhoコマンドはfile、ログインしているユーザーに関する情報を読み取る場所からの引数を知っています。デフォルトは/var/run/utx.active- で、ファイルは通常誰でも読み取り可能です...

おそらく次のスクリプトで十分でしょう。

#!/usr/local/bin/bash

while read  jpath
do
    echo JWHO: ${jpath:-$(hostname)}
    who "${jpath}/var/run/utx.active"
done < <( jls -h path | sed '1s:.*::' )

出力例:

JWHO: marvin.example.com
smith              pts/0     7 nov 20:55 (adsl2343-some-another.example.com)
JWHO: /jails/jail1
JWHO: /jails/testjail
root              pts/2     7 nov 20:55 (someother.example.com)
JWHO: /jails/dbjail

手順:

  • 実行中のすべての刑務所の「ルートファイルシステム」へのパスを表示します
  • /var/run/utx.active指定された刑務所の who を実行します
  • jls からヘッダー行をスキップします。つまり、最初の出力がホストになります。

たぶん、誰かがもっと簡単な解決策を知っているかもしれません。たとえば、ps出力を並べ替えるなど...

コメント: 通常は次のような構造を使用したくありませんcommand | while read- パイプが新しいシェルをフォークし、ループ内で設定された変数の値を失うと、done < <( commands )通常はより良い...

于 2013-11-07T22:28:57.343 に答える