通过 Jumphost 的 SSH 远程代码执行脚本(嵌套引号)

问题描述 投票:0回答:1

考虑以下基础设施:

ServerA ---> ServerB ---> ServerC

我想从

ServerC
获取大文件(因此首先过滤它们)并通过在
ServerA
上运行脚本将它们保存在
ServerA
上。

以下命令成功检索与我的模式匹配的所有文件名并将其保存在变量

$myfiles
中:

myfiles=$(ssh root@$serverB -C $"\
          ssh -o StrictHostKeyChecking=no root@$serverC -C $'\
          (find . -name "mypattern" | sort)' </dev/null")

我必须首先使用以下命令过滤它们,而不是仅仅传输数据:

grep mypattern $myfile | awk -F '[| =]+' '{print $1 "/" $2 "/" $3, $4}' OFS=';'

现在,我遇到了嵌套引用问题,因为 awk 用单引号分割命令:

while read file
do
   output=$( ssh root@$serverB -C $"\
             ssh -o StrictHostKeyChecking=no root@$serverC -C $'\
             (grep mypattern $myfile | awk -F '[| =]+' '{print $1 "/" $2 "/" $3, $4}' OFS=';')'\
             </dev/null")
   # do something with $output
done <<< "$myfiles"

有什么办法让它以这种嵌套的方式运行吗?

注意: ssh Jumphost 标志不应起作用,因为只能使用 ServerB 上带有 StrictHostKeyChecking 标志的 ssh 命令来访问 ServerC。

将单引号交换为双引号会导致类似的问题。我还尝试将命令准备为字符串、函数和单独的文件,但没有成功。

bash awk ssh quotes remote-execution
1个回答
0
投票

我会做什么,使用 shell here-doc:

while read file; do
   output=$(
       ssh root@$serverB <<-EOF1
             ssh -o StrictHostKeyChecking=no root@$serverC <<-EOF2
             grep mypattern $myfile | awk -F '[| =]+' '{print $1 "/" $2 "/" $3, $4}' OFS=';'
             EOF2
        EOF1
   )
   # do something with $output
done <<< "$myfiles"

here-doc的左侧部分,您必须使用制表符,而不是空格。

© www.soinside.com 2019 - 2024. All rights reserved.