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


16
$ 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? Estou preso em um script devido a isso.

Respostas:


29

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

Se o usuário não tiver permissões, a expansão não funcionará no primeiro comando. Seria executado como está ( ls -ltr /sites/servers/server_instance/logs/access*) e não há um arquivo chamado literalmente access*). Se abctiver as permissões necessárias para todos os diretórios no caminho, o segundo comando, que não possui caracteres curinga, seria intocado pelo seu shell e funcionaria 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

obrigado Muru, sua opinião estava correta, mudei a permissão para 755 e agora está funcionando bem.
Faisal

3
@ Faisal: Eu acho que alterar permissões não é o remédio adequado, embora revele que o diagnóstico está correto. O remédio apropriado parece ser a não englobamento enquanto prepara o comando sudo, mas sim suprimi-lo aqui (citando o argumento path), passando o argumento como está ao lscomando que pode então (quando a mudança de identidade a partir sutomou efeito) faça o globbing.
Marc van Leeuwen

2
@MarcvanLeeuwen lsnão faz nenhuma globbing.
Muru

3
Você pode fazer o globbing acontecer no ambiente sudo adicionando sh -cà linha de comando.
precisa

@Faisal se isso responde a sua pergunta, considere aceitar isso ...
Clem Steredenn

7

Você pode ter o globbing desativado.

Procure algo como set -fou set -o noglobantes dessas linhas no script ou se estiver executando um shell interativo echo $-; se houver um fna saída, o globbing está desativado:

$ echo $-
fhimBH

Para corrigir isso, remova set -fou set -o noglobdo script ou, em um shell interativo, execute set +fou 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

Sim, eu, como usuário individual, não tenho acesso a esse caminho. No script, estou indo como meu usuário (via ssh) e executando esse comando via usuário de produção. Existe alguma solução para isso? (Um ponto a salientar é que eu não tenho que dar a senha para mudar usuário)
Faisal

@Faisal Que tal executar o script como usuário de destino ( sudo -u abc /path/to/script)? Nesse caso, o globbing não deve falhar. De qualquer forma, muru sugeriu a questão do caminho em sua resposta, não eu. Você deve aceitar a resposta dele ( askubuntu.com/help/accepted-answer ).
kos

Na verdade, eu estou executando isso na máquina remota via script, então -i seria necessário. Obrigado também por responder.
Faisal
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.