当有多个单词时,通过 sudo 执行命令会失败

当有多个单词时,通过 sudo 执行命令会失败

运行包含两部分的命令时会失败,sudo但运行不会失败su

root@hello:/var/www/hello# sudo -u root "echo hello"
sudo: echo hello: command not found
root@hello:/var/www/hello# sudo -u root "echo"

root@hello:/var/www/hello# su -c "echo hello" root
hello

答案1

这很正常。

总是su -c将单个字符串传递给 shell(它sh -c "echo hello"以 root 身份运行,并且 shell 解析命令),sudo 不这样做– 而是直接执行命令而不使用 shell。

(或者至少,当您使用sudo -s或 时-i,它会尽力假装它没有这样做。)

因此,sudo 会保留 sudo 本身接收的各个参数。因此,为了通过 sudo 运行多字命令,您实际上只需将其作为多字命令运行即可:

sudo -u root echo hello

sudo -u root touch file1.txt "This is file two.txt" file_3.txt

(请记住命令行是数组。因此,当 sudo 本身作为 执行时{"sudo", "-u", "root", "echo", "hello"},它会直接收集剩余参数{"echo", "hello"}作为新命令 - 而无需任何额外的类似 shell 的解析。)

如果您需要类似 su 的行为,则必须手动调用 shell:

sudo -u root sh -c "echo hello"

sudo -u root sh -c "touch \"This is file one.txt\" file2.txt"

相关内容