AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 978451
Accepted
James Newton
James Newton
Asked: 2017-11-21 07:43:35 +0800 CST2017-11-21 07:43:35 +0800 CST 2017-11-21 07:43:35 +0800 CST

Como executo comandos como um usuário não root em um script iniciado com permissões de root?

  • 772

O problema
Em um script bash, estou usando o comando...

sudo -u node bash

.. para mudar de root para um usuário não-sudo, e isso está falhando.

O contexto
Estou escrevendo um provision.shscript para Vagrant, para configurar um servidor rodando Ubuntu 16.04.3 com todos os pacotes necessários para entregar um app com Meteor 1.6.

Uma etapa necessária é instalar nvmcomo um usuário não root. Depois nvmde instalado, você precisa sair e entrar novamente para ativar o nvm. Portanto, crio um usuário não-sudo chamado meteor, e quero mudar para ele quando baixar e instalar nvm.

Posteriormente, quero voltar a ser roote fazer login imediatamente como meteor, a fim de começar a usar nvmpara instalar o Node.js.

Você encontrará um script muito comentado abaixo. O Vagrant executa esse script toda vez que eu chamo vagrant reload --provision.

Qual comando devo usar em vez de sudo -u node bash?


echo "# whoami" && whoami && echo "^^^^ root expected"
echo "As root, create non-sudo user meteor:"
pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
useradd -m -p $pass meteor
echo "User meteor created. ls -al /home/meteor:"
ls -al /home/meteor
echo "Install curl as root:"
apt-get install -y curl
echo "Trying sudo -u meteor bash"
sudo -u meteor bash #### THIS IS THE LINE THAT FAILS ###

echo "$ whoami" && whoami && echo "^^^^^^ meteor expected"
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
echo "ls -al /home/meteor/.nvm # should be populated"
ls -al /home/meteor/.nvm

echo "ls -al /root/.nvm # should not exist"
ls -al /root/.nvm

echo "command -v nvm will fail silently until we log out and back in again"
#command -v nvm
exit

#### Because the script is still running as root, it halts here ####

echo "# whoami" && whoami && echo "^^^^ should be root"
sudo -u meteor bash
echo "$ whoami" && whoami && echo "^^^^^^ should be meteor"
echo "command -v nvm should work now"
command -v nvm
bash
  • 3 3 respostas
  • 69714 Views

3 respostas

  • Voted
  1. Best Answer
    dessert
    2017-11-21T08:21:34+08:002017-11-21T08:21:34+08:00

    Se você iniciar seu script com permissões de root, mas precisar executar determinados comandos como um usuário não root específico, poderá usar sudocom a -uopção de executar um único comando com, por exemplo

    sudo -u USERNAME whoami # outputs USERNAME's user name
    

    ou inicie um subshell e execute seus comandos nele, por exemplo:

    sudo -u USERNAME bash -c 'whoami;echo $USER' # outputs USERNAME's user name twice
    

    A linha em seu script não falha, na verdade, você apenas executa apenas bashcomo user meteore, como bashnão tem nada a ver, apenas sai e o shell raiz original executa o restante do script. O que você realmente quer fazer (suponho) é:

    …
    echo "Trying sudo -u meteor bash"
    sudo -u meteor bash -c '\
      echo "$ whoami" && whoami && echo "^^^^^^ meteor expected"
      curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh |\
      bash
    '
    echo "ls -al /home/meteor/.nvm # should be populated"
    …
    

    Outra maneira de conseguir o mesmo é um documento aqui :

    …
    echo "Trying sudo -u meteor bash"
    sudo -u meteor bash <<EOF
      echo "$ whoami" && whoami && echo "^^^^^^ meteor expected"
      curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh |\
      bash
    EOF
    echo "ls -al /home/meteor/.nvm # should be populated"
    …
    
    • 19
  2. Ed Randall
    2019-11-25T04:59:16+08:002019-11-25T04:59:16+08:00

    Se você estiver em um ambiente de contêiner, o projeto gosu pode ser interessante. Destina-se a resolver o problema de que su e sudo têm TTY muito estranho e muitas vezes irritante e comportamento de encaminhamento de sinal.

    Algumas boas alternativas são mencionadas no README.md do projeto gosu:

    1. chroot --userspecjá pode estar instalado
    2. su-exec https://github.com/ncopa/su-exec
    3. setprivdo pacote util-linux (Debian) https://manpages.debian.org/buster/util-linux/setpriv.1.en.html
    • 1
  3. Alberto Salvia Novella
    2019-01-19T04:21:18+08:002019-01-19T04:21:18+08:00
    #! /bin/bash
    #  (GPL3+) Alberto Salvia Novella (es20490446e)
    
    
    execute () {
        function="${1}"
        command="${2}"
        error=$(eval "${command}" 2>&1 >"/dev/null")
    
        if [ ${?} -ne 0 ]; then
            echo "${function}: $error"
            exit 1
        fi
    }
    
    
    executeAsNonAdmin () {
        function="${1}"
        command="${2}"
    
        eval setPasswordAsker="SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass"
        run="runuser ${SUDO_USER} --session-command=\"${setPasswordAsker}\" --command=\"${command}\""
        execute "${function}" "${run}"
    }
    
    
    executeAsNonAdmin "" "${@}"
    
    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve