根据的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 上对我不起作用,它需要引用整个命令字符串。