Solicitar que o usuário efetue login como root ao executar um script de shell


17

O problema que estou recebendo é que, quando insiro o comando,

su - root

no início do meu arquivo de script de shell, ele solicita que o usuário digite a senha e NÃO continua com o restante do script de shell. Em seguida, tenho que localizar e executar manualmente o script de shell via terminal. Quero que o script garanta que o usuário efetue login como root e continue com o restante do script de shell.

Em outras palavras, desejo executar o script como qualquer usuário, mas, assim que o script começar a ser executado, o usuário deverá mudar para raiz e, em seguida, continuar com o restante do script como raiz até concluir. Isso pode ser feito?

Respostas:


34

Isso é muito fácil de realizar:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

Quando o usuário atual não for root, reexecute o script sudo.

Note que estou usando sudoaqui em vez de su. Isso ocorre porque permite preservar argumentos. Se você usar su, seu comando teria que ser o su -c "$0 $@"que alteraria seus argumentos se eles tivessem espaços ou caracteres shell especiais.

Se seu shell for bash, você poderá evitar a chamada externa para whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"

Desculpe, cometi um erro na explicação, portanto ela pode ter sido mal interpretada. Aqui está uma explicação mais clara. Obrigado pela ajuda!
Redson

@ user68857 Sua pergunta foi clara. Esta resposta faz exatamente o que você deseja.
Patrick

Recebo este erro: sudo: deve ser root setuid
Redson

eu quero executar o script como um usuário regular via terminal, mas o script deve em seguida, mudar o usuário raiz até o final do script
Redson

@Nosscire, se você estiver recebendo sudo: must be setuid root, algo aconteceu com o seu sudo. Para corrigi-lo: chmod u+s $(which sudo). E sim, eu estou ciente do que você está tentando fazer, faço a mesma coisa o tempo todo nos meus scripts.
284 Patrick

7

Você também pode verificar o UID:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi

5

Você pode chamar o próprio script e verificar:

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...

0

No ponto em que você deseja fazer login, basta adicionar o seguinte comando

sudo su

Isso está funcionando perfeitamente com meu código

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.