Ich versuche, den folgenden Befehl so process_paths
auszuführen , dass das Skript nicht mit erhöhten Rechten ausgeführt wird. Gibt es eine Möglichkeit, dies zu tun?
sudo find /path/ -exec process_paths '{}' \+
Hier /path/
gibt es einige Dateien, die keine Leseberechtigung für normale Benutzer haben. Das Skript process_paths
benötigt nur die Pfade.
... -exec sudo -u user process_paths {} \+
sudo: unable to execute /usr/bin/perl: Argument list too long
: /SUDO_COMMAND
Variablen in find. . [^.] * -Typ f -print0 | xargs -0 sudo chmod 664; funktioniert nicht-exec
Befehle als Benutzer aufgerufen werden, warum laufen Siefind
mitsudo
in erster Linie?Antworten:
Auf Systemen, die dies unterstützen (GNU und einige andere), können Sie Folgendes tun:
xargs
wird nicht unter ausgeführtsudo
, hat also immer noch die ursprünglichen Uids / Gids und auch die ursprüngliche Umgebung (im weiteren Sinne), nicht die von modifiziertesudo
.process_paths
stdin wird jedoch geändert (abhängig von derxargs
Implementierung ist es offen für/dev/null
oder teilt daspipe
fromsudo
/find
.Um zu verhindern , dass (mit GNU
xargs
und Muscheln wieksh
,zsh
oderbash
dass die Unterstützung Prozess Substitution), könnten Sie tun:Mit
zsh
:In
zsh
einen Benutzernamen auf die Zuweisung von$USERNAME
speziellen Variablen, setzt die uids, gids zu der des entsprechenden Benutzers in der Benutzerdatenbank wiesudo -u "$SUDO_USER"
tun würde.Du könntest es tun:
Da
sudo
jedoch eine$SUDO_COMMAND
Umgebungsvariable (die die Verkettung der Argumente mit Leerzeichen enthält) an übergeben wirdprocess_paths
, wird die Liste der Dateien zweimal übergeben,process_paths
was bedeutet, dass die Grenze für die maximale Größe von args + env wahrscheinlich erreicht wird, wenn eine große vorhanden ist Anzahl der Dateien.Bei den meisten
su
Implementierungen sollten Sie in der Lage sein:obwohl da
su
nicht das gleiche Problem hat.quelle
Sie können verwenden
sudo
:Aber wie in einem Kommentar gesagt, kann es anscheinend scheitern, wenn das {} für sudo zu lang ist.
quelle