使用 ssh 进行带变量的 grep

使用 ssh 进行带变量的 grep

我想搜索目录中包含这两个单词的文件字1字2。当我想在本地目录中搜索时,我使用以下命令并且工作正常:

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

由于在使用远程主机时无法使用变量,我应该做什么。我从其他线程中发现(通过 SSH 进行远程 for 循环)人们使用该命令连接到服务器,然后将 find 命令放在后面的引号中。与此类似:

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

但这对我来说仍然不起作用。
我现在运行的命令(仍然给我错误):

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

错误

FILE: -c: line 0: syntax error near unexpected token `newline'
FILE: -c: line 0: `for'
FILE: Undefined variable

答案1

由于默认 shell 位于tcsh远程主机上,因此您可能需要显式启动shshell:

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

另请注意,您应该双引号$FILE变量扩展来处理包含外来字符的文件名。

另请注意,虽然您使用word1word2with grep,但这些是常用表达并不是。要在文件中查找单词,请使用grep -wF "word".


似乎总是ssh会运行登录 shell 在远程主机上执行给定的命令,如果是这样的tcsh真的很难在命令行脚本中获得正确的引用。

两种解决方案(我都不喜欢):

  1. 将远程主机上的登录 shell 更改为sh类似 shell,如bashkshzsh。通过登录主机并运行来执行此操作chsh

  2. 将脚本放入脚本文件中并通过ssh以下命令执行

    ssh username@servername sh ./script.sh
    

相关内容