A execução de um comando com duas partes falha, sudo
mas não com 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
Isso é normal.
Where
su -c
sempre passa a string única para um shell (ele é executadosh -c "echo hello"
como root e o shell analisa o comando),sudo
não faz isso - em vez disso, ele executa diretamente o comando sem usar um shell.(Ou pelo menos, quando você usa
sudo -s
ou-i
, ele tenta muito fingir que não faz isso.)Como resultado, o sudo preserva os argumentos individuais exatamente como foram recebidos pelo próprio sudo. Portanto, para executar um comando de várias palavras via sudo, você literalmente apenas o executa como um comando de várias palavras:
(Lembre-se de que as linhas de comando são arrays . Portanto, quando o próprio sudo é executado como
{"sudo", "-u", "root", "echo", "hello"}
, ele coleta diretamente os parâmetros restantes{"echo", "hello"}
como o novo comando - sem nenhuma análise adicional semelhante ao shell.)Se você precisar do comportamento semelhante ao su, terá que chamar manualmente um shell: