Qualcuno può spiegare perché sudo ls con un carattere jolly non funziona?


16
$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/access*
ls: cannot access /sites/servers/server_instance/logs/access*: No such file or directory

$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/
total 594812
-rwxrwxrwx 1 abc abc      45 Mar 21 12:42 old.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 12:45 console.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 13:20 access_nginx.log

Qualcuno può spiegare perché questo accade? Sono bloccato su una sceneggiatura a causa di questo.

Risposte:


29

Una possibilità è che non si disponga delle autorizzazioni per accedere a una o più directory in quel percorso ( /sites/servers/server_instance/logs). L'espansione con caratteri jolly viene eseguita dalla shell, quindi i percorsi espansi vengono passati al sudocomando.

Se il tuo utente non dispone delle autorizzazioni, l'espansione non funzionerebbe nel primo comando. Sarebbe eseguito così com'è ( ls -ltr /sites/servers/server_instance/logs/access*) e non esiste un file chiamato letteralmente access*). Se abcha le autorizzazioni necessarie per tutte le directory nel percorso, il secondo comando, che non aveva caratteri jolly, non verrebbe toccato dalla shell e funzionerebbe bene.

$ sudo namei -lx foo/bar/baz
f: foo/bar/baz
drwxr-xr-x muru    muru    foo
drwx------ test    test    bar
drwxr-xr-x muru    muru    baz

$ sudo ls foo/bar/b*
ls: cannot access 'foo/bar/b*': No such file or directory

$ sudo -u test ls foo/bar/
baz

grazie Muru, la tua opinione era corretta, ho cambiato l'autorizzazione a 755 e ora funziona benissimo.
Faisal,

3
@Faisal: Penso che cambiare le autorizzazioni non sia il rimedio adeguato, anche se rivela che la diagnosi è corretta. Il rimedio adeguato sembrerebbe essere quello di non fare globbing durante la preparazione del comando sudo, ma piuttosto di sopprimerlo qui (citando l'argomento path), passando l'argomento così com'è al lscomando che può quindi (quando l'identità cambiata da suha preso effetto) fare il palpitante.
Marc van Leeuwen,

2
@MarcvanLeeuwen lsnon fa tremori .
Muru,

3
Puoi fare in modo che il globbing avvenga nell'ambiente sudo aggiungendolo sh -calla riga di comando.
Stig Hemmer,

@Faisal se risponde alla tua domanda, considera di accettarla ...
clem steredenn,

7

Potrebbe essere disabilitato il globbing

Cerca qualcosa di simile set -fo set -o noglobprima di quelle righe nello script, o se in una shell interattiva echo $-; se c'è un foutput, il globbing è disabilitato:

$ echo $-
fhimBH

Per risolvere il problema, rimuovere set -fo set -o noglobdallo script, oppure se in una shell interattiva eseguire set +fo set +o noglob:

$ set -f
$ echo $-
fhimBH
$ ls access*
ls: cannot access access*: No such file or directory
$ set +f
$ echo $-
himBH
$ ls access*
access

Sì, io come mio singolo utente non ho accesso a quel percorso. Nello script vado come mio utente (tramite ssh) ed eseguo quel comando tramite l'utente di produzione. C'è qualche soluzione alternativa per questo ? (Un punto da notare è che non devo fornire la password per cambiare utente)
Faisal

@Faisal Che ne dici di eseguire lo script come utente target ( sudo -u abc /path/to/script)? In tal caso il globbing non dovrebbe fallire. In ogni caso Muru ha suggerito il problema del percorso nella sua risposta, non io. Dovresti considerare di accettare la sua risposta ( askubuntu.com/help/accepted-answer ).
kos,

In realtà lo sto eseguendo su una macchina remota tramite script, quindi sarebbe necessario -i. Grazie anche a te per aver risposto.
Faisal
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.