Ich habe ein Skript geschrieben, das als Argument eine Zeichenfolge verwendet, die eine Verkettung eines Benutzernamens und eines Projekts darstellt. Das Skript soll (su) zum Benutzernamen wechseln, cd in ein bestimmtes Verzeichnis basierend auf der Projektzeichenfolge.
Ich möchte im Grunde tun:
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
Das Problem ist, dass wenn ich einmal eine Su mache ... es nur dort wartet. Dies ist sinnvoll, da der Ausführungsfluss auf den Wechsel zum Benutzer übergegangen ist. Sobald ich beende, werden die restlichen Dinge ausgeführt, aber es funktioniert nicht wie gewünscht.
Ich habe dem Befehl svn su vorangestellt, aber der Befehl ist fehlgeschlagen (dh er hat svn im gewünschten Verzeichnis nicht aktualisiert).
Wie schreibe ich ein Skript, mit dem der Benutzer den Benutzer wechseln und (unter anderem) svn aufrufen kann?
quelle
chsh
für die anderen Benutzer ausführen . Mein Problem ist hier unter stackoverflow.com/q/15307289/80353 aufgeführt. Wie passe ich Ihre Antwort an meine Situation an?sudo
odersu
von untergeordneter Bedeutung ist,sudo
ist jedoch viel sicherer und bequemer.Viel einfacher: Verwenden Sie
sudo
diese Option , um eine Shell auszuführen, und verwenden Sie einen Heredoc , um die Befehle einzugeben .(Antwort ursprünglich auf SuperUser )
quelle
-i
zu verwenden, umsomeuser
die erwartete Umgebung zu erhalten.sudo
mag praktisch sein, aber es ist nicht gut, wenn es nicht sofort einsatzbereit ist (wie unter AIX).su -c 'commands'
ist die richtige Antwort.Verwenden Sie ein Skript wie das folgende, um den Rest oder einen Teil des Skripts unter einem anderen Benutzer auszuführen:
quelle
whoami
anstelleid
dessen den Namen anstelle der ID zurückgebensudo
mag praktisch sein, aber es ist nicht gut, wenn es nicht sofort einsatzbereit ist (wie unter AIX).su -c 'commands'
ist die richtige Antwort.Sie müssen alle Befehle für verschiedene Benutzer als eigenes Skript ausführen. Wenn es nur ein oder mehrere Befehle sind, sollte Inline funktionieren. Wenn es viele Befehle gibt, ist es wahrscheinlich am besten, sie in ihre eigene Datei zu verschieben.
quelle
su -s /bin/bash
.Hier ist noch ein weiterer Ansatz, der in meinem Fall bequemer war (ich wollte nur Root-Berechtigungen löschen und den Rest meines Skripts von einem eingeschränkten Benutzer ausführen): Sie können das Skript vom richtigen Benutzer aus neu starten lassen. Nehmen wir an, es wird zunächst als Root ausgeführt. Dann sieht es so aus:
quelle
runuser -u $user -- "$@"
, wie in su (1)exec su "$user" "$0" -- "$@"
--
ist wirklich nützlich.Verwenden Sie
sudo
stattdessenEDIT : Wie Douglas wies darauf hin, sie können nicht
cd
insudo
da es kein ist externer Befehl. Sie müssen die Befehle in einer Subshell ausführen, damit diecd
Arbeit funktioniert.Möglicherweise werden Sie aufgefordert, das Kennwort dieses Benutzers einzugeben, jedoch nur einmal.
quelle
sudo
mag praktisch sein, aber es ist nicht gut, wenn es nicht sofort einsatzbereit ist (wie unter AIX).su -c 'commands'
ist die richtige Antwort.Es ist nicht möglich, den Benutzer innerhalb eines Shell-Skripts zu ändern. Problemumgehungen mit sudo, die in anderen Antworten beschrieben sind, sind wahrscheinlich die beste Wahl.
Wenn Sie verrückt genug sind, Perl-Skripte als Root auszuführen, können Sie dies mit den
$< $( $> $)
Variablen tun , die echte / effektive UID / GID enthalten, z.quelle
Das hat bei mir funktioniert
Ich habe meine "Bereitstellung" von meinem "Start" getrennt.
dann in meiner start_env.sh
quelle
Inspiriert von der Idee von @ MarSoft, aber ich habe die Zeilen wie folgt geändert:
Ich habe verwendet
sudo
, um ein Passwort weniger Ausführung des Skripts zu ermöglichen. Wenn Sie ein Kennwort für den Benutzer eingeben möchten, entfernen Sie dassudo
. Wenn Sie die Umgebungsvariablen nicht benötigen, entfernen Sie sie-E
aus sudo.Die
/usr/bin/bash -l
stellt sicher, dass dieprofile.d
Skripte für eine initialisierte Umgebung ausgeführt werden.quelle
sudo
mag praktisch sein, aber es ist nicht gut, wenn es nicht sofort einsatzbereit ist (wie unter AIX).su -c 'commands'
ist die richtige Antwort.sudo
. Tatsächlich ist sudo nicht so einfach. In vielen Fällen benötigen Sie sogarsudo -E
einen Konfigurationseintrag in sudoers.d, um die Ausführung ohne tty mit zu ermöglichen!requiretty
. Es gibt jedoch viele Fälle, in denen sudo für automatisch aufgerufene Skripte erforderlich ist, in denen ein Kennwortdialog stören kann. Daher würde ich es nicht aus einer Standardlösung entfernen."$@"
Einfügen in eine Zeichenfolge bedeutet, dass Argumente nach der ersten Zeichenfolge an eine separate Zeichenfolge angehängt werden, die nicht im-c
Argument enthalten ist. Wenn Sie es sicher machen wollten, könnten Sieprintf -v arg_q '%q ' "$0" "$@"
und dannsu "$USERNAME" -c "/usr/bin/bash -l $arg_q"
COMMANDARGS=$@
löst das Problem mit-c
. Argumente mit Leerzeichen waren vorher kein Problem, aber ich habe Ihre gute Eingabe implementiert. Ich musste nur einige Experimente durchführen, damit es funktioniert Ich habe die Frage bearbeitet und hoffentlich habe ich keinen weiteren Fehler