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需要root执行并且我通常以非root身份登录并且每次都使用su是痛苦的......

这里还有其他简单的方法吗?

4

2 回答 2

0

您可以在系统中启用 sudo,只需将脚本更改为:

sudo jexec $jid who

然后你的 srcpt 可以作为普通用户运行。

于 2013-12-22T16:17:28.250 回答
0

whoFreeBSD 中的命令知道一个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为给定的监狱运行谁
  • 跳过 jls 的标题行, - 所以第一个输出将是主机。

也许有人知道更简单的解决方案,例如通过对ps输出进行排序或类似...

评论:您通常不想使用诸如command | while read管道分叉新外壳之类的结构,并且您丢失了循环内设置的变量的值,done < <( commands )通常更好...

于 2013-11-07T22:28:57.343 回答