AJP Asked: 2019-04-23 04:05:10 +0800 CST2019-04-23 04:05:10 +0800 CST 2019-04-23 04:05:10 +0800 CST 当多个单词时通过 sudo 执行命令失败 772 运行包含两部分的命令会失败,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 sudo su 1 个回答 Voted Best Answer user1686 2019-04-23T04:15:06+08:002019-04-23T04:15:06+08:00 这很正常。 su -c始终将单个字符串传递给 shell(它sh -c "echo hello"以 root 身份运行,shell 解析命令)的地方sudo 并没有这样做——而是直接执行命令而不使用 shell。 (或者至少,当你使用sudo -sor时-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"
这很正常。
su -c
始终将单个字符串传递给 shell(它sh -c "echo hello"
以 root 身份运行,shell 解析命令)的地方sudo
并没有这样做——而是直接执行命令而不使用 shell。(或者至少,当你使用
sudo -s
or时-i
,它会非常努力地假装它没有那样做。)结果,sudo 保留了 sudo 本身收到的各个参数。因此,为了通过 sudo 运行多字命令,您实际上只需将其作为多字命令运行:
(记住命令行是数组。所以当 sudo 本身被执行时
{"sudo", "-u", "root", "echo", "hello"}
,它直接收集剩余的参数{"echo", "hello"}
作为新命令——没有任何额外的类似 shell 的解析。)如果您需要类似 su 的行为,则必须手动调用 shell: