Staram się, aby następujące polecenie działało w taki sposób, aby process_paths
skrypt nie był uruchamiany z podwyższonymi uprawnieniami. Czy jest na to sposób?
sudo find /path/ -exec process_paths '{}' \+
Oto /path/
niektóre pliki, które nie mają uprawnień do odczytu dla zwykłego użytkownika. Skrypt process_paths
potrzebuje tylko ścieżek.
... -exec sudo -u user process_paths {} \+
sudo: unable to execute /usr/bin/perl: Argument list too long
: /SUDO_COMMAND
zmiennej w find. . [^.] * -type f -print0 | xargs -0 sudo chmod 664; nie działa-exec
polecenia były wywoływane jako użytkownik, dlaczegofind
używaszsudo
w pierwszej kolejności?Odpowiedzi:
W systemach, które go obsługują (GNU i kilka innych), możesz:
xargs
nie jest uruchamiany podsudo
, więc nadal ma oryginalne identyfikatory / gids, a także oryginalne środowisko (w szerszym znaczeniu), a nie zmodyfikowane przezsudo
.process_paths
stdin zostaje jednak zmodyfikowany (w zależności odxargs
implementacji, jest otwarty/dev/null
lub udostępnia plikpipe
zsudo
/find
.Aby tego uniknąć (GNU
xargs
i muszli jakksh
,zsh
lubbash
zastąpienie innych procesów wsparcia), można zrobić:Z
zsh
:W
zsh
, przypisując nazwę użytkownika do$USERNAME
specjalnej zmiennej, ustawia identyfikatory użytkownika, identyfikatory użytkownika na odpowiadającego użytkownika w bazie danych użytkowników, tak jaksudo -u "$SUDO_USER"
zrobiłby to.Mógłbyś:
Ponieważ jednak
sudo
przekazuje$SUDO_COMMAND
zmienną środowiskową (która zawiera konkatenację argumentów ze spacjami)process_paths
, lista plików jest przekazywana dwukrotnie,process_paths
co oznacza, że limit maksymalnej wielkości argumentów + env zostanie prawdopodobnie osiągnięty, jeśli istnieje duża liczba plików.W przypadku większości
su
implementacji powinieneś być w stanie:chociaż
su
nie ma tego samego problemu.źródło
Możesz użyć
sudo
:Ale jak powiedziano w komentarzu, najwyraźniej może się nie powieść, jeśli {} jest za długie na sudo.
źródło