Linux 从perl启动bash时命令失败,但从命令行启动时命令失败,权限问题

Linux 从perl启动bash时命令失败,但从命令行启动时命令失败,权限问题,linux,perl,bash,cgi,Linux,Perl,Bash,Cgi,我创建了一个bash脚本,它应该从perl脚本开始。当我直接从终端运行bash时,它就像一个符咒。但是,当尝试从PERL脚本运行bash时,我得到了很多权限错误 我所做的活动是创建文件/目录/重新启动应用程序/等等。我应该如何配置,以便perl脚本能够在没有权限错误的情况下执行bash 我从perl执行命令,如下所示: system($file, $arg); bash中的命令示例: exec 1>$1.log exec 2>$1_error.log mkdir /opt/$1

我创建了一个bash脚本,它应该从perl脚本开始。当我直接从终端运行bash时,它就像一个符咒。但是,当尝试从PERL脚本运行bash时,我得到了很多权限错误

我所做的活动是创建文件/目录/重新启动应用程序/等等。我应该如何配置,以便perl脚本能够在没有权限错误的情况下执行bash

我从perl执行命令,如下所示:

system($file, $arg);
bash中的命令示例:

exec 1>$1.log
exec 2>$1_error.log

mkdir /opt/$1
上述命令的错误日志示例:

[Wed Aug 10 18:17:17 2011] [error] [client 192.168.1.100] /opt/otrsadm/newinstance.sh: line 3: comp.log: Permission denied
[Wed Aug 10 18:17:17 2011] [error] [client 192.168.1.100] /opt/otrsadm/newinstance.sh: line 4: comp_error.log: Permission denied
[Wed Aug 10 18:17:17 2011] [error] [client 192.168.1.100] mkdir: 
[Wed Aug 10 18:17:17 2011] [error] [client 192.168.1.100] cannot create directory `/opt/comp'
[Wed Aug 10 18:17:17 2011] [error] [client 192.168.1.100] : Permission denied
[Wed Aug 10 18:17:17 2011] [error] [client 192.168.1.100]
我正在做的是在Apache上创建一个全新的应用程序实例。这意味着,bash正在创建必要的dir,将应用程序复制到该dir,创建新数据库并加载模板转储,复制apache的特定于应用程序的配置文件并交换该文件中的一些字符串,等等


我是一个全新的做这种活动,所以任何可能的帮助是高度赞赏

我猜您当前的工作目录在perl脚本中是错误的-您试图在一个您没有创建目录权限的目录中执行bash命令。

在您的日志中,有一条跨行的错误消息:

mkdir: 
cannot create directory `/opt/comp'
: Permission denied
您的Perl脚本是否可能使用包含换行符的参数调用bash脚本?(尽管这不能解释为什么“mkdir:”本身就在一条线上。)


您是否拥有对
/opt
的写入权限?

将opt目录的权限更改为777(每个人都可以读取/写入/执行)

chmod 777/opt/


我想这可能会解决你的问题

您的脚本在与Apache进程相同的权限下运行。良好的安全实践要求您的web服务器拥有尽可能有限的权限来更改可能由web服务器运行的文件

因为这听起来正是您想要做的,所以诀窍是尽可能少地放松权限以获得您想要的结果

我的建议是查看程序
sudo
。它可以作为更具特权的用户运行程序,并提供一些合理的访问控制。基本思想是创建一个由root用户拥有且只能写的脚本。然后允许apache用户(或httpd,或您的系统调用运行apache的用户的任何东西)通过
sudo
以具有写入
/opt
权限的用户身份执行该脚本。如果您可以作为权限低于root的用户来执行脚本,这也很好

假设您的脚本中有良好的错误检查,并且遵循所有良好的安全实践,那么您将相当安全


<> P>>强>强/强。考虑向有经验的、有安全感的开发人员提供帮助,帮助您建立这一点。建立这样一个系统需要一种不同的思维方式来维护安全,而这是你无法从答案中得到的。否则,您可能必须向您的老板解释,一个来自某个随机国家的13岁小孩是如何删除您公司的所有数据的,或者更糟的是如何在BitTorrent上发布这些数据的。

您是否将perl脚本作为CGI脚本运行?它将在Web服务器的UID下运行,而不是您自己的UID。是的,将其作为CGI运行。我开始明白我需要做什么,我只是不知道怎么做。1.识别正在运行脚本2的用户。允许该用户在不同的目录中执行其需要执行的操作。是吗?是的。如果它是在Apache下运行的CGI脚本,您需要获取Apache对目录的写入权限。这是故意拼错了“pearl”,而不是首字母缩略词。大多数事情都在起作用。有人能告诉我为什么exec命令与其他命令(mkdir等)不同吗。我的帖子中的exec行仍然拒绝给我权限,尽管我已经给了dir权限777(用于测试…),我这样做了。实际上,我现在设法创建了目录。我也会去另一个我想去做事情的地方。(很抱歉,在我发现确实存在差异之前,我很快回答了这个问题)。但这会产生一系列其他问题,主要是与安全相关的问题。世界可写目录几乎从来都不是一个好主意,也不应该是第一个尝试过的解决方案。我认为需要更多关于实际问题的信息。不确定现在应该发布什么(在更新我的评论之后)。我正在做的是在Apache上创建一个全新的应用程序实例。这意味着,脚本将创建必要的目录,将应用程序复制到该目录,创建新数据库并加载模板转储,复制apache的特定于应用程序的配置文件,并在该文件中交换一些字符串。我可以将此添加到帖子中。@Nicsoft:如果您处于受控环境中,并且了解安全权衡,chmod 777可能是使您的方案工作的一种快速而肮脏的方式。就我个人而言,我仍然希望至少只向apache所有者授予写权限,而不是所有人,但实际上这可能没有多大区别。一般来说,拥有apache用户可写的任何内容,特别是足够的写权限来实际设置新的web应用程序,都会导致灾难。您不希望您的web应用程序的恶意用户能够写入您的文件系统并设置新的应用程序。@Nicsoft:我的主要偏好是根本不通过Apache执行此操作,而是以管理用户身份登录到计算机并手动启动脚本。如果绝对有必要通过web服务器执行此操作,我将研究脚本周围的某种setuid包装器,以允许apache用户仅出于定义脚本的目的限制权限提升。然后我将审核脚本、setuid包装器和p