我可以设置一个perl脚本吗?

du7egjpx  于 2022-11-24  发布在  Perl
关注(0)|答案(3)|浏览(157)

我做了一个perl脚本来改变其他用户拥有的文件的所有者。脚本完成了。我的管理员将其保存在/sbin目录中,并使用chmod u+s name_of_script为它设置uid。但当我运行此脚本时,它给我错误,即chown操作是不允许的。我做了一个C程序,它的工作原理与下面相同。所以我的问题是,如果setuid是为Perl工作的,那么我不应该得到这个错误,因为C代码没有给予我任何错误。所以我可以为Perl脚本使用setuid吗?或者我应该使用C代码。
不要告诉我要求管理员改变所有者每一次。实际上在服务器我有用户名暂存和我在它主持一个joomla网站。现在,当我安装一些插件,然后与该插件相关的文件是由www-data拥有。所以这就是为什么我不想去管理员每一次。或者你可以给予我一些其他的解决方案也关于我的问题。

juzqafwq

juzqafwq1#

许多unix系统(可能是最现代的)忽略了解释器脚本上的suid位,因为它打开了太多的安全漏洞。
但是,如果您使用的是perl〈5.12.0,您可以运行设置了setuid的perl脚本,它们将以root身份运行。它的工作原理是,当正常的perl解释器运行时,它检测到您试图执行的文件设置了setuid位,然后它执行一个名为suidperl的程序。Suidperl负责提升用户的权限,并以超级安全模式启动perl解释器。suidperl本身以setuid root运行。
这样做的结果之一是自动打开污点模式。还会执行其他附加检查。您可能会看到如下消息:

Insecure $ENV{PATH} while running setuid at ./foobar.pl line 3.

perlsec提供了一些有关保护此类脚本的有用信息。
suidperl在默认情况下通常不安装。你可能需要通过一个单独的软件包来安装它。如果没有安装,你会收到以下消息:

Can't do setuid (cannot exec sperl)

话虽如此,你最好使用sudo来执行特权提升的操作。它更安全,因为你可以通过sudoers文件精确地指定允许执行的操作。
从perl 5.12.0开始,suidperl被删除了。因此,如果你想在设置了setuid的perl〉= 5.12.0上运行一个perl脚本,你必须编写自己的C Package 器。我再次推荐sudo作为一个更好的选择。

k7fdbhmy

k7fdbhmy2#

不,你不能在脚本上使用setuid,也就是chmod +s。脚本的解释器实际上需要setuid,但是这样做是一个非常糟糕的主意。非常糟糕。
如果你一定要用Perl写setuid,典型的做法是做一个setuid的小C Package 器,并在启动后执行Perl脚本。这给了你两个世界的好处,既有一个小而有限的setuid脚本,又有一个可用的脚本语言来完成这项工作。

8wtpewkr

8wtpewkr3#

如果您有一个允许这样做的sudo配置(就像大多数桌面linux发行版对普通用户所做的那样),您可以使用下面这行来启动您的perl脚本:

#!/usr/bin/env -S -i MYVAR=foo sudo --preserve-env perl -w -T

然后在使用system()或反勾之前,在脚本中显式设置$ENV{PATH}(以保留它):

$ENV{PATH} = '/usr/bin';

脚本明确提到的或者perl本身隐式使用的其他环境变量也必须进行类似的去污染(参见man perlsec)。
这可能会让你只需要输入一次root密码(每个终端)就可以运行脚本了(同样取决于你的sudo配置)。为了避免输入密码,你可以在/etc/sudoers的底部添加一行:

myusername ALL=(ALL) NOPASSWD:ALL

当然,在多用户系统中,您需要小心处理这一点。
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身份运行的脚本。

相关问题