Isso funcionará:
echo "$(whoami)"
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"
exemplo:
./test.sh
blade
[sudo] password for blade:
root
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.
Isso funcionará:
echo "$(whoami)"
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"
exemplo:
./test.sh
blade
[sudo] password for blade:
root
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
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
.
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.
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.
Eu fiz assim:
echo -n "Enter password for sudo rights: "
read -s pass
echo $pass | sudo -S [your command here]
Tags command-line bash scripts