$ 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.
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
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