In un comando `sudo find`, come posso assicurarmi che il comando` -exec` sia eseguito come utente normale?


10

Sto cercando di far funzionare il seguente comando in modo che lo process_pathsscript non venga eseguito con privilegi elevati. C'è un modo per fare questo?

sudo find /path/ -exec process_paths '{}' \+

Qui ci /path/sono alcuni file che non hanno il permesso di lettura per l'utente normale. Lo script ha process_pathssolo bisogno dei percorsi.


... -exec sudo -u user process_paths {} \+
Satō Katsura,

@SatoKatsura a volte questo fallisce con sudo: unable to execute /usr/bin/perl: Argument list too long: /
pii_ke il


2
Se si desidera che i -execcomandi vengano richiamati come utente, perché lo si findutilizza sudoin primo luogo?
marzo

2
@marcelm Penso che l'ultima frase della domanda risponda alla tua.
Ehi,

Risposte:


16

Sui sistemi che lo supportano (GNU e molti altri), potresti fare:

sudo find /path/ -print0 | xargs -r0 process_paths

xargsnon viene eseguito sudo, quindi ha ancora gli uid / gids originali e anche l'ambiente originale (in senso lato), non quello modificato da sudo.

process_pathsstdin finisce per essere modificato (a seconda xargsdell'implementazione, è aperto /dev/nullo condivide il pipeda sudo/ find.

Per evitarlo (con GNU xargse shell simili ksh, zsho bashche supportano la sostituzione del processo), potresti fare:

xargs -r0a <(sudo find /path/ -print0) process_paths

Con zsh:

sudo zsh -c '
   files=(/path/**/*(D))
   USERNAME=$SUDO_USER
   autoload zargs
   zargs $files -- process_paths'

In zsh, assegnando un nome utente alla $USERNAMEvariabile speciale, imposta gli uid, i gids a quello dell'utente corrispondente nel database degli utenti come sudo -u "$SUDO_USER"farebbe.

Potresti fare:

 sudo sh -c '
   exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'

Ma poiché sudopassa una $SUDO_COMMANDvariabile di ambiente (che contiene la concatenazione degli argomenti con spazi) a process_paths, l'elenco dei file finisce per essere passato due volte, il process_pathsche significa che è possibile raggiungere il limite sulla dimensione massima di args + env se c'è un grande numero di file.

Con la maggior parte delle suimplementazioni, dovresti essere in grado di fare:

 sudo sh -c '
   exec find /path/ -exec su "$SUDO_USER" -c '\''
     exec "$0" "$@"'\'' process_paths {} +'

sebbene sunon abbia lo stesso problema.


1

Puoi usare sudo:

sudo find <directory> -exec sudo -u <normal_user> <command> {} \;

Ma come detto in un commento, apparentemente può fallire se {} è troppo lungo per sudo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.