Impossibile espandere l'asterisco senza l'autorizzazione appropriata


16

Qualcuno può spiegarmi quanto segue?

$ ls -ld /temp/sit/build/
dr-xr-s--- 3 asdf qwer 4096 Jan 31  2012 /temp/sit/build/

$ ls -ld /temp/sit/build/*
ls: /temp/sit/build/*: Permission denied

Quindi, con apprensione, non posso usare l'asterisco qui. L'ho provato con un comando sudo e ho ricevuto un errore "nessun file simile" piuttosto che "permesso negato" ...

sudo ls -l /temp/sit/build/*
ls: /temp/sit/build/batch*: No such file or directory

ma alla fine funziona se non uso il *

sudo ls -l /temp/sit/build/
total 4
dr-xr-s--- 11 asdf qwer 4096 Oct  3 23:31 file

Risposte:


20

La shell che sta eseguendo l'espansione del *carattere jolly è la shell in cui la si digita. Se la shell ha il permesso di leggere la lista dei file nella directory, poi si espande /temp/sit/build/*a /temp/sit/build/file, e funziona sudocon gli argomenti ls, -le /temp/sit/build/file. Se la shell non è in grado di trovare alcuna corrispondenza per /temp/sit/build/*(sia perché non ci sono corrispondenze, sia perché la shell non ha il permesso di vedere le corrispondenze), allora lascia da solo lo schema e sudoviene chiamato con gli argomenti ls, -le /temp/sit/build/*.

Dato che non è stato chiamato alcun file /temp/sit/build/*, il lscomando si lamenta se lo si passa con quel nome. Ricordiamo che lsnon espande i caratteri jolly, questo è il lavoro della shell.

Se si desidera che l'espansione dei caratteri jolly avvenga in una directory in cui non si dispone dell'autorizzazione in lettura, l'espansione deve avvenire in una shell avviata sudoanziché nella shell che chiama sudo. sudonon avvia automaticamente una shell, è necessario farlo esplicitamente.

sudo sh -c 'ls -l /temp/sit/build/*'

Qui, ovviamente, puoi fare sudo ls -l /temp/sit/build/invece, ma questo non si generalizza ad altri schemi.


1

In alcuni rari casi è necessario ricontrollare che non si è disabilitato il globbing per la shell che potrebbe darti No such file or directoryquando si tenta di elencare i file con il carattere jolly ( *).

Per esempio:

$ ls /tmp/sit/build/*
/tmp/sit/build/file
$ set -f
$ ls /tmp/sit/build/*
ls: cannot access /tmp/sit/build/*: No such file or directory
$ set +f
$ ls /tmp/sit/build/*
/tmp/sit/build/file

Controlla help setper maggiori informazioni.

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.