我使用此代码执行了来自mod_exec proftpd的外部脚本。
执行引擎ExecLog /opt/proftpd_mod_exec.logExecOptions logStderr logStdout
<IfUser yogi>
ExecBeforeCommand STOR,RETR /home/yogi/Desktop/kab.sh EVENT=BeforeCommand FILE='%f'
ExecOnCommand STOR,RETR /home/yogi/Desktop/kab.sh EVENT=OnCommand FILE='%f'
</IfUser>
但是我在proftpd_mod_exec.log文件上得到了这样的错误代码。 STOR ExecBeforeCommand'/home/yogi/Desktop/kab.sh'失败:Exec格式错误
我该如何解决?
来自http://www.proftpd.org/docs/contrib/mod_exec.html
此模块不适用于登录名或受DefaultRoot影响的登录名。这些指令使用chroot(2)系统调用,该脚本调用会造成严重破坏。脚本/ shell解释器的路径通常假定某个位置在chroot中不再有效。此外,大多数现代操作系统都将动态加载的库(.so库)用于许多二进制文件,包括脚本/ shell解释器。这些库在要加载时的位置也被假定;这些假设在chroot中被打破了。特别是Perl,是在文件系统位置假设的基础上设计的,以致几乎不可能使Perl脚本在chroot中工作,而无需将Perl本身安装到chroot环境中。
从错误消息中听起来就这样。您已启用chroot,由于文件在chroot中的预期位置不可用而无法执行该脚本。
作者因此建议不要使用该模块。要使其正常工作,您需要在chroot目标中找出所需的依赖项,并将其设置在适当的位置。或为用户禁用chroot,然后重试。第三种可能性:构建几乎没有依赖项的静态链接二进制文件。
或按照该模块的作者的建议,尝试使用FIFO和proftpd日志记录功能来触发chroot环境之外的脚本。