Se eu digitar “sudo” no início de uma linha, isso se aplica ao restante dos comandos?

10

Se eu digitar sudono 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
Mike B
fonte

Respostas:

11

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.

Exemplo 1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

Então, quando catesses arquivos, você verá os seguintes nomes de usuário:

$ 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ê tiver catesses 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, pois a saída de sudo foo1seria alimentada sudo foo2. Usando meus whoamiexemplos, 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.

Maneiras obscuras de chamar sudo

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 !

Caminho # 1

$ 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 sudoinício.

Caminho # 2

$ sudo tee /proc/sys/vm/drop_caches <<<1

Como funciona?

Este método executa o teeprograma como root E recebe a entrada de uma string here que é executada antes da sudochamada do teecomando.

Caminho # 3

# 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 -scomutador, sudoexecutará 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 -sswitch diz que passará um único comando para o shell definido na entrada do /etc/passwdarquivo 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.

slm
fonte
6

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'
jordanm
fonte