Como fazer login como root do Bash e fazer coisas

4

Este é o meu simples bash:

cat test.sh

#!/bin/bash 
echo "hello"
su - root -c /path/to/script.sh <<EOF
password                              
EOF
whoami
echo "good bye"

Mas recebo este erro:

./test.sh
hello
su: must be run from a terminal
<current-user>
good bye

(OR)

cat test2.sh
#!/bin/bash 
echo "hello"
sudo su <<EOF
password                              
EOF
whoami
echo "good bye"

Mais uma vez outro erro

(OR)

cat test3.sh
#!/bin/bash 
echo "hello"
su root <<EOF
password                              
EOF
whoami
echo "good bye"

novamente erro ...

quando tento:

#!/bin/bash
echo "hello"
sudo -s <<EOF
<password>
echo Now I am root
id                                                                      
echo "yes!"
EOF
whoami
echo "good bye"

Então a saída é:

./script.sh
hello
[sudo] password for <user>:

Eu também mudei meu script para:

#!/usr/bin/expect -f
spawn sudo -s <<EOF
expect "assword for user:"
send -- "password\r"
expect eof

e a saída é:

spawn sudo -s <<EOF
[sudo] password for user:
/bin/bash: <<EOF: command not found

Também which sh output é /bin/sh

Como posso resolver o erro nesses três scripts?

    
por MLSC 18.02.2014 / 18:45

4 respostas

5

Você pode enviar a senha e enviá-la no comando dentro do script.

echo "password" | sudo -S 

Mas não é uma boa ideia enviar a senha na linha de comando. Se você precisar de mais informações sobre como fazer login como root no script, consulte a resposta fornecida aqui .

No entanto, se for para fins experimentais, podemos usar a expectativa para inserir a senha a partir da linha de comando. O script precisa ser modificado como abaixo.

#!/usr/bin/expect -f 
spawn sudo -s <<EOF 
expect "assword for username:" 
send -- "user-password\r" 
expect eof

A última linha é necessária, pois precisamos pressionar Enter depois de inserir a senha. Como Tian sugeriu, não é uma boa idéia enviar a senha de root no shell script.

    
por 18.02.2014 / 18:48
4

Incorporar a senha de root no script não é uma boa ideia, do ponto de vista da segurança, provavelmente é por isso que o su tenta obtê-lo inicialmente de um terminal.

Usar sudo é um caminho melhor, é mais flexível, você pode configurá-lo para permitir que apenas determinados comandos ou até determinados usuários executem um programa / script com ou sem o uso de uma senha ( man sudo ).

@ A referência de Ketan também vale a pena ser lida.

    
por 18.02.2014 / 18:58
2

RESPONDE A aqui

Fazer esse tipo de coisa não é prática segura ou padrão (na verdade, muitos consideram desastrosa), não é uma boa idéia colocar uma senha em um script. Uma abordagem mais padronizada seria simplesmente esperar que o script inteiro seja executado com privilégios de root, ou apenas que o script solicite uma senha. Você também pode permitir que vários comandos sejam executados via sudo sem uma senha por usuários específicos usando a opção NOPASSWD em /etc/suoders .

No entanto, agora que você está ciente dos riscos, é possível usar sudo -kS para que o sudo leia a senha em stdin :

sudo -kSs << EOF
password
whoami
echo "Not a good idea to have a password encoded in plain text"
EOF
    
por 18.02.2014 / 20:35
0

Você já tentou / etc / sudoers?

your_user ALL=(ALL) NOPASSWD: /path/to/script.sh

(edite com: sudoedit / etc / sudoers) então, você poderá executar:

sudo /path/to/script without password
    
por 03.11.2014 / 03:00