【问题标题】:When redirecting in bash to stdout or stderr, I actually get redirected to a file在 bash 中重定向到 stdout 或 stderr 时,我实际上被重定向到一个文件
【发布时间】:2014-07-30 02:11:42
【问题描述】:

我正在保存通过 ssh 在远程执行的一个命令的输出,但我也执行了一些回显。为了在屏幕上看到消息而不是将它们保存到我想重定向它们的变量中。 我尝试过 >&1 和 >&2 但在每种情况下都会创建一个名称为“1”或“2”的文件 这是扩展引号或转义字符的问题吗?

OUTPUT=$(sshpass -p password ssh user@ip 'echo "Message1" >&2 ;
                                          su -lc "./rootscript.sh" >&2; 
                                          echo "$?" ')
echo "su output is: $OUTPUT"

输出:

屏幕上什么都没有,一个名为“2”的文件,其中包含文本“Password”(假设消息 1 已被覆盖)程序仍然等待密码,即使没有提示,所以当我输入它时输出很好:

su output is: 0

如何让我的消息显示在屏幕上?

【问题讨论】:

  • 我不希望OUTPUT 包含除退出状态之外的任何内容; su 的输出被重定向到标准错误,因此不会被命令替换捕获。不过,>&2 似乎被解释为>2 的事实确实难倒我。
  • 无论如何,我强烈建议使用公钥认证而不是sshpass
  • 机器ip 上的user 的默认shell 实际上是C shell——还是其他一些非POSIX shell?
  • @natharra,如果没有&,创建一个名为2 的文件会发生什么。既然如此,我几乎想知道 sshpass 是否无法通过未修改的方式传递其参数。
  • 这看起来很像 C shell 派生的。另一种调试选项:将bash -c '...' 替换为bash -xvc '...'-x 启用跟踪; -v 启用详细模式,在阅读时打印“脚本”。 -x 输出不一定显示 I/O 重定向,但 -v 输出确实显示了这一点。但我怀疑尽管您尽了最大努力,但这是 tcshbash 的问题。

标签: bash redirect ssh stdout stderr


【解决方案1】:

@JonathanLeffler 立即发现了问题——您使用的不是 bash,而是 tcsh。

tcsh 有自己的语法与 bash 不兼容。

不过没关系:因为sshsshpass 返回远程命令的退出代码,你应该这样做:

if sshpass -p password ssh user@ip 'echo "Message1"; su -lc "./rootscript.sh"'
then
  echo "The command succeeded (exit code $?)"
else
  echo "The command failed (exit code $?)"
fi

如果您真的想在远程 shell 上以 bash 运行某些东西,您可以使用 Charles Duffy 的代码并稍作改动:

                                      #    v-- shell specified here
output=$(sshpass -p password ssh user@ip bash << 'EOF'
   echo "Message1" >&2
   su -lc "./rootscript.sh" >&2 
   echo "$?"
EOF
)

【讨论】:

  • 很好的解决方法,无需存储或重定向,谢谢!我会稍微改变一下我的命令,因为我希望 su 的输出必须是我在 ssh 中执行的最后一个命令,而且我还有一个额外的命令,但它是可以修复的 :)!
猜你喜欢
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2010-10-14
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多