2

我有一种情况,只有root可以mailx,只有ops可以重新启动进程。我想制作一个自动脚本,既可以重新启动该过程,又可以发送一封有关这样做的电子邮件。

当我使用函数尝试此操作时,该函数“未找到”。

我有类似的东西:

#!/usr/bin/bash

function restartprocess {
/usr/bin/processcontrol.sh start
}

export -f restartprocess

su - ops -c "restartprocess"

mailx -s "process restarted" myemail.mydomain.com < emailmessage.txt

exit 0

它告诉我找不到该功能。经过一番排查,原来 ops 用户的默认 shell 是 ksh。

我尝试将脚本更改为在 ksh 中运行,并将“export -f”更改为“typeset -xf”,但仍然找不到该函数。喜欢:ksh:找不到导出功能

我终于放弃了,只是调用了脚本(直接在函数中)并且有效。这就像是:

su - ops -c "/usr/bin/processcontrol.sh start"

(这当然是对真实脚本的简化)。

鉴于用户 ops 的默认 shell 是 ksh 并且我无法更改或修改 sudoers,有没有办法导出一个函数,以便我可以 su 作为 ops(并且我需要运行 ops 的配置文件)并执行该函数?

我确保 ops 用户有权访问我希望它执行的脚本的目录,以及运行该脚本的权限。

任何有关这方面的教育将不胜感激!

4

1 回答 1

0

导出函数有很多限制,特别是结合su - ...不同的账户和不同的shell。

相反,把你的脚本翻过来,把所有要运行的命令放在调用shell的函数中。

类似的东西:(bash和ksh)

#!/usr/bin/bash

function restartprocess {
    /bin/su - ops -c "/usr/bin/processcontrol.sh start"
}

if restartprocess; then
    mailx -s "process restarted" \
        myemail@mydomain.com < emailmessage.txt
fi

exit 0    

这将隐藏函数/bin/su内部的所有处理restartprocess,并且可以随意扩展。

于 2012-09-11T01:06:42.797 回答