Gibt es eine Möglichkeit, eine Funktion von einem Benutzer an einen anderen Benutzer zu übergeben?
Zum Beispiel habe ich ein kleines Bash-Skript, das ich als Root ausführe:
#!/bin/bash
user_func(){
whoami
exit
}
su vagrant -c 'user_func'
Die user_func-Funktion ist jedoch nicht für den Vagrant-Benutzer definiert, sondern nur für Root und kann nicht ausgeführt werden.
Meine andere Option wäre, mehrere Zeilen von zu haben
su vagrant -c 'cmd1'
su vagrant -c 'cmd2'
, etc
Oder führen Sie mehrere Befehle aus su vagrant -c 'cmd1; cmd2; cmd3;'
, z. B., aber ich würde es vorziehen, nicht den Überschuss zu haben, insbesondere wenn Sie versuchen, mehr als 5 Befehle als Vagrant-Benutzer auszuführen.
Ist es möglich, eine Funktion innerhalb desselben Skripts an einen anderen Benutzer zu übergeben (z. B. kein Skript auf der Festplatte als anderer Benutzer zu erstellen und dann das generierte Skript auszuführen)? Oder gibt es eine andere Option, die ich übersehen habe?
su
die Umgebung außer Kraft gesetzt wird.vagrant
istbash
. Wenn nicht,su vagrant -c 'bash -c user_func'
Es ist ein bisschen hackisch, aber Sie können die Definition der Funktion innerhalb des Befehls drucken, der an übergeben wurde,
su
und sie dann natürlich verwenden.Dies funktioniert auch dann, wenn aus irgendeinem Grund die Umgebung der von erzeugten Shell
su
überschrieben wird, da die Definition nach der Shell-Initialisierung eingefügt wird. Wenn Sie die Funktion kompatibel genug schreiben, funktioniert sie sogar, wenn die beiden fraglichen Benutzer unterschiedliche Shells verwenden.quelle
su
Umgebung der Shell durch externe Faktoren überschrieben werden? Ich meine, in diesem Fall haben Sie die vollständige Kontrolle über diesu
Befehlszeile, da sie in einem Skript enthalten ist. Wie kann die Umgebung der neuen Shell überschrieben werden?su
eine Initialisierung der Umgebung durchführen. Auchsu
selbst kann ein Teil der Umgebung des Anrufers entfernt werden, um die Sicherheit ein wenig zu erhöhen (obwohl dies normalerweise durch leistungsfähigere Alternativen wiesudo
) erfolgt.Das ist kein Skript, das Sie haben, es ist eine Funktion. Es hört sich jedoch so an, als ob Sie ein Skript möchten . Erstellen Sie ein geeignetes Skript und fügen Sie es je nach Bedarf entweder in
/usr/local/bin
oder in ein/home/vagrant/bin
, und dann sollten Sie in der Lage sein, zsu vagrant -c '/home/vagrant/bin/myscript.sh'
quelle
Eine andere, etwas portablere Möglichkeit, dies zu tun (keine Bash-Abhängigkeit), besteht darin, dass Ihr Skript sich selbst aufruft und sein Verhalten basierend auf dem Kontext (UID) oder den Parametern ändert. Beispiele hierfür finden Sie in der Dokumentation, in der
super
ein Skript angezeigt wird, für das Root-Berechtigungen erforderlich sind.quelle