web-dev-qa-db-fra.com

Quelqu'un peut-il expliquer pourquoi Sudo ls avec un wildcard ne fonctionne pas?

$ 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

Quelqu'un peut-il expliquer pourquoi cela se produit? Je suis coincé sur un script pour cette raison.

12
Faisal

Une possibilité est que vous n’ayez pas l’autorisation d’accéder à un ou plusieurs des répertoires de ce chemin (/sites/servers/server_instance/logs). L'expansion des caractères génériques est effectuée par votre shell, puis les chemins d'accès développés sont transmis à la commande Sudo.

Si votre utilisateur ne dispose pas des autorisations, l'expansion ne fonctionnerait pas dans la première commande. Il serait exécuté tel quel (ls -ltr /sites/servers/server_instance/logs/access*), et il n'y a pas de fichier littéralement nommé access*). Si abc dispose des autorisations requises pour tous les répertoires du chemin, la deuxième commande, qui ne contient aucun caractère générique, ne sera pas modifiée par votre shell et fonctionnera correctement.

$ 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
24
muru

Vous avez peut-être désactivé.

Cherchez quelque chose comme set -f ou set -o noglob avant ces lignes dans le script, ou si dans un shell interactif, exécutez echo $-; s'il y a un f dans la sortie, la suppression est désactivée:

$ echo $-
fhimBH

Pour résoudre ce problème, supprimez set -f ou set -o noglob du script ou, si dans un shell interactif, exécutez set +f ou 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
6
kos