我创建了一个新的whoami
命令,该命令需要一个假的用户名,并通过将其添加到〜/ .profile将其放入PATH中。它是以一种whoami
的方式创建的,之后实际上是来自Linux的实际whoami。
这样做的主要原因是因为我正在远程访问Hadoop集群并希望复制的文件位于假用户名下。
当我在shell中调用whoami
并且甚至调用$ PATH在其他所有内容之前显示我创建的whoami的路径时,这样可以正常工作。但出于某种原因,当Hadoop被调用时,它不会选择创建的“whoami”。
有人可以帮我解决这个问题吗?
感谢
答案 0 :(得分:2)
大多数应用程序不使用whoami
来确定用户的用户名或组。例如,在bash中,您可以使用命令id
查找有关您自己或id [username]
的详细信息(例如id root
),以查找有关其他用户的更多详细信息。也可以使用groups
找到群组。此外,不同的编程语言(如C)也有自己的方法来确定用户身份,例如getuid()
命令。
如果你真的“需要”伪造你的用户帐户,你需要深入到操作系统级别并创建处理这些方法的内核/ API的钩子。
是否有可能只是在复制文件后chown
文件?
<强>更新强>
看来Hadoop的某些版本实际上使用whoami
(我自己的实现没有集群)。
在这种情况下,最好的(一个松散使用的术语)建议是移动合法的whoami
可执行文件并创建一个whoami
shell脚本。自定义脚本应验证当前用户,如果它是“hadoop”,则返回您想要的任何伪造用户名 - 否则返回有效输出。伊戈尔的回答在这种情况下会有效。
答案 1 :(得分:2)
我认为hadoop使用了你的shell中的其他PATH
变量。
您可以调整其PATH并将假冒whoami
的目录添加到其开头。
如果不可能,
您可以为whoami
编写一个小包装器(我不确定这是一个好主意,但如果您愿意,可以执行此操作)将运行原始whoami
,除非脚本由hadoop执行:
#!/bin/sh
WHOAMI=/bin/whoami.orig
if [ "$($WHOAMI)" = hadoop ]
then
echo fake
else
exec $WHOAMI "$@"
fi