Por que o sudo su não em um script de shell executa o restante do script como root?

33

Um exemplo de script pode ser o seguinte:

#!/bin/bash
sudo su
ls /root

Ao usar ./test.sh como o usuário normal, execute ls como superusuário e saia, ele alterna para root; e quando eu sair, ele executa ls /root como o usuário normal.

Alguém pode me dizer sobre o mecanismo sobre isso?

    
por Hongxu Chen 02.04.2013 / 13:40

4 respostas

48

Os comandos em um script são executados um por um, independentemente. O script em si como o pai de todos os comandos no script, é outro processo independente e o comando su não pode e não pode mudá-lo para root: o comando su cria um novo processo com privilégios de root.

Depois que o comando su for concluído, o processo pai, ainda em execução como o mesmo usuário, executará o restante do script.

O que você quer fazer é escrever um script de wrapper. Os comandos privilegiados vão para o script principal, por exemplo ~/main.sh

#!/bin/sh
ls /root

O script wrapper chama o script principal com permissões de root, como esta

#!/bin/sh
su -c ~/main.sh root

Para iniciar esse processo, você executa o wrapper, que, por sua vez, inicia o script principal depois de alternar o usuário para o usuário raiz.

Essa técnica de wrapper pode ser usada para transformar o script em um wrapper em torno de si mesmo. Basicamente, verifique se ele está sendo executado como root, se não, use "su" para se lançar novamente.

$ 0 é uma maneira útil de fazer um script se referir a si mesmo, e o comando whoami pode nos dizer quem somos (estamos arraigados?)

Assim, o script principal com o wrapper interno torna-se

#!/bin/sh
[ 'whoami' = root ] || exec su -c $0 root
ls /root

Observe o uso de exec. Significa "substituir este programa por", o que efetivamente termina sua execução e inicia o novo programa, lançado pelo su, com raiz, para executar a partir do topo. A instância de substituição é "root", por isso não executa o lado direito do ||

    
por 02.04.2013 / 14:08
19

Use o seguinte no script.

sudo su <<HERE
ls /root
HERE

O código entre o bloco HERE será executado como root.

    
por 02.04.2013 / 14:02
6

Sem mais argumentos su executará o shell de login para root. Isso é o que a primeira linha do seu script realmente faz. Quando você sair, o shell de login será fechado, o su retornará e o script continuará a execução, ou seja, com a segunda linha: ls /root . Eu acho que você pode simplesmente sudo ls /root para fazer o que quiser.

    
por 02.04.2013 / 13:47
1

Quando você disparar sudo su um novo processo com o efetivo userid (euid=EUID) de superusuário bifurcado, portanto, teremos um novo bash em execução no ID do processo (pid=PID) associado ao mesmo terminal (tname=TTY) .

Explicação

Suponha que depois de disparar ps -A | grep bash você tenha 21460 pts/2 00:00:00 bash como saída. Agora, quando você executar ./test.sh , ambos os comandos sudo su e ls /root serão colocados em spool em PID 21460 . Após a execução quando você tiver root como usuário ativo, pressione ps -A | grep bash novamente, você notará um novo bash rodando em PID say, 21570 . Sair de root bash irá matar o bando recém-bifurcado revertendo para user's bash e, portanto, executa o comando em spool ls /root antes de liberar o prompt.

    
por 02.04.2013 / 14:14