我做了一个perl脚本来改变其他用户拥有的文件的所有者。脚本完成了。我的管理员将其保存在/sbin目录中,并使用chmod u+s name_of_script为它设置uid。但当我运行此脚本时,它给我错误,即chown
操作是不允许的。我做了一个C程序,它的工作原理与下面相同。所以我的问题是,如果setuid是为Perl工作的,那么我不应该得到这个错误,因为C代码没有给予我任何错误。所以我可以为Perl脚本使用setuid吗?或者我应该使用C代码。
不要告诉我要求管理员改变所有者每一次。实际上在服务器我有用户名暂存和我在它主持一个joomla网站。现在,当我安装一些插件,然后与该插件相关的文件是由www-data拥有。所以这就是为什么我不想去管理员每一次。或者你可以给予我一些其他的解决方案也关于我的问题。
3条答案
按热度按时间juzqafwq1#
许多unix系统(可能是最现代的)忽略了解释器脚本上的suid位,因为它打开了太多的安全漏洞。
但是,如果您使用的是perl〈5.12.0,您可以运行设置了setuid的perl脚本,它们将以root身份运行。它的工作原理是,当正常的perl解释器运行时,它检测到您试图执行的文件设置了setuid位,然后它执行一个名为suidperl的程序。Suidperl负责提升用户的权限,并以超级安全模式启动perl解释器。suidperl本身以setuid root运行。
这样做的结果之一是自动打开污点模式。还会执行其他附加检查。您可能会看到如下消息:
perlsec提供了一些有关保护此类脚本的有用信息。
suidperl在默认情况下通常不安装。你可能需要通过一个单独的软件包来安装它。如果没有安装,你会收到以下消息:
话虽如此,你最好使用sudo来执行特权提升的操作。它更安全,因为你可以通过sudoers文件精确地指定允许执行的操作。
从perl 5.12.0开始,suidperl被删除了。因此,如果你想在设置了setuid的perl〉= 5.12.0上运行一个perl脚本,你必须编写自己的C Package 器。我再次推荐sudo作为一个更好的选择。
k7fdbhmy2#
不,你不能在脚本上使用
setuid
,也就是chmod +s
。脚本的解释器实际上需要setuid
,但是这样做是一个非常糟糕的主意。非常糟糕。如果你一定要用Perl写
setuid
,典型的做法是做一个setuid
的小C Package 器,并在启动后执行Perl脚本。这给了你两个世界的好处,既有一个小而有限的setuid
脚本,又有一个可用的脚本语言来完成这项工作。8wtpewkr3#
如果您有一个允许这样做的sudo配置(就像大多数桌面linux发行版对普通用户所做的那样),您可以使用下面这行来启动您的perl脚本:
然后在使用
system()
或反勾之前,在脚本中显式设置$ENV{PATH}(以保留它):脚本明确提到的或者perl本身隐式使用的其他环境变量也必须进行类似的去污染(参见
man perlsec
)。这可能会让你只需要输入一次root密码(每个终端)就可以运行脚本了(同样取决于你的sudo配置)。为了避免输入密码,你可以在
/etc/sudoers
的底部添加一行:当然,在多用户系统中,您需要小心处理这一点。
env的
-S
选项将字符串拆分为单独的参数(这样就可以使用选项以及sudo/perl等程序与shebang机制的组合)。env
的-i
选项会完全清除环境。MYVAR=foo
引入了环境变量定义。sudo的
--preserve-env
选项将保留MYVAR
和其他选项。sudo
会在发现例如缺少PATH
时为您设置最小环境。env
的-i
选项和sudo
的--preserve-env
选项可能都被省略,您可能会得到原始环境中的变量列表,其中包括一些与X相关的变量(大概是sudo配置认为安全的那些)。没有-i
的--preserve-env
将最终沿着整个未清理的环境。perl的
-w
和-T
选项通常适用于以root身份运行的脚本。