我开发了一个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命令(他们可能会拒绝这样做),如果我必须在某个点添加额外的命令,这将无法扩展。
谢谢,
答案 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;")
。