Usando curinga no caminho do comando unix find

1

Este comando com um * no caminho de localização funciona bem no servidor local

Svr1$ find /path/*/foo/ -name "*20160208"

Quando eu tento isso remotamente de outro servidor, não funciona

Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/sudo -S find /path/*/foo/ -name "*20160208*"

A mensagem de erro é:

find: stat() error /path/*/foo/: No such file or directory

No entanto, se eu alterar o caminho de pesquisa para evitar o uso do * ele funciona bem. Assim:

Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/sudo -S find /path/ -name "*20160208*"

O que estou fazendo de errado? Eu acho que preciso citar ou escapar parte da string, mas eu simplesmente não consigo descobrir.

Muito obrigado.

    
por LLJ 09.02.2016 / 16:23

2 respostas

2

O * é expandido pelo seu shell local. Você deve citar seu argumento

ssh Svr1 /usr/local/bin/sudo -S find '/path/*/foo/' -name "20160208"
    
por 09.02.2016 / 16:38
1

Como o @Matteo disse, você precisa escapar do * do seu shell local. Ele fez isso em seu primeiro exemplo:

ssh Svr1 /usr/local/bin/sudo -S find '/path/*/foo/' -name "20160208"

Como alternativa, qualquer um desses deve funcionar também, pois as aspas simples ( '...' ) e a barra invertida ( \ ) "ocultam" o curinga * do seu shell local:

ssh -t Svr1 /usr/local/bin/sudo 'find /path/*/foo/ -name *20160208'

ou

ssh -t Svr1 /usr/local/bin/sudo find /path/\*/foo/ -name \*20160208

Como observação, veja que incluí um argumento -t para ssh , de modo que sudo tenha um tty através do qual peça minha senha, que é MUITO melhor do que colocar a senha na linha de comando, IMO. Se você precisar canalizar a senha sudo , sugiro fazer isso via cat secret.txt | find ... , que mantém a senha fora da linha de comando que é potencialmente visível para ps e para qualquer pessoa com acesso ao histórico do shell (incluindo ~/.history e variantes)

    
por 11.02.2016 / 16:10