BASH-Skript als Root ausführen. Eine übersichtliche Möglichkeit, Befehle zu gruppieren, die als anderer Benutzer ausgeführt werden?

BASH-Skript als Root ausführen. Eine übersichtliche Möglichkeit, Befehle zu gruppieren, die als anderer Benutzer ausgeführt werden?

Mir ist bewusst, dass ich jeden Befehl als anderer Benutzer ausführen kann mit:

su -s /bin/bash "command" - user

Es müssen jedoch mehrere Befehle ausgeführt werden und ich suchte nach einer eleganteren Möglichkeit, dies zu tun, als „su“ in jede Zeile einzufügen.

Wie kann ich sagen „Alle Befehle von hier werden als Benutzer X ausgeführt“ und dann „Die Ausführung von Befehlen als Benutzer X beenden“ (und mit der Ausführung des restlichen Skripts als Root fortfahren)?

Danke.

Hier ist der Block, den ich als anderer Benutzer ausführen möchte (aktualisiert von der Antwort von @Jetchisel):

#!/bin/bash
export BORG_PASSPHRASE="SUPERSECRETPASSWORD"

su - backup-user -s /bin/bash -c '
echo "$USER $(date +%F)" |& tee /pathto/_logs/test.log
borg info               \
    /pathto/repo          \
    |& tee -a /pathto/_logs/test.log
'
info_exit=$?{PIPESTATUS[0]}

if [ ${info_exit} = "0" ]; then
echo ">> test-SUCCESS <<"
elif [ ${info_exit} = "1" ]; then
echo ">> test WARNINGS <<"
else
echo ">> test FAILED <<"
fi

Das oben genannte funktioniert, allerdings aus zwei Gründen:

  1. Ich kann die Umgebungsvariable, die Borg normalerweise automatisch abruft, nicht übergeben: $BORG_PASSPHRASE. Handelt es sich hier vielleicht um ein Berechtigungsproblem zwischen Benutzern?
  2. Es scheint, dass info=exit nicht richtig übergeben wird. Für einen Test habe ich Borg vollständig entfernt, echo beibehalten, es aber falsch als „ech“ geschrieben, was fehlschlägt. Aber das Skript meldet trotzdem Erfolg.

Antwort1

Sie können die -cFlagge versuchen

 OPTIONS
       -c, --command=command
            Pass command to the shell with the -c option.

Etwas wie

su - "$user" -s /bin/bash -c 'command1;command1;command3;.....'

Oder verwenden Sie stattdessen neue Zeilen, um ;die Befehle zu trennen.

su - "$user" -s /bin/bash -c '
  command1
  command2
  command3
  ...
'

Sie müssen nur auf die Anführungszeichen achten, wenn Sie die Befehle in einfache Anführungszeichen setzen müssen.

Antwort2

Sie können Funktionen in Ihrem Bash-Skript verwenden, zusammen mitsetzenum das leicht zu erreichen;

#!/bin/bash

function1 () {
  echo "this is function1"
 }
function2 () {
  echo "this is function2"
}

su -c "$(typeset -f function1); function1" user1
su -c "$(typeset -f function2); function2" user2


exit 0

Geben Sie in die Funktion alle Befehle ein, die Sie ausführen möchten, und der jeweilige Benutzer führt alle diese Befehle aus.

NOTIZ:Sie führen das Skript als Root aus, um Kennwortprobleme einfach zu vermeiden.

sudo su -c ./script.sh

Antwort3

Äh. Ich bin neu bei Stackexchange. Sonst wäre das ein Kommentar statt einer Antwort. Ich habe nicht den Ruf, um zu kommentieren. Also Leute. Seid nachsichtig mit mir! Ich empfehle, dass ihr ssh statt su verwendet. Und ich empfehle, dass Root und Backup-Benutzer eine gemeinsame primäre UNIX-Gruppe teilen.

  1. Mit SSH kann das Backup-Benutzerkennwort geändert werden und Ihr Skript funktioniert weiterhin.
  2. Wenn Sie eine freigegebene Gruppe verwenden, können Sie später – nach Ihrer Proof-of-Concept-Analyse – zu einer Lösung migrieren, bei der ein anderes Konto als das Root-Konto das Skript besitzen und ausführen kann. Dies hat den Vorteil, dass Sie das Root-Passwort nicht freigeben müssen.
  3. Sie können Umgebungsvariablen im SSH-Befehl übergeben ... Etwa: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"

verwandte Informationen