Solicitar senha do sudo e elevar programaticamente privilégios no script bash?

49

Atualmente, estou trabalhando em um script bash que instala e configura vários programas em um sistema Linux padrão (atualmente, Ubuntu). Como ele instala programas e copia vários arquivos em várias pastas que exigem privilégios elevados, eu já fiz o padrão "Eu preciso de privilégios elevados" - e sai.

No entanto, eu gostaria, se possível, de solicitar a senha do usuário sudo e elevar os privilégios do script automaticamente se o usuário não executar o comando script com sudo (como iniciá-lo no gerenciador de arquivos da GUI), sem que o usuário precise reiniciar o script.

Como isso foi projetado para ser executado nas instalações padrão do Linux, qualquer opção que modifique o sistema não funcionará para meus propósitos. Todas as opções precisam estar contidas no próprio script.

Isso é possível no Bash? Em caso afirmativo, qual é a melhor maneira (segura, porém concisa) de fazer isso?

Shauna
fonte
@MichaelMrozek - Ah, as alegrias de ter tantos sites de nicho enquanto tentamos minimizar a fragmentação. E você sabe, o link que você deu nunca apareceu para mim enquanto pesquisava no Google.
Shauna
@jww você percebe que quase todos esses links foram solicitados cerca de 4 anos após este, certo?
Shauna
1
@ Shauna - Acho que você resolveu o problema até agora. Os links são para futuros visitantes.

Respostas:

64

Eu corro sudodiretamente do script:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi
Michael Mrozek
fonte
16

Eu sugiro:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done
enzotib
fonte
O que if [[ -t 1 ]];verifica?
Shauna
Ah ok. Eu imaginei que tinha algo a ver com terminal vs GUI, mas não tinha certeza do que a instrução if estava verificando.
Shauna
Incrível, obrigado!
Fire-Dragon-DoL
16

Adicione isso como a primeira linha do script:

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

Mude sudopara gksuou gksudose preferir um prompt gráfico.

Kevin
fonte
3
Observe que "$*"isso mesclará todos os argumentos em um ( /path/to/script one two threeresultará em $1ser one two three) e, $*sem aspas, irá bagunçar espaços nos argumentos. "$@"funciona direito
Michael Mrozek
@MichaelMrozek Ah, certo. Esse é o que eu estava procurando, corrigido
Kevin
Existe uma maneira de fazer isso no Debian, onde parece não haver comando sudo?
wrongusername 25/07
@wrongusername install sudo, é muito melhor do que usar su. Mas se você realmente quer, provavelmenteexec su -c "$0" "$@"
Kevin
2

script de exemplo, não me importo de compartilhar:

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK

TeK ImPerial. Soluções
fonte
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- Parece um forro realmente eficiente! Agradável!
groovenectar
Faria sentido usar o UID eficaz aqui $EUDI, ou sempre o mesmo resultado? Por exemplo,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
groovenectar