考虑以下基础设施:
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。
将单引号交换为双引号会导致类似的问题。我还尝试将命令准备为字符串、函数和单独的文件,但没有成功。
我会做什么,使用 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的左侧部分,您必须使用制表符,而不是空格。