【问题标题】:Permission denied when i exec Postfix reload in a perl script当我在 perl 脚本中执行 Postfix reload 时权限被拒绝
【发布时间】:2012-12-20 18:10:51
【问题描述】:

我有一个通常应该重新加载 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';

【问题讨论】:

    标签: perl exec root reload postfix-mta


    【解决方案1】:

    你的意思可能是:

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

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

    /etc/postfix 很可能是一个不可执行的配置文件,因此权限被拒绝错误。您可以使用which postfix在您的系统上找到postfix的路径

    【讨论】:

    • 在终端我可以执行 $postfix reload,在测试你的解决方案后我得到:没有这样的文件或目录
    • 使用which postfix 查找后缀二进制文件的路径
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 2021-02-04
      • 2019-11-22
      • 2019-05-02
      • 1970-01-01
      相关资源
      最近更新 更多