Como executo um comando 'sudo' dentro de um script?

56

Para fazer um patch manualmente eu devo digitar este comando

sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  

Existe um espaço pouco antes do 09:

sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql

Como posso executar isso dentro de um script?

Existem também vários outros comandos, mas este está causando problemas.

    
por user251948 24.02.2014 / 23:27

6 respostas

80

Raramente é uma boa ideia ter sudo dentro dos scripts. Em vez disso, remova o sudo do script e execute o próprio script com sudo :

sudo myscript.sh

Dessa forma, todos os comandos do script serão executados com privilégios de root e você só precisará fornecer a senha uma vez ao iniciar o script. Se você precisar de um comando específico dentro do script para ser executado sem sudo privileges, você pode executá-lo como um usuário regular com (obrigado Lie Ryan ):

sudo -u username command 

O espaço é irrelevante, não deve afetar nada, existe sempre um espaço entre um comando e seus argumentos.

    
por terdon 25.02.2014 / 12:17
29

Você pode modificar o arquivo sudoers .

Executar sudo visudo .

Adicione uma entrada para o seu nome de usuário e o script que você gostaria de executar sem solicitar uma senha.

username ALL=(ALL) NOPASSWD: /path/to/script
    
por Klaus-Dieter Warzecha 24.02.2014 / 23:46
11

Você poderia tentar algo como:

echo "PASSWORD" | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

Esta não é a coisa mais segura a fazer, pois você está escrevendo uma senha sudoer em texto simples. Para torná-lo um pouco mais seguro, você pode criar uma variável e ler a senha do sudo na variável e, em seguida, você pode executar o comando como:

echo $PASSWORD | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

Além disso, se você não se importar com todos os seus comandos sendo executados como root, você pode executar o script usando sudo , como sugerido anteriormente.

sudo ./myscript
    
por Jibbers 06.02.2015 / 15:48
4

Esta resposta é semelhante à resposta de terdon. Como eu também sugeriria executar o script principal com sudo para que você possa executar os comandos sem solicitar ao usuário qualquer senha.

No entanto, caso você queira executar alguns dos comandos não como o usuário raiz ou um usuário do sistema específico, mas como o usuário real que executou o comando com sudo , é possível verificar a variável $SUDO_USER para descobrir o usuário original.

Este é um exemplo de como você pode conseguir isso:

#!/bin/bash

# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
   echo "The script need to be run as root." >&2
   exit 1
fi

if [ $SUDO_USER ]; then
    real_user=$SUDO_USER
else
    real_user=$(whoami)
fi

# Commands that you don't want run with root would be invoked
# with: sudo -u $real_user
# So they will be ran as the user who invoked the sudo command
# Keep in mind, if the user is using a root shell (they're logged in as root),
# then $real_user is actually root
# sudo -u $real_user non-root-command

# Commands that need to be ran with root would be invoked without sudo
# root-command
    
por Dan 30.10.2017 / 14:21
3
#!/bin/bash
# this declares that current user is a sudoer
sudo tee /etc/sudoers.d/$USER <<END
END

# write the content of your script here
sudo npm install hexo-cli -g
mkdir Untitled
sudo apt-get install python

# then to remove the sudo access from the current user
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k
    
por Sanyam Jain 06.12.2015 / 08:44
0

Você pode tentar adicionar o usuário que executa o script ao arquivo sudoers:

#give permissions to the file
sudo chmod 700 /etc/sudoers.d/useradm

sudo visudo /etc/sudoers.d/useradm

#add the following text, changing "user" but your desired user
user ALL=(ALL)NOPASSWD:ALL

#return the right permissions to the file
sudo chmod 440 /etc/sudoers.d/useradm
    
por evinhas 19.01.2017 / 16:10