运行包含两部分的命令时会失败,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"