ls *. * fornece: “*. *: Nenhum arquivo ou diretório” mensagem [duplicada]

13

Estou usando o Linux app-server 3.2.0-4-amd64 # 1 SMP Debian 3.2.41-2 + deb7u2 x86_64 GNU / Linux. Quando eu for para um diretório com vários arquivos chamados name1.php , name1.html , name2.php , etc. e digite:

$ sudo ls *.*

Eu recebo:

ls: cannot access *.*: No such file or directory

Eu tenho o mesmo tipo de problema com grep :

$ grep "TOS.html" *.*
grep: *.*: No such file or directory

Por que isso e como contornar esse problema?

Editar # 1:

$ shopt | grep glob
+ grep glob
+ shopt
dotglob         off
extglob         on
failglob        off
globstar        off
nocaseglob      off
nullglob        off

Editar # 2:

$ ls -ld;echo --;sudo ls -ld 
+ ls --color=auto -ld
drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .
+ echo --
--
+ sudo ls -ld
drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .
    
por OtagoHarbour 23.11.2013 / 01:05

2 respostas

13

Antecedentes

Acho que seu problema é, em última análise, devido a essas permissões nesse diretório:

drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .

Observe que o proprietário ( www-data ) e o grupo ( root ) têm rwx e r-x , respectivamente. No entanto, observe que as outras permissões estão definidas para apenas --x .

Isso significa que você pode executar comandos nesse diretório, mas não pode ler ou executar listagens do conteúdo desse diretório.

Seu cenário

Você é outro usuário (não www-data ) quando executa o comando sudo nesse diretório. Vamos chamar esse usuário, UserX.

Quando o shell invoca este comando como UserX:

$ sudo ls *.*

e retorna isso:

ls: cannot access *.*: No such file or directory

O shell do UserX tentou expandir o *.* para qualquer arquivo, mas como o UserX não pode ler nenhum conteúdo desse diretório, ele não retorna nada. Você está enviando um literal *.* para o sudo ls *.* , que não corresponde a nenhum arquivo literal chamado *.* .

O mesmo problema ocorre quando você tenta executar o comando grep também. Novamente, o UserX não pode ler nenhum dos arquivos e você está instruindo grep a procurar por um arquivo literal, *.* , e não está encontrando nenhum arquivo com esse nome. Daí as mensagens:

cannot access .: No such file or directory

e

.: No such file or directory

Exemplo

Digamos que tenhamos a seguinte configuração, como a sua.

$ sudo chown nginx.root /tmp/afolder
$ sudo chmod 751 /tmp/afolder/
$ sudo ls -ld /tmp/afolder/
drwxr-x--x 2 nginx root 4096 Nov 23 04:10 /tmp/afolder/
$ sudo touch /tmp/afolder/fakefile.txt

Agora vamos nos tornar "UserX", no meu caso é saml :

$ id
uid=500(saml) gid=501(saml) groups=501(saml)

Eu posso fazer o cd no diretório:

$ pwd
/tmp/afolder

Mas quando tento listar os arquivos nesse diretório:

$ ls *
ls: cannot access *: No such file or directory

Mesmos problemas com sudo :

$ sudo ls -l *.*
ls: cannot access *.*: No such file or directory

Invocar um shell e proteger a expansão do * com aspas simples pode obter o que você deseja:

$ sudo bash -c 'ls -l *.*'
-rw-r--r-- 1 root root 0 Nov 23 04:14 fakefile.txt
    
por 23.11.2013 / 10:10
5

Isso deve funcionar:

sudo sh -c 'ls -l *.*'
    
por 23.11.2013 / 10:13