Se eu digitar sudo
no início de um liner no bash, isso se aplica ao restante dos comandos?
Em outras palavras, é isso:
sudo foo | foo2 | foo3
equivalente a isso:
sudo foo | sudo foo2 | sudo foo3
Como forma de convencer-se de que sudo
é executado apenas usando o primeiro comando fornecido, e tudo o mais após o primeiro canal ser executado como seu ID de usuário original, você pode usar essa cadeia de comandos inútil para vê-lo.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Então, quando cat
esses arquivos, você verá os seguintes nomes de usuário:
$ cat file{1..3}
root
saml
saml
No entanto, se você executar um subshell:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Então, quando você tiver cat
esses arquivos, verá os seguintes nomes de usuário:
$ cat file{4..6}
root
root
root
Seu comentário sobre sudo foo1 | sudo foo2 ...
nunca funcionaria, pois a saída de sudo foo1
seria alimentada sudo foo2
. Usando meus whoami
exemplos, 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, pois não estão equipados para receber informações. Em vez disso, acho que você pretendia escrever algo assim:
$ sudo whoami;sudo whoami;sudo whoami
root
root
root
O que equivale a executá-lo três vezes em três prompts de comando diferentes. Ou isto:
$ sudo whoami && sudo whoami && sudo whoami
root
root
root
Mas nunca faça este último. Pertence à próxima seção.
Este não é o meu melhor trabalho, mas são outras maneiras pelas quais você pode me ver executando vários comandos usando sudo
. Eu os mostro aqui apenas para ensinar não para que outros necessariamente os façam !
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
Como funciona?
O programa eco dentro das aspas duplas está sendo executado como root, por causa do sudo, mas o shell que está redirecionando a saída do eco para o arquivo somente raiz ainda está sendo executado como você. Seu shell atual faz o redirecionamento antes do sudo
início.
$ sudo tee /proc/sys/vm/drop_caches <<<1
Como funciona?
Este método executa o tee
programa como root E recebe a entrada de uma string here que é executada antes da sudo
chamada do tee
comando.
# this way
$ sudo -s -- 'whoami'
# or this way
sudo -s -- sh -c 'whoami;whoami'
Como funciona?
Eles podem parecer diferentes, mas estão realmente fazendo a mesma coisa. Ao usar o -s
comutador, sudo
executará um único comando. Eu nunca consegui descobrir se havia uma maneira de escapar disso. Nada como isso funcionaria.
# this
$ sudo -s -- 'whoami;whoami'
# or this
$ sudo -s -- 'whoami\;whoami'
Mas, olhando a página de manual, o -s
switch diz que passará um único comando para o shell definido na entrada do /etc/passwd
arquivo do usuário . Então, usamos um truque na segunda forma, passando principalmente o shell, outro shell ( sh -c
) no qual "backdoor" nossa série de comandos para executar.
Há mais, mas vou parar por aqui. Isso serve apenas para mostrar o que você pode fazer se você entender as coisas, mas não deve necessariamente encadear o lixo, porque você pode, deve tentar manter seus pragmas de código no nível lógico que faz sentido, para que outros possam entender e apoiar eles no futuro.
Não, apenas no seu exemplo foo
é executado por sudo
. Se você deseja executar todos os comandos com privilégios escalados, pode gerar um shell:
sudo sh -c 'foo | foo2 | foo3'