无法执行二进制文件错误

时间:2012-04-25 21:43:31

标签: linux shell

我有一个shell脚本,我试图以特定用户身份运行。我的命令如下:

su - jetty sh ./runProgram.sh

当我尝试通过控制台运行此命令时,我收到错误消息:

/bin/sh: /bin/sh: cannot execute binary file

我也尝试过:

 su - jetty sh runProgram.sh

我仍然得到同样的错误..

如果我这样做,它会起作用:

sh runProgram.sh

但是这个shell脚本应该由特定用户运行。有关如何使这个工作的任何建议??

2 个答案:

答案 0 :(得分:4)

尝试

su - jetty -c sh runProgram.sh

答案 1 :(得分:1)

根据su的文档(info coreutils 'su invocation'),它默认执行shell,su的参数作为参数传递给shell。

这意味着:su本质上是这样做的:      /bin/sh *arguments_to_su* 但它作为另一个用户(“有效用户ID”)...就是这样......所以

su - jetty sh ./runprogram.sh

类似于

(become the user jetty via login or su)
/bin/sh sh ./runprogram.sh

...并且shell将报告错误,因为/bin/sh调用的第一个su正在尝试将程序sh作为shell脚本运行,{{1} 1}}作为其论点。但是sh本身不是一个shell脚本,它是一个二进制文件(它的工作就是运行shell脚本)。

如果您只是这样做:

./runprogram.sh

然后su - jetty ./runprogram.sh 命令将以su作为参数调用/bin/sh,并将jetty作为有效用户ID,并且一切都应该正常。 ...应该没问题,因为你正在做一个./runprogram.sh,你正在使shell成为一个登录shell并更改为用户的主目录。如果su -不在主目录中,则会出现错误。

这就是为什么你不能运行例如只需运行runprogram.sh命令:

cp

...因为,再次,在su - jetty cp file1 file2 将有效用户ID更改为jetty之后,它会尝试这样做:

su

...而/bin/sh cp file1 file2 不是shell脚本。但是cp选项适用于这种情况;因为你告诉-c你想用shell的-c选项运行su

/bin/sh

完成这项工作。请注意,您必须引用该命令,因为整个字符串将传递给shell并且(我相信)将忽略任何后续参数。

最后,上一张海报的答案在Linux上对我不起作用,它需要引用整个命令字符串。