无法使用 ssh 在远程服务器中运行命令

无法使用 ssh 在远程服务器中运行命令

我想使用 ssh 进行远程并执行 grep 命令进行模式搜索。

使用下面的脚本但它不起作用。请建议。

read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;

答案1

你的代码:

read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;
  1. 可能read应该read -r -p ... pattern这样才能正确读取反斜杠。
  2. 目前尚不清楚您是否将其用作hostname实际主机名(我认为)的占位符,或者您是否认为这host将获得执行该实用程序的值hostname
  3. 最后一行有一个未终止的单引号字符串。即使最后以单引号终止,变量$pattern也不会因为单引号而扩展。这cd是不必要的。变量$host扩展需要引用,并且命令行标志应位于主机名之前(但在本例中-t不需要)。

建议:

read -r -p "please enter the pattern:" pattern
host=hostname
ssh "$host" find /path -type f -name "'*.gz'" -exec zgrep -e "'$pattern'" /dev/null {} '\;' | grep -F 'Status=completed;'

此处的命令find将查找远程主机上的所有*.gz文件,并用于查找这些文件中的模式。然后结果由最后一个进一步(本地)过滤。我不确定是否应该成为最后一个模式的一部分。如果不应该存在,请将其删除。/pathzgrep$patterngrep;

需要使用"'*.gz'"and进行时髦的引用。"'$pattern'"本地 shell 在调用 之前去掉第一层引号,为远程端的命令ssh留下'*.gz''...'(无论 的值$pattern是什么) 。find

我们zgrep ... /dev/null ...确保zgrep始终会收到至少两个文件(/dev/null以及 来自 的另一个文件/path),以便匹配文件的文件名将出现在其输出中。

grep -F会将给定字符串视为固定字符串而不是正则表达式。它在这里既可以作为文档,也可以加快处理速度。

相关内容