我试图以下列方式在一行中运行“我是谁”命令并且它什么都不返回。
echo $password | sudo -u user -S who am i
甚至logname命令也不能以这种方式工作。
echo $password | sudo -u user -S logname
有人可以帮忙吗?
答案 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
非常相似,具有明确的人类意识,而不是机器。