Problem beim Ausführen des Befehls "newgrp" im Skript
9
Ich möchte die Arbeitsgruppe in meinem Skript ändern. Also habe ich eine Zeile newgrp test_grp1in mein Skript geschrieben. Mein Skript wird jedoch nach dem Ausführen dieser Zeile automatisch beendet. Gibt es eine Lösung, um dieses Problem zu lösen?
newgrpStartet eine Subshell mit der von Ihnen angegebenen Gruppe. Diese Zeile in Ihrem Skript wird also erst beendet, wenn diese Unterschale fertig ist.
Die Handhabung von newgrpist auch anders, wenn Sie bashoder verwenden ksh. kshimplementiert es als integrierten Befehl, der äquivalent zu ist exec /usr/bin/newgrp [group]. Also, wie exec, newgrpkehrt nie zurück. (Siehe Dokumentation hier .)
Wenn Sie möchten, dass es zurückkehrt und Befehle in dieser Subshell mit geänderter Gruppenidentität ausführen möchten, können Sie die Umleitung verwenden.
Zum Beispiel:
#!/bin/ksh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
id
EONG
echo "After newgrp"
Hinweis: /usr/bin/newgrpwird explizit aufgerufen, um das Implizite execvon zu vermeiden ksh. Der letzte Befehl in diesem Skript wird in der ursprünglichen Shell mit der ursprünglichen Gruppenidentität ausgeführt.
Nur eine Anmerkung, dass das schließende EONG nicht eingerückt werden sollte
toing_toing
2
Sobald ein Prozess gestartet wurde, kann er keine zusätzlichen Berechtigungen mehr erhalten. Sie können also keine Gruppenmitgliedschaft mitten in einem Skript erhalten. Sie können das gesamte Skript mit der zusätzlichen Gruppenmitgliedschaft ausführen:
newgrp test_grp1
/path/to/script
Sie können Ihr echtes GID-Mid-Script nicht ändern. Wenn Sie das wirklich brauchen, wechseln Sie zu einer Sprache, in der Sie können, wie z. B. Perl. Es ist jedoch selten, dass Sie Ihre echte GID ändern müssen, da dies nicht viel ausmacht. Normalerweise reicht es aus, gelegentlich aufzurufen chgrp(zuerst Dateien ohne Gruppenberechtigungen erstellen, dann ausführen chgrpund dann Gruppenberechtigungen hinzufügen; wenn Sie Dateien mit Gruppenberechtigungen erstellen, gibt es eine Race-Bedingung: Ein Benutzer, der sich in der ersten Gruppe befindet, kann die öffnen Datei, bevor Sie Zeit zum Ausführen haben chgrp).
Gibt es einen Grund, warum dies nicht möglich ist, indem die zweite Hälfte des Skripts in eine Unterschale eingeschlossen wird?
Caleb
@Caleb Streng genommen keine Subshell, aber Sie können ein Skript an die Shell übergeben, die von newgrpder Standardeingabe aufgerufen wird , wie in Mat's Antwort .
newgrp docker
Sobald ein Prozess gestartet wurde, kann er keine zusätzlichen Berechtigungen mehr erhalten. Sie können also keine Gruppenmitgliedschaft mitten in einem Skript erhalten. Sie können das gesamte Skript mit der zusätzlichen Gruppenmitgliedschaft ausführen:
Sie können Ihr echtes GID-Mid-Script nicht ändern. Wenn Sie das wirklich brauchen, wechseln Sie zu einer Sprache, in der Sie können, wie z. B. Perl. Es ist jedoch selten, dass Sie Ihre echte GID ändern müssen, da dies nicht viel ausmacht. Normalerweise reicht es aus, gelegentlich aufzurufen
chgrp
(zuerst Dateien ohne Gruppenberechtigungen erstellen, dann ausführenchgrp
und dann Gruppenberechtigungen hinzufügen; wenn Sie Dateien mit Gruppenberechtigungen erstellen, gibt es eine Race-Bedingung: Ein Benutzer, der sich in der ersten Gruppe befindet, kann die öffnen Datei, bevor Sie Zeit zum Ausführen habenchgrp
).quelle
newgrp
der Standardeingabe aufgerufen wird , wie in Mat's Antwort .