Como forma de convencer-se de que sudo
é executado apenas com o primeiro comando fornecido e tudo o mais depois que o primeiro canal é executado como seu ID de usuário original, é possível usar essa cadeia inútil de comandos para visualizá-lo.
Exemplo # 1
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Então, quando você cat
desses arquivos, verá os seguintes nomes de usuários:
$ cat file{1..3}
root
saml
saml
Exemplo # 2
No entanto, se você executar um subshell:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Então, quando você cat
desses arquivos, verá os seguintes nomes de usuário:
$ cat file{4..6}
root
root
root
Exemplo # 3
Seu comentário sobre sudo foo1 | sudo foo2 ...
nunca funcionaria, já que a saída de sudo foo1
seria alimentada para sudo foo2
. Usando meus exemplos whoami
, isso mostra que essa cadeia de comandos não faz nada.
$ sudo whoami | sudo whoami | sudo whoami
root
O primeiro foi executado, mas o segundo e o terceiro não fazem nada, já que não estão equipados para receber informações. Pelo contrário, acho que você quis escrever algo assim:
$ sudo whoami;sudo whoami;sudo whoami
root
root
root
Qual é equivalente a executá-lo 3 vezes em 3 comandos diferentes. Ou isso:
$ sudo whoami && sudo whoami && sudo whoami
root
root
root
Mas nunca faça este último. Pertence à próxima seção.
Maneiras obscuras de chamar o sudo
Estes não são meu melhor trabalho, mas são outras maneiras pelas quais você pode ter me visto executando vários comandos usando sudo
. Eu os mostro aqui apenas para ensinar não para que os outros necessariamente façam eles!
Caminho # 1
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
Como funciona?
O programa echo dentro das aspas duplas está sendo executado como root, por causa do sudo, mas o shell que está redirecionando a saída do echo para o arquivo somente raiz ainda está sendo executado como você. Seu shell atual faz o redirecionamento antes de sudo
iniciar.
Caminho # 2
$ sudo tee /proc/sys/vm/drop_caches <<<1
Como funciona?
Esse método executa o programa tee
como raiz E recebe a entrada de uma string que é executada antes de sudo
invocar o comando tee
.
Caminho # 3
# this way
$ sudo -s -- 'whoami'
# or this way
sudo -s -- sh -c 'whoami;whoami'
Como funciona?
Estes podem parecer diferentes, mas eles estão realmente fazendo a mesma coisa. Ao usar a opção -s
, sudo
executará um único comando. Eu nunca conseguia descobrir se havia uma maneira de escapar disso. Nada como isso funcionaria.
# this
$ sudo -s -- 'whoami;whoami'
# or this
$ sudo -s -- 'whoami\;whoami'
Mas, ao olhar para a página do manual, a opção -s
diz que passará um único comando para o shell definido na entrada do usuário do arquivo /etc/passwd
. Então nós usamos um truque no segundo formulário, principalmente passando o shell, outro shell ( sh -c
) no qual nós "backdoor" nossa série de comandos para rodar.
Há mais, mas vou parar por aqui. Estes são apenas para mostrar o que você pode fazer se você entender as coisas, mas não necessariamente encadear o lixo porque você pode, você deve tentar manter seus pragmas de código em um nível lógico que faça sentido para que outros possam entender e apoiar eles no futuro.