当我在perl脚本中执行Postfix重载时,权限被拒绝

时间:2012-12-20 09:43:42

标签: perl exec root reload postfix-mta

我有一个通常应该重新加载Postfix的脚本,但我在/../../reload.pl 11获得了许可被拒绝。

这是我的perl脚本:

#!/usr/bin/perl -w
#
# Script Name : reload postfix
# version : v1.0
#
$ENV{PATH} = '/usr/bin';

print $<." ".$>;

# Relaod postfix (opt)
system('/etc/postfix reload');

结果是:

0 0
Can't exec "/etc/postfix": permission denied at /../../reload.pl  11

解决方案是提供执行postfix cmd的完整路径:

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

2 个答案:

答案 0 :(得分:3)

你可能意味着:

system("$ENV{PATH}/postfix reload");

system("/path/to/postfix/binary/postfix reload");

/etc/postfix很可能是一个不可执行的配置文件,因此权限被拒绝错误。您可以使用postfix

在系统上找到which postfix的路径

答案 1 :(得分:2)

您可以通过postfix控件二进制文件本身或通过init脚本重新加载postfix。 init脚本只执行postfix控制二进制文件,其中reload为参数,因此您可以跳过它。

您看到原始错误的原因是/etc/postfix可能是包含配置文件的目录。您无法执行目录。

因此,您应该执行控制二进制文件。这通常位于/usr/sbin/postfix,而不是/usr/bin。您也无需为其设置PATH。因此:

  1. 删除$ENV{PATH} = ...行,您不需要它。
  2. 将系统调用更改为system("/usr/sbin/postfix reload");