Não é possível expandir o asterisco sem a devida permissão

14

Alguém pode me explicar o seguinte?

$ 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

Portanto, não posso usar o asterisco aqui. Eu tentei com um comando sudo e recebi um erro "no such file" ao invés de "permission denied" ...

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

mas finalmente funciona se eu não usar o *

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

2 respostas

16

O shell que está fazendo a expansão do curinga * é o shell onde você o digita. Se o shell tiver permissão para ler a lista de arquivos no diretório, ele expandirá /temp/sit/build/* para /temp/sit/build/file e executará sudo com os argumentos ls , -l e /temp/sit/build/file . Se o shell não conseguir encontrar qualquer correspondência para /temp/sit/build/* (seja porque não há correspondências ou porque o shell não tem permissão para ver as correspondências), ele deixará o padrão sozinho e sudo será chamado com o caractere argumentos ls , -l e /temp/sit/build/* .

Como não há nenhum arquivo chamado /temp/sit/build/* , o comando ls reclama se você passar esse nome para ele. Lembre-se de que ls não expande curingas, esse é o trabalho do shell.

Se você quiser que uma expansão com curinga ocorra em um diretório no qual não tenha permissão de leitura, a expansão deverá ocorrer em um shell iniciado por sudo em vez de no shell que chama sudo . sudo não inicia automaticamente um shell, você precisa fazer isso explicitamente.

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

Aqui, é claro, você pode fazer sudo ls -l /temp/sit/build/ , mas isso não é generalizado para outros padrões.

    
por 20.11.2013 / 01:05
0

Em alguns casos raros, é necessário verificar novamente se você não desativou a globalização do seu shell, o que poderia fornecer No such file or directory ao tentar listar arquivos com curinga ( * ).

Por exemplo:

$ 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

Verifique help set para mais informações.

    
por 13.02.2016 / 19:37