【问题标题】:Nested grep with SSH使用 SSH 嵌套 grep
【发布时间】:2016-02-02 22:05:57
【问题描述】:

我有一个成功运行的以下 Shell 命令:

sed -e "1,/^$(date -d -24hour +'%Y-%m-%d %H')/d" logfile | grep -A20 -B10 'Exception' | mail -s "Sample report" xyz@yourdomain

但是,我必须通过 SSH 连接到特定的机器才能运行它。为避免这种情况,我按以下方式对其进行了修改,导致失败:

ssh myserver 'sed -e "1,/^$(date -d -24hour +'%Y-%m-%d %H')/d" logfile | grep -A20 -B10 'Exception' | mail -s "Sample report" xyz@yourdomain '

这个命令有什么问题?我该如何解决这个问题?

【问题讨论】:

  • 顺便说一句,在未来,而不是简单地“导致失败”,请在您的问题中指定该失败的详细信息。

标签: linux bash shell ssh


【解决方案1】:

将您的代码嵌入引用的 heredoc 中以避免需要修改它(本质上这是一个容易出错的过程):

ssh myserver 'bash -s' <<'EOF'
  sed -e "1,/^$(date -d -24hour +'%Y-%m-%d %H')/d" logfile \
    | grep -A20 -B10 'Exception' \
    | mail -s "Sample report" xyz@yourdomain
EOF

在此处的特定情况下,原始修改失败的明显原因是内部单引号终止了整个代码周围的单引号。

具体来说:

+'%Y-%m-%d %H'

...该表达式中的第一个 ' 终止了命令之前的一个开头,因此该空格不受语法保护。

您可以改为执行以下操作,因为您的 shell 是 bash:

ssh myserver $'sed -e "1,/^$(date -d -24hour +\'%Y-%m-%d %H\')/d" logfile | grep -A20 -B10 Exception | mail -s "Sample report" xyz@yourdomain'

$'' 是一个扩展,其中反斜杠可以转义单引号(也可用于其他文字——\n 用于换行,\t 用于制表符等),典型的 POSIX sh 不具备的功能语法。

相比之下,在 POSIX sh 中,可以切换引用类型以嵌入文字单引号:'foo'"'"'bar' 以定义带有 foobar 单引号的字符串,并由单个文字单引号分隔- 它们之间的引用——完全有效的语法,但对于不熟悉该习语的读者来说不一定容易处理)。

【讨论】:

  • 顺便说一句,bash -s 的重点是让您可以轻松地从代码块中带外传递参数——因此,如果您希望在 heredoc 中传递的代码块引用"$1" 为电子邮件地址,"$2" 为主题,您可以使用printf -v args_str '%q ' "$email" "$subject" 将它们从封闭外壳的解释中转义,然后使用ssh myserver "bash -s $args_str"
猜你喜欢
  • 2022-01-08
  • 2012-06-18
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2016-02-02
  • 2016-06-12
相关资源
最近更新 更多