我如何使用将命令的输出作为参数传递给另一个(复杂的)?

How do I use to pass output from command as parameter to another (complex)?

我正在尝试在某种程度上自动化 F5 设备上的证书包更新。 没有一个命令可以检查 SSL 包是否过期并将其与服务器 SSL 配置文件名称相匹配。所以我想用 greps 来做(据我所知=) 有两个命令:

  1. tmsh -c "cd /;list sys file ssl-cert recursive is-bundle expiration-string" | grep true -B 2 | grep "2018 GMT\|2019 GMT\|2020 GMT\|2021 GMT\|2022 GTM" -B 1 | grep ssl-cert | awk -F[\ \{] '{print }'

这将给出过期包名称的输出,每行一个,如下所示

Common/somebundle.crt
Common/someotherbundlename.crt
Common/whoknowswhatthisbundleisfor.crt
  1. tmsh -c 'cd /;list ltm profile server-ssl recursive ca-file chain'

此命令将获取所有 server-ssl 配置文件名称及其指向 certs/bundles 等的链接的列表。我是他们使用 | grep Common/somebundle.crt -B 1 仅向我提供有关命令的特定输出的信息1 个输出。所以命令 2 变为: tmsh -c 'cd /;list ltm profile server-ssl recursive ca-file chain' | grep Common/somebundle.crt -B 1 然后我必须手动重复命令 1 输出中找到的每个包。

我正在尝试以某种方式使用命令 1,然后将 xargs(或任何我能用的)运行 命令 2,将 1 的输出传递到 2

中的 grep

不一定是单行本,我只是不够bash写个脚本

我创造了一些有用的东西,虽然看起来不是很干净 =)

for i in $(tmsh -c "cd /;list sys file ssl-cert recursive is-bundle expiration-string" | grep true -B 2 | grep "2018 GMT\|2019 GMT\|2020 GMT\|2021 GMT\|2022 GTM" -B 1 | grep ssl-cert | awk -F[\ \{] '{print }'); do echo -n "$i -> "; tmsh -c "cd /;list ltm profile server-ssl recursive" | grep -B20 $i  >> /dev/null || echo "Not Found" && tmsh -c "cd /;list ltm profile server-ssl recursive" | grep -B20 $i |grep -i "ltm profile" | tail -n1 | awk -F "{" '{print }' ; done

bash while 循环和 read 函数应该是可能的。您可以将您的第一个命令传送到 while 循环中,读取 line-by-line 您的输出:

tmsh -c "cd /;list sys file ssl-cert recursive is-bundle expiration-string" | grep true -B 2 | grep "2018 GMT\|2019 GMT\|2020 GMT\|2021 GMT\|2022 GTM" -B 1 | grep ssl-cert | awk -F[\ \{] '{print }' | while read bundle;do tmsh -c 'cd /;list ltm profile server-ssl recursive ca-file chain' | grep "$bundle" -B 1 |...do whatever else is needed ;done

也可以拆分成普通的多行脚本:

tmsh -c "cd /;list sys file ssl-cert recursive is-bundle expiration-string" | grep true -B 2 | grep "2018 GMT\|2019 GMT\|2020 GMT\|2021 GMT\|2022 GTM" -B 1 | grep ssl-cert | awk -F[\ \{] '{print }' | while read bundle
do 
echo "===== $bundle ===="
tmsh -c 'cd /;list ltm profile server-ssl recursive ca-file chain' | grep "$bundle" -B 1 |...do whatever else is needed 

done