Solicitar privilégios de root a partir de um script

23

Eu tenho um script que pode ser executado como sudo script.sh ou pkexec script.sh

Seria muito melhor do ponto de vista do usuário se o script pedisse a senha do usuário quando apenas o executasse pelo nome script.sh .

Como posso "incorporar" a solicitação a pkexec ou sudo para executar o script inteiro com privilégio de root?

Observação que executar tudo com sudo sh -c pode não ser a melhor solução, pois tenho funções no script.

    
por Sergiy Kolodyazhnyy 15.03.2016 / 16:38

6 respostas

49

Isso funcionará:

echo "$(whoami)"

[ "$UID" -eq 0 ] || exec sudo "$0" "$@"

exemplo:

./test.sh 
blade
[sudo] password for blade: 
root
    
por blade19899 15.03.2016 / 16:40
12

Se você quiser um diálogo bonito, tente algo assim. Eu rasguei isto diretamente de outra coisa que escrevi, então ele tem coisas extras que você pode não precisar ou querer, mas mostra a idéia geral:

brand="My Software"

# Check that the script is running as root. If not, then prompt for the sudo
# password and re-execute this script with sudo.
if [ "$(id -nu)" != "root" ]; then
    sudo -k
    pass=$(whiptail --backtitle "$brand Installer" --title "Authentication required" --passwordbox "Installing $brand requires administrative privilege. Please authenticate to begin the installation.\n\n[sudo] Password for user $USER:" 12 50 3>&2 2>&1 1>&3-)
    exec sudo -S -p '' "$0" "$@" <<< "$pass"
    exit 1
fi

Isso usa o whiptail, que você pode instalar se ainda não tiver:

sudo apt-get install whiptail
    
por Michael Hampton 16.03.2016 / 04:49
11

A resposta do blade19899 é de fato o caminho a percorrer, mas também é possível chamar sudo bash no shebang:

#!/usr/bin/sudo bash
# ...

A ressalva óbvia é que isso funcionará apenas enquanto o script for chamado com ./script e falhará assim que o script for chamado com bash script .

    
por kos 15.03.2016 / 17:28
6

Prefácio os comandos no script que precisam de acesso root com sudo - se o usuário ainda não tiver obtido permissões, o script solicitará uma senha nesse ponto.

exemplo

#!/bin/sh 
mem=$(free  | awk '/Mem:/ {print $4}')
swap=$(free | awk '/Swap:/ {print $3}')

if [ $mem -lt $swap ]; then
    echo "ERROR: not enough RAM to write swap back, nothing done" >&2
    exit 1
fi

sudo swapoff -a && 
sudo swapon -a

Esse script pode ser executado como sudo <scriptname> ou como <scriptname> . Em ambos os casos, ele pedirá a senha apenas uma vez.

    
por Charles Green 15.03.2016 / 16:51
3

Parece que ninguém mais abordou a preocupação óbvia aqui. Colocar sudo em seu script que você distribui promove maus hábitos do usuário . (Eu estou supondo que você está distribuindo isso porque você menciona "do ponto de vista do usuário".)

A verdade é que existe uma diretriz no uso de aplicativos e scripts que é semelhante ao princípio de segurança no banco: Nunca forneça suas informações pessoais a alguém que ligue para você e diga que elas estão chamando "do seu banco ", e que existe por motivos semelhantes.

A regra para aplicativos é:

Nunca digite sua senha quando solicitado, a menos que você esteja certo sobre o que está sendo feito com ela. Isso se aplica triplamente a qualquer pessoa com sudo .

Se você digitar sua senha porque correu sudo na linha de comando, ótimo. Se você está digitando porque você executou um comando SSH, tudo bem. Se você está digitando quando você entra no seu computador, ótimo, claro.

Se você acabou de executar um script ou executável estrangeiro e digitar sua senha quando solicitado, não há idéia do que o script está fazendo com ele. Ele poderia estar armazenando-o em um arquivo temporário em texto simples, por tudo que você sabe, e pode até falhar em limpar depois de si mesmo.

Obviamente, existem preocupações adicionais e separadas sobre a execução de um conjunto desconhecido de comandos como root , mas o que estou falando aqui é manter a segurança na própria senha . Mesmo supondo que o aplicativo / script não seja mal-intencionado, você ainda deseja que sua senha seja manipulada com segurança para evitar que outros aplicativos a usem e a usem de maneira mal-intencionada.

Então, minha resposta pessoal para isso é que, o melhor a ser colocado em seu script se ele precisar de privilégios de root, é:

#!/bin/bash
[ "$UID" -eq 0 ] || { echo "This script must be run as root."; exit 1;}

# do privileged stuff, etc.
    
por Wildcard 21.03.2016 / 02:28
1

Eu fiz assim:

echo -n "Enter password for sudo rights: "
read -s pass

echo $pass | sudo -S [your command here]
    
por 88weighed 19.03.2016 / 10:32