我有一个shell脚本,我试图以特定用户身份运行。我的命令如下:
su - jetty sh ./runProgram.sh
当我尝试通过控制台运行此命令时,我收到错误消息:
/bin/sh: /bin/sh: cannot execute binary file
我也尝试过:
su - jetty sh runProgram.sh
我仍然得到同样的错误..
如果我这样做,它会起作用:
sh runProgram.sh
但是这个shell脚本应该由特定用户运行。有关如何使这个工作的任何建议??
答案 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上对我不起作用,它需要引用整个命令字符串。