1

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

su - jetty sh ./runProgram.sh

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

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

我也试过:

 su - jetty sh runProgram.sh

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

如果我这样做,它确实有效:

sh runProgram.sh

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

4

2 回答 2

4

尝试

su - jetty -c sh runProgram.sh
于 2012-04-25T21:46:10.047 回答
2

根据的su文档(info coreutils 'su invocation'su

含义很简单: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 脚本运行,并./runprogram.sh以它的参数作为参数。但是 sh 本身不是一个 shell 脚本,它是一个二进制文件(它的工作是运行 shell 脚本)。

如果你只是这样做:

su - jetty ./runprogram.sh

然后该su命令将以/bin/sh程序./runprogram.sh作为参数调用,jetty 作为有效用户 ID,一切都应该很好。...应该很好,因为你正在做一个su -你正在做的外壳登录外壳并更改到用户的主目录。如果runprogram.sh不在主目录中,则会出现错误。

这也是为什么您不能运行例如运行cp命令的原因:

su - jetty cp file1 file2

...因为,同样,在su将有效用户 ID 更改为码头后,它将尝试以下操作:

/bin/sh cp file1 file2

...并且cp不是 shell 脚本。但是该-c选项在这种情况下有效;因为您告诉su您要/bin/sh使用 shell 的 -c 选项运行:

su - jetty -c "cp file1 file2"

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

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

于 2014-11-24T17:01:31.640 回答