当使用sudo作为另一个用户运行时,Perl系统调用



我开发了一个perl脚本,它提供了菜单驱动的功能,允许用户执行一些简单的任务。

我需要用户能够以不同的用户身份执行任务,如复制文件(保持当前日期和权限)、运行其他程序(如less或vi)。该脚本使用了大量的system()函数。我希望用户通过调用来启动菜单

sudo -u perluser /usr/bin/perl /data/perlscripts/scripta.pl

这应该以perl用户的身份启动脚本,然后根据用户的选择执行不同的任务。问题是,每当我使用诸如之类的系统调用时

system("clear");

我得到以下错误

Can't exec "clear": Permission denied at /data/perlscripts/scripta.pl line 3

如果我以perluser身份登录来运行脚本,那么一切都会成功运行。

有什么办法让它发挥作用吗?我不希望用户能够登录,因为我需要控制他们能够运行的内容。我也不想运行像这样的命令

system("sudo -u perluser clear");

因为我需要一个不同的团队来设置我想要运行的所有sudo命令(他们可能会拒绝这样做),如果我必须在某个时候添加额外的命令,这将是不可扩展的。

谢谢,

我认为您可能需要将-i选项("模拟初始登录")添加到sudo:

sudo -i -u perluser /usr/bin/perl /data/perlscripts/scripta.pl

这将确保.profile.login或其他什么都能正常运行,从而确保$PATH的设置正确等等。几乎在所有方面,perluser都会真正登录并在shell上运行/usr/bin/perl /data/perlscripts/scripta.pl

我知道这是一种略有不同的方法,但您不能将perluser的shell设置为/data/perlscripts/scripta.pl吗?如果您有多台机器,这将避免通常与sudo配置相关的头痛。最终用户将简单地使用CCD_ 11而不是CCD_。当脚本退出时,登录会话将消失。没有必要提供比这更多的监狱吗?

备用(可能是正确的)答案

我认为问题的根源在于Perl的exec在大多数情况下都不使用shell。这意味着"clear"是没有意义的,因为shell是通过$PATH搜索来找到命令的。以下是来自system的相关perldoc。注意重点。

o系统列出

o系统程序列表

执行与exec LIST完全相同的操作,不同之处在于首先执行分叉,父进程等待子进程退出。请注意,参数处理因参数的数量而异。如果LIST中有多个参数,或者LIST是一个具有多个值的数组,则使用列表其余部分提供的参数启动列表第一个元素提供的程序如果只有一个标量参数,则检查该参数的外壳元字符,如果有,则将整个参数传递给系统的命令外壳进行解析(在Unix平台上为/bin/sh -c,但在其他平台上有所不同)如果参数中没有shell元字符,则将其拆分为单词并直接传递给execvp,这样效率更高

尝试将system("clear")更改为system("/usr/bin/clear")system("clear;")

相关内容

最新更新