我遇到了一个奇怪的问题:在 GUI 会话中,根据所使用的终端,会出现以下两个(相关)问题:
who
并且w
不列出用户的活动会话logname
返回logname: no login name
它发生在以下终端:
- 外部终端
- xfce4-终端
- 接收
另一方面,在以下场景中它可以完美运行(who/w 列出用户和 logname 功能):
- ssh 接入
- xterm / lxterm / uxterm
答案1
我找到的最佳答案在这里:https://stackoverflow.com/a/1629628/3196753
IE
echo ${SUDO_USER:-${USER}}
或者
logname 2>/dev/null || echo ${SUDO_USER:-${USER}}
值得一提的是,它适用于 MacOS 10.8、10.11,并且已在 Ubuntu 12.04 中得到确认。
这2>
是为了抑制logname: no login name
从 Ubuntu 16.04 开始由于上游 gnome-terminal 错误。
:-${USER}
意味着如果$SUDO_USER
为空(当 sudo 实际上未被使用时),则替换 的值$USER
。
答案2
我在 16.04 中发现了同样的问题。我有几个使用 logname 的脚本,现在它们不起作用了。我找到了一个解决方法。以我自己的身份登录时,我使用我的登录用户名在我的主目录中放置了一个文件:
echo $LOGNAME > ~/.logname;
当我想访问我的日志名时,我这样检索它:
g_logname="$(<~/.logname)";
无论我是以自己还是 root 身份运行脚本,这种方法都有效,因为 sudo root 将“~”的定义保留为我的主目录。我可以为系统上的每个用户创建一个 .logname 文件。此方法有效,而从 root 级别调用时使用 $USER 和 $LOGNAME 则无效。确实,有人可能会破解它并更改文件中的值,但我并不担心。您始终可以将文件的权限更改为 444,并将所有者:组更改为 root:root,这将阻止任何没有 root 权限的人。