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:
- Ich kann die Umgebungsvariable, die Borg normalerweise automatisch abruft, nicht übergeben: $BORG_PASSPHRASE. Handelt es sich hier vielleicht um ein Berechtigungsproblem zwischen Benutzern?
- 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 -c
Flagge 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.
- Mit SSH kann das Backup-Benutzerkennwort geändert werden und Ihr Skript funktioniert weiterhin.
- 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.
- Sie können Umgebungsvariablen im SSH-Befehl übergeben ... Etwa: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"