Se eu digitar “sudo” no começo de um forro, ele se aplica ao resto dos comandos?

10

Se eu digitar sudo no começo de um forro no bash, isso se aplica ao resto dos comandos?

Em outras palavras, é isso:

sudo foo | foo2 | foo3

equivalente a isto:

sudo foo | sudo foo2 | sudo foo3
    
por Mike B 11.09.2013 / 01:52

2 respostas

11

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.

    
por 11.09.2013 / 04:11
5

Não, no seu exemplo, apenas foo é executado por sudo . Se você quiser executar todos os comandos com privilégios escalados, você pode gerar um shell:

sudo sh -c 'foo | foo2 | foo3'
    
por 11.09.2013 / 01:57

Tags