it-swarm.com.de

Wie führe ich Befehle als Benutzer ohne Rootberechtigung in einem Skript aus, das mit Rootberechtigungen gestartet wurde?

Das Problem
In einem Bash-Skript verwende ich den Befehl ...

Sudo -u node bash

.., um von root zu einem Nicht-Sudo-Benutzer zu wechseln, und dies schlägt fehl.

Der Kontext
Ich schreibe ein provision.sh Skript für Vagrant, um einen Server mit Ubuntu 16.04.3 mit allen Paketen einzurichten, die für die Bereitstellung einer App mit Meteor 1.6 erforderlich sind.

Ein erforderlicher Schritt ist die Installation von nvm als Benutzer ohne Rootberechtigung. Nach der Installation von nvm müssen Sie sich abmelden und erneut anmelden, um nvm zu aktivieren. Ich erstelle daher einen Nicht-Sudo-Benutzer namens meteor und möchte zu diesem wechseln, wenn ich nvm herunterlade und installiere.

Anschließend möchte ich wieder zu root wechseln und mich sofort als meteor anmelden, um nvm für die Installation von Node.js zu verwenden.

Unten finden Sie ein stark kommentiertes Skript. Vagrant führt dieses Skript jedes Mal aus, wenn ich vagrant reload --provision aufrufe.

Welchen Befehl sollte ich anstelle von Sudo -u node bash verwenden?


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
5
James Newton

Wenn Sie Ihr Skript mit Root-Berechtigungen starten, aber bestimmte Befehle als ein bestimmter Nicht-Root-Benutzer ausführen müssen, können Sie Sudo mit der Option -u verwenden, um entweder einen einzelnen Befehl mit z.

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

oder starten Sie eine Subshell und führen Sie Ihre Befehle darin aus, z.

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

Die Zeile in Ihrem Skript schlägt tatsächlich nicht fehl, Sie führen nur bash als Benutzer meteor aus, und da bash nichts zu tun hat, wird sie nur beendet, und der Rest wird von der ursprünglichen Root-Shell ausgeführt des Skripts. Was Sie eigentlich tun wollen (nehme ich an), ist:

…
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"
…

Ein anderer Weg, um dasselbe zu erreichen, ist ein hier Dokument :

…
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"
…
5
dessert
#! /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 "" "${@}"