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?



@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

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

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.


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


[ "$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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.