人。
这是我的问题:
我有一个可执行文件,需要在系统中的特定位置创建一个文件夹。
我希望无论谁执行它都能做到这一点。
我的想法是将父文件夹(可执行文件需要在其中创建文件夹的文件夹)分配给用户,并将可执行文件分配给同一用户。然后在可执行文件上设置setuid位。这样,可执行文件将以该用户的权限执行,因此它具有该文件夹的权限。
这就是问题:可执行文件使用了它旁边的共享库。
当我在没有setuid的情况下启动它时,一切正常(嗯,显然,除了创建文件夹以外,但可执行文件已启动)。
但是,当我使用setuid位启动它时,系统会告诉我它找不到共享库,该共享库显然没有被移动,并且拥有所有人的读取和执行权限。
发生了什么事?我想念什么?
谢谢。
答案 0 :(得分:0)
需要在系统中的特定位置创建一个文件夹。
在UNIX系统上没有文件夹,正确的名称是“目录”。
然后在可执行文件上设置setuid位
通常,这是一个非常糟糕的主意(TM)。编写将作为setuid可执行文件的一部分正确运行的代码需要格外小心,而您询问此问题的事实表明您可能尚未准备好执行此任务。
当我在没有setuid的情况下启动它时,一切正常
二进制文件如何找到所需的共享库?
您很有可能将LD_LIBRARY_PATH
设置为包括共享库所在的目录。
但是,当我使用setuid位启动它时,系统会告诉我找不到共享库,
如果我的LD_LIBRARY_PATH
猜测是正确的,则可以预期:setuid二进制文件忽略LD_LIBRARY_PATH
(出于明显的安全原因)。
您可以在链接可执行文件的同时使用-Wl,--rpath='$ORIGIN'
并取消设置LD_LIBRARY_PATH
来解决此问题-可执行文件现在无论是否带有setuid位都可以使用。