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

时间:2012-03-16 15:01:05

标签: linux perl redhat

我开发了一个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身份登录来运行脚本,那么它就会成功运行。

有没有办法让这个工作?我不希望用户能够以perluser身份登录,因为我需要控制他们能够运行的内容。我也不想运行像

这样的命令
system("sudo -u perluser clear");

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

谢谢,

2 个答案:

答案 0 :(得分:4)

我认为您可能需要将-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

答案 1 :(得分:0)

我知道这是一种略有不同的方法,但是你不能将perluser的shell设置为/data/perlscripts/scripta.pl吗?如果您有多台计算机,这可以避免通常与sudo配置相关的麻烦。最终用户只需使用login perluser代替sudo。脚本退出时,登录会话将消失。没有必要提供比这更多的监狱吗?

替代(也许是正确的)回答

我认为问题的根源在于Perl的exec 在大多数情况下不会使用shell。这意味着"clear"没有意义,因为shell实现了搜索$PATH以查找命令。这是相关的perldoc from system。请注意重点。

  

o 系统列表

     

o 系统计划列表

     

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

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