提问人:xard 提问时间:9/5/2023 最后编辑:xard 更新时间:9/6/2023 访问量:73
通过 Jumphost 的 SSH 远程代码执行脚本(嵌套引号)
SSH Remote Code Execution Script over Jumphost (Nested Quotes)
问:
请考虑以下基础结构: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 myfile
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 标志应该不起作用,因为 ServerC 只能在 ServerB 上使用带有 StrictHostKeyChecking 标志的 ssh 命令来访问。
将报价从单倍交换为双倍会导致类似的问题。我还尝试将命令准备为字符串、函数和单独的文件,但没有成功。
答:
0赞
Gilles Quénot
9/5/2023
#1
我会做什么,使用 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 的左侧,您必须使用制表符,而不是空格。
评论
0赞
xard
9/5/2023
这样,print 语句中的参数就会被删除:awk: cmd. line:1: {print "/" "/" , }
awk: cmd. line:1: ^ syntax error
0赞
Ed Morton
9/5/2023
尝试将转义加倍,例如,因为您有 2 层 ssh 解析它。print \\$1
0赞
xard
9/5/2023
@EdMorton 使用双转义时,脚本使用的参数会进行计算,而不是选择列:print \\$1
awk: cmd. line:1: {print \-c "/" \script_argument1 "/" \-i, \script_argument2, \ \}
1赞
Ed Morton
9/5/2023
@xard然后尝试三重。通常,当一个变量在你想要它之前被扩展时,你可以通过向它抛出转义来解决问题。
1赞
xard
9/6/2023
@EdMorton 三重反斜杠成功了,谢谢!
评论
grep mypattern $myfile
grep mypattern $file
file
myfile
grep foo file | awk '{bar}'
=awk '/foo/{bar}' file
顺便一提。当你使用 awk 时,你永远不需要 grep。