grep com variável usando ssh

2

Eu quero procurar os arquivos em um diretório que contenha as duas palavras wrod1 e word2 . Eu uso o seguinte quando quero pesquisar no diretório local e funciona bem:

for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2
 $FILE && echo $FILE; done

Como não posso usar variáveis ao trabalhar com o host remoto, o que devo fazer em vez disso. Eu descobri de outros tópicos ( Remote for-loop sobre SSH ) que as pessoas usam o comando para conectar ao servidor e, em seguida, colocar o comando find na citação logo em seguida. Semelhante a isto:

 ssh -l username servername 'for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2 $FILE && echo $FILE; done' 

mas isso ainda não funciona para mim.
O comando que estou executando agora (ainda me dá erros):

ssh username@servername sh -c 'for FILE in /pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'

Erros

FILE: -c: line 0: syntax error near unexpected token 'newline'
FILE: -c: line 0: 'for'
FILE: Undefined variable
    
por april 11.10.2017 / 19:01

1 resposta

2

Como o shell padrão é tcsh no host remoto, convém iniciar explicitamente um sh shell:

ssh username@servername sh -c 'for FILE in pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'

Note também que você deve citar duas vezes a expansão da variável $FILE para lidar com nomes de arquivos que possuem caracteres exóticos.

Observe também que, embora você use word1 e word2 com grep , estas são expressões regulares e não palavras . Para procurar palavras em um arquivo, use grep -wF "word" .

Parece que ssh sempre executará o shell de login para executar o comando fornecido no host remoto, e se isso for tcsh , é realmente difícil obter o direito de citar em o script da linha de comando.

Duas soluções (e também não gosto muito):

  1. Altere o shell de login no host remoto para um shell semelhante a sh , como bash , ksh ou zsh . Faça isso efetuando login no host e execute chsh .

  2. Coloque o script em um arquivo de script e execute-o em ssh com

    ssh username@servername sh ./script.sh
    
por 11.10.2017 / 19:16

Tags