sudo -u username -s "cmd arg" 返回命令未找到

Joa*_*ela 10 sudo quoting

我用来执行命令:

sudo -u elasticsearch -s "ulimit -Hn"
Run Code Online (Sandbox Code Playgroud)

并且它返回用户 elasticsearch 看到的 ulimit -Hn 的值,直到我在 Ubuntu 11.10 上尝试它。在那里它返回:

/bin/bash: ulimit -Hn: command not found
Run Code Online (Sandbox Code Playgroud)

我尝试了几个不同的命令,当我使用参数时,我总是得到“找不到命令”:

$ sudo -u elasticsearch -s "ls all.sh"
/bin/bash: ls all.sh: command not found
Run Code Online (Sandbox Code Playgroud)

关于如何执行需要参数的命令的任何想法sudo

cam*_*amh 16

您需要删除双引号。它试图将名为“ulimit -Hn”的命令作为单个命令、空格和所有命令运行。-s需要是命令行sudo上的最后一个选项sudo,所有以下参数都传递$SHELL -c给执行。

sudo -u elasticsearch -s ulimit -Hn
Run Code Online (Sandbox Code Playgroud)

我想-s处理方式已经改变,因为当前的方式允许您通过$SHELL在命令行上转义它们来传递带有空格的参数:

$ touch '/tmp/foo bar'
$ sudo -s rm '/tmp/foo bar'
Run Code Online (Sandbox Code Playgroud)

旧的参数处理方法会将'/tmp/foo bar'参数分成两部分,从而破坏命令。