在通过ssh登录时,查看是否有本地用户登录

我需要在一台只能远程访问但也作为工作站的机器上运行一些计算。有很多这样的机器,我想挑选一个“空闲”的机器。在这种情况下,“空闲”意味着没有任何人在本地登录。
我的第一次尝试是使用“who”命令,但由于某种原因它只列出了“选择”的用户,我无法弄清楚它们是如何被选择的。 接下来的尝试是:ps aux | cut -d " " -f1 | sort | uniq:更好地显示了一堆守护进程,但也显示了未被who显示的本地用户。
我的当前解决方案是进入并执行“ps aux | grep“gnome-session””,这样做更好,但仍然会给我带来很多垃圾信息。理想情况下,我正在寻找一些可以包含在我的ssh配置文件中的东西,在我登录时警告我有(活动的)本地用户。
编辑:
- 无论是“who”还是“w”,都没有返回本地用户。这是意外的行为吗? - 另一方面,“uptime”向我显示了正确数量的用户(本地和远程减去像root这样的系统用户) - “finger”未安装

我还注意到w,who和users没有返回本地用户。 这是Ubuntu 12.04上的新而意外的行为。当(现在非常恼人地)有用户登录时,我刚重新启动了一些实验室机器。 - user71375
8个回答

使用ww man页面:
显示谁登录了以及他们在做什么。
输出示例:
$ w
09:15:10 up 43 min,  2 users,  load average: 0.74, 0.38, 0.24

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT

kucing   tty7     :0               08:32   43:15m 57.73s  0.18s x-session-manager
kucing   pts/0    :0.0             08:48    0.00s  0.24s  0.00s w´

请问是否已安装了finger命令,如果没有的话,能否安装一下?该命令可以列出所有已登录的用户及其登录位置(即另一台机器或直接登录到本机),还可以告诉您该用户已经闲置了多长时间。
更多信息请参阅ubuntu finger manpage

根据网络设置,您甚至可以在不登录的情况下使用finger查询远程机器(尽管现代防火墙可能会阻止该功能)。 - ImaginaryRobots
finger 未安装。有一个名为 safe_finger 的应用,但它失败了,因为显然依赖于 finger - sebastiangeiger
1@sebastiangeiger safe_finger作为tcpd软件包的一部分存在,无论是否实际安装了提供finger命令的finger软件包(safe_finger只是其包装器)。建议在与远程机器上的finger服务器联系时使用safe_finger(尤其是那些您自己不管理并确保不会引起客户端问题的机器)。如果您在本地使用finger,则不需要使用safe-finger - Eliah Kagan

我会选择:
who | cut -d' ' -f1 | sort | uniq

这将显示一个真实用户列表。如果列表为空-机器处于注销状态,等待有人登录。
ps aux还会显示一些系统用户,你可能不想看到。

但你可能需要考虑另一种情况,当人们通过按下Ctrl+Alt+L键来离开他们的工作场所时,而不是注销。我就是这样做的! :) - Andrejs Cainikovs
1奇怪的是,“who”没有显示给我本地用户。我知道他在那台机器上积极工作 - 他抱怨我占用了工作站。难道是“who”在行为不端吗? - sebastiangeiger
@sebastiangeiger 根据Andrejs Cainikovs的建议,如果用户锁定了他们的工作站,你是否希望将其视为本地登录?也许不会,因为他们并没有直接与机器进行交互。但是也可能会,因为他们仍然可能在运行程序和执行计算(或其他操作),这些操作会占用CPU资源,可能会从你的工作中占用资源,或者被其他工作占用资源。同样的问题,如果用户在虚拟控制台上本地登录,你是否希望将其视为“本地登录”,还是只有图形界面登录才算? - Eliah Kagan
@EliahKagan 理想情况下,我希望用户在本地运行X会话。了解锁定工作站或通过ssh登录的用户也是很好的,但我的首要任务是找出当前是否有人在本地(并且正在积极地)使用它。 - sebastiangeiger
@sebastiangeiger 那么对于通过基于文本的虚拟控制台本地登录的用户呢? - Eliah Kagan
@EliahKagan通常不会发生这种情况,事实上,我确信在这些工作站上寻找gnome-session会足够99%的时间。 - sebastiangeiger

last

它会查看/var/log/wtmp并显示最后登录的用户日志,包括当前已登录的用户。


看起来非常有希望,我得在星期一去办公室的时候再确认一下,那时候会有人在工作。 - sebastiangeiger

考虑将计算的最高优先级设置为最高。这样可以避免占用其他可能登录的用户的资源。
nice -n 19 your_calculation_command

创意,我喜欢。 - sebastiangeiger
1@sebastiangeiger 当然,最好的做法是定期(比如每分钟使用用户crontab)检查是否有本地用户登录,如果有,则降低优先级;如果没有,则增加优先级(这样即使有其他远程用户或系统进程占用大量CPU,也能完成工作)。当然,要实现这一点,需要可靠的方法来判断是否有本地用户登录。(还需要解决非“root”用户无法将进程优先级降低到更低的问题,即使它是由该用户启动的。) - Eliah Kagan

我的答案是以独特的方式列出每个已登录的用户。

w | tail -n +3 | cut -d " " -f1 | sort | uniq

我喜欢这个。
for i in $(ls /dev/pts/*);do echo "TTY $i - $(ps e -t $i|grep -oP "(?<=(RUSER\=))[a-z]*"|uniq)";done ; echo -e '\n+++\n';  for i in $(pgrep ssh);do pstree -paul $i;done

一个快速而粗糙的尝试:
ps au --no-heading | cut -d " " -f1 | uniq