Alguém pode explicar por que o sudo ls com um curinga não funciona?

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

Alguém pode explicar por que isso acontece? Eu estou preso em um script devido a isso.

    
por Faisal 29.03.2016 / 00:32

2 respostas

24

Uma possibilidade é que você não tenha permissões para acessar um ou mais diretórios nesse caminho ( /sites/servers/server_instance/logs ). A expansão de caractere curinga é executada pelo seu shell e, em seguida, os caminhos expandidos são passados para o comando sudo .

Se o seu usuário não tiver permissões, a expansão não funcionará no primeiro comando. Ele seria executado como está ( ls -ltr /sites/servers/server_instance/logs/access* ) e não há um arquivo literalmente denominado access* ). Se abc tiver as permissões necessárias para todos os diretórios no caminho, o segundo comando, que não possui nenhum caractere curinga, não será afetado pelo seu shell e funcionará bem.

$ 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
    
por muru 29.03.2016 / 00:54
6

Você pode ter desativado a globulação.

Procure por algo como set -f ou set -o noglob antes dessas linhas no script ou, se estiver em um shell interativo, execute echo $- ; se houver um f na saída, a globbing está desativada:

$ echo $-
fhimBH

Para corrigir isso, remova set -f ou set -o noglob do script ou, se estiver em um shell interativo, execute 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
    
por kos 29.03.2016 / 00:48