使用sudo在单个命令中运行“我是谁”不会返回任何内容

时间:2014-10-02 20:20:39

标签: linux bash redhat

我试图以下列方式在一行中运行“我是谁”命令并且它什么都不返回。

echo $password | sudo -u user -S who am i

甚至logname命令也不能以这种方式工作。

echo $password | sudo -u user -S logname

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

当使用两个参数调用who时,会激活-m标志。来自manual page

-m
    only hostname and user associated with stdin

在您的情况下,标准输入是管道而不是终端,who(或logname)无法确定关联用户。请考虑以下shell命令代码段:

$ who am i
user   pts/11       2014-09-04 00:15
$ logname
user
$ echo | who am i
$ echo | logname
logname: no login name
$ 

来自GNU Coreutils who.c来源:

if (my_line_only)
  {
    ttyname_b = ttyname (STDIN_FILENO);
    if (!ttyname_b)
      return;
    if (STRNCMP_LIT (ttyname_b, DEV_DIR_WITH_TRAILING_SLASH) == 0)
      ttyname_b += DEV_DIR_LEN; /* Discard /dev/ prefix.  */
  }

由于ttyname()会在错误上返回NULL,例如文件描述符与终端(ENOTTY)不对应,who -m会在stdin时立即返回是一个管道。

对于logname,其正确的行为是返回getlogin()函数返回的字符串。不幸的是,the getlogin() manual page的错误部分非常明确:

  

请注意,glibc不遵循POSIX规范并使用stdin而不是/ dev / tty。一个bug。 (其他最新系统,如SunOS 5.8和HP-UX 11.11以及FreeBSD 4.8,在重定向stdin时也会返回登录名。)

结论:您应该更新代码以使用hostname,例如id -un或您的shell解释器可能提供的任何其他方式来确定当前用户。 who -m及其朋友不是很容易预测 - 老实说,who的输出与ls非常相似,具有明确的人类意识,而不是机器。