排除 ssh 的输出,仅记录发现的错误

排除 ssh 的输出,仅记录发现的错误
typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "
  $(cat);
  IFERROR=$(checkscript);
  echo "$IFERROR"" > ${SSHTEMPFILE} 2>&1    

这一行...我无法从 ssh 中排除“用户授权”消息...IFERROR 返回我需要跟踪的值,而且“!!! AUTHORIZED USE ONLY !!!”来自 ssh 的可怕消息...已经尝试过类似的操作,但它不起作用:

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "
  $(cat);
  IFERROR=$(checkscript);
  echo "$IFERROR"" | grep -v "AUTHORIZED"  > ${SSHTEMPFILE} 2>&1    

答案1

您尝试排除的消息可能是 ssh 横幅。这个显示在 上stderr,这就是为什么grep -v不能在您的脚本中工作的原因。

只是尝试重定向stderrstdin grep。它应该有效。我不太明白你的命令,但它看起来像这样:

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "$(cat); IFERROR=$(checkscript); echo "$IFERROR"" 2>&1 | grep -v "AUTHORIZED" > ${SSHTEMPFILE}

PS:这样做的目的是什么$(cat)

答案2

我不确定你想做什么,但你的脚本中至少有一个明显的错误。你有

ssh "$(cat); …"$IFERROR"" | …

该片段$IFERROR不在引号内,它由本地 shell 扩展以构建要执行的 SSH 命令。你想echo "$IFERROR"在远程端执行,所以需要引用 来$防止它在本地扩展:

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "
  $(cat);
  IFERROR=$(checkscript);
  echo \"\$IFERROR\"" > ${SSHTEMPFILE} 2>&1

checkscript命令也在本地执行。如果您打算远程执行它,请更改IFERROR=$(checkscript)IFERROR=\$(checkscript).

您不需要将 的输出存储checkscript在变量中。你可以,但这让你的生活变得更加复杂,而且没有任何好处。直接获取它的输出即可。

typeset -f |
sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "$(cat); checkscript" > ${SSHTEMPFILE} 2>&1

相关内容