【问题标题】:Get output from a shell script that does ssh two level从执行 ssh 两级的 shell 脚本获取输出
【发布时间】:2021-06-07 21:38:05
【问题描述】:

我有两个 shell 脚本,如下所示:

脚本1:

ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null my_username@jump_box <<EOF
ls
ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null actual_host <<EOF1
sudo docker ps --format='{{json .}}'
EOF1
EOF

脚本2:

details=nothing
ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null my_username@jump_box <<EOF
ls
details=$(ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null actual_host "sudo docker ps --format='{{json .}}'")
EOF
echo "${details}"

我需要本地机器的变量中的 docker 详细信息,以便我可以对其进行一些操作。第一个脚本运行良好,我可以在本地机器上看到 docker 命令的输出,但第二个脚本不起作用。它似乎被挂起/卡住了,什么也没做,我必须强行退出它。

【问题讨论】:

  • Script2 不起作用,因为$( ) 表达式在本地计算机上运行(它在跳转框而不是本地计算机上设置details)。你真的需要在跳转框上运行ls吗?使用ssh -J my_username@jump_box ... 会简化这个吗?
  • @GordonDavisson 不,'ls' 只是为了一些测试目的。我不需要它。将尝试多跳选项,谢谢。

标签: bash docker shell ssh


【解决方案1】:

喜欢@Gordon Davisson的评论,使用跳转框。

但您也可以在~/.ssh/config 文件中定义它。

HOST my_jump_box
  hostname jump_box
  user my_username
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null 

HOST actual
  hostname actual_hostname
  user actual_user
  ProxyJump my_jump_box
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null 
  RemoteCommand sudo docker ps --format='{{json .}}'"

那么你就可以使用ssh actual

获取输出details=$(ssh actual)

顺便说一句。您的具体问题也可以通过将 script2 更改为:

#!/bin/bash
details=$(./script1)
echo "$details"

【讨论】:

  • 非常感谢。后一种方法效果很好。也会尝试前一种方法。如果可以只使用一个脚本而不是两个脚本并从另一个脚本调用一个脚本,那就太好了。
  • @TAnna 你可以在一个脚本中完成,但你必须将整个ssh 命令和此处的文档 包含在$( ) 中(以及关闭括号必须在EOF 标记之后的行上)。
猜你喜欢
  • 2016-11-03
  • 2018-03-29
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多