Dal manuale di findutils:
Ad esempio costrutti come questi due comandi
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;
sono molto pericolosi. La ragione di ciò è che "{}" è espanso in un nome file che potrebbe contenere un punto e virgola o altri caratteri speciali per la shell. Se, ad esempio, qualcuno crea il file,
/tmp/foo; rm -rf $HOME
i due comandi precedenti potrebbero eliminare la home directory di qualcuno.Pertanto, per questo motivo non eseguire alcun comando che passi dati non attendibili (come i nomi dei file) a comandi che interpretano argomenti come comandi da interpretare ulteriormente (ad esempio 'sh').
Nel caso della shell, esiste una soluzione intelligente per questo problema:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;
Questo approccio non è garantito per evitare ogni problema, ma è molto più sicuro che sostituire i dati scelti da un utente malintenzionato nel testo di un comando di shell.
- La causa del problema è
find -exec sh -c "something {}" \;
che la sostituzione per{}
non è quotata e quindi non viene considerata come una singola stringa? Nella soluzione
find -exec sh -c 'something "$@"' sh {} \;
,il primo
{}
viene sostituito, ma poiché{}
non è quotato, non"$@"
ha lo stesso problema del comando originale? Ad esempio,"$@"
sarà ampliato a"/tmp/foo;"
,"rm"
,"-rf"
, e"$HOME"
?perché
{}
non è evaso o citato?
- Potresti fornire altri esempi (ancora con
sh -c
o senza di essa, se applicabile; con o senza ifind
quali potrebbe non essere necessario) in cui si applicano lo stesso tipo di problema e soluzione e quali sono esempi minimi in modo che possiamo concentrarci sul problema e sulla soluzione con minima distrazione possibile? Vedi Modi per fornire argomenti a un comando eseguito da `bash -c`
Grazie.