Como faço para manter o sudo em um script bash?

2

Se eu executar este script, como passar permissões de superusuário para ele? Eu escrevi isso apenas para configurar novas máquinas com o básico. Não quero executar todos os comandos com permissões elevadas, mas os comandos que possuem sudo desejam ser executados com eles.

Como faço para que alguns comandos sejam executados com sudo e outros sejam executados como usuário comum?

#!/bin/sh

# If Linux, install nodeJS
if $(uname) = 'Linux';
then
    export IS_LINUX=1
    # Does it have aptitude?
    if  -x "which apt-get";
    then
        export HAS_APT=1
        # Install NodeJS
        sudo apt-get install --yes nodejs
    fi
    # Does it have yum?
    if  -x "which yum" ;
    then
        export HAS_YUM=1
        # Install NodeJS
        sudo yum install nodejs npm
    fi
    # Does it have pacman?
    if  -x "which pacman" ;
    then
        export HAS_PACMAN=1
        # Install NodeJS
        pacman -S nodejs npm
    fi
fi

# If OSx, install Homebrew and NodeJS
if  $(uname) = 'Darwin' ;
then
    export IS_MAC=1
    if test ! "$(which brew)"
    then
      echo "================================"
      echo "  Installing Homebrew for you."
      echo "================================"
      ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
      export HAS_BREW=1
    elif  -x 'which brew' ;
    then
      export HAS_BREW=1
      brew update
    fi
    # Install NodeJS
    brew install --quiet node
fi

# Does it have python?
if  -x "which python" ;
then
    export HAS_PYTHON=1
    if  -x "which pip" ;
    then
      pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U
      export HAS_PIP=1
    fi
fi
# Does it have node package manager?
if  -x "which npm" ;
then
    export HAS_NPM=1
else
    echo "NPM install failed, please do manually"
fi
# Does it have ruby gems?
if  -x "which gem" ;
then
    export HAS_GEM=1
fi

O restante do script bash (que eu não incluí no comprimento) instala pacotes de um array usando npm, apt, yum, brew ou pacman, dependendo da máquina. Apenas instala coisas simples como git , wget , etc.

    
por AtHeartEngineer 09.02.2016 / 23:07

1 resposta

2

A primeira vez que sudo é chamada é solicitada. Então, dependendo da configuração, se invocado dentro de N minutos (padrão 5 minutos IIRC), não é necessário digitar a senha novamente.

Você pode fazer algo como:

sudo echo >/dev/null || exit 1

ou talvez algo como:

sudo -p "Become Super: " printf "" || exit 1

no início do script.

Se você quiser impedir que alguém faça sudo ./your_script , você deve verificar o EUID também ( bash ):

if [[ $EUID -eq 0 ]]
then
    printf "Please run as normal user.\n" >&2
    exit 1
fi

ou algo parecido:

if [ "$(id -u)" = "0" ]
   ...

Em qualquer caso, verifique também qual shell você está usando. Ou seja,

etc.

Para "manter ativo" , é possível fazer algo como :

while true; do
  sleep 300
  sudo -n true
  kill -0 "$$" 2>/dev/null || exit
done &
    
por 09.02.2016 / 23:50