Por que o sudo cp não consegue localizar os arquivos?

6

Quem pode me dar uma explicação lógica para esse problema:

Eu não posso executar este comando:

sudo cp /data/*20150522* /backup/

cp: cannot stat '/data/*20150522*': No such file or directory

E quando eu mudo para root, ele funciona sem problemas.

Tenho certeza que é sobre ter os privilégios certos para listar os arquivos dentro do diretório / data que possuem os seguintes privilégios de acesso:

drwxrwx--- 1 root root 

Mas aqui estou executando o comando com o sudo, então qual é o problema aqui?

    
por IMAnis_tn 22.05.2015 / 18:41

1 resposta

16

O shell tenta a expansão do padrão glob antes de passar o resultado expandido para cp (na verdade, ele está passando o resultado para sudo , que então passa inalterado para cp ). Como o shell (ele está rodando como você, e não como root) não é capaz de atravessar o diretório, cp acaba recebendo o padrão unexpanded em sua lista de argumentos.

cp não executa nenhuma expansão glob. Espera uma lista de nomes de arquivos. A string com o padrão não nomeia um arquivo.

Talvez a maneira mais direta de executar a tarefa seja invocar seu comando em um sub-shell. Cite o comando com aspas duplas ( " ) ou aspas simples ( ' ).

sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'

Isso funciona porque o sub-shell expande o padrão glob na string de comando antes de invocar o comando. Como o sub-shell está sendo executado como root em sudo , a expansão é bem-sucedida.

Usar aspas duplas para citar o comando para o sub-shell permite que o shell pai expanda as variáveis do shell antes de chamar o comando sudo . Se você quiser que as variáveis sejam expandidas pelo sub-shell, as aspas simples devem ser usadas no lugar. Neste caso, é equivalente, desde que você não tenha nenhuma variável. Mas você pode adicionar um para ver a diferença de comportamento.

sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'

O primeiro comando exibirá seu nome de usuário, enquanto o segundo comando exibirá o nome de usuário root.

    
por 22.05.2015 / 18:47

Tags