我需要在远程计算机上执行一些命令,并且我在本地计算机上编写了这样的脚本。
基本上我在我的本地计算机上获得docker images
并想要检查这些图像是否存在于远程服务器中。
我需要将不存在的docker镜像(远程服务器)连接到本地计算机。为此,我使用了下面提到的代码,但它对我不起作用。
#!/bin/sh
declare array=$(docker images)
sshpass -p 'password' ssh -t username@1.2.3.4 << EOF
declare List=""
while read -r line; do
if [ -z $(docker images -q $line) ]; then
List="$List $line"
else
continue
fi
done <<< "$array"
EOF
我希望List变量在我的本地机器中。
有人可以帮我解决这个问题吗? 非常感谢您的帮助 最诚挚的问候。
答案 0 :(得分:0)
远程shell退出后,您在远程shell中执行的任何操作都不会出现在本地shell中。你可以做的是拥有远程shell打印输出并捕获它。
顺便说一句,你不能在/bin/sh
脚本中使用数组,但我们实际上并不需要数组。
#!/bin/sh
docker images |
sshpass -p 'password' ssh -t username@1.2.3.4 '
while read -r line; do
# Suction: docker images -q image should return nonzero exit status
# if the named image is missing. We work around that by grepping
# for whether there is any output at all.
docker images -q "$line" | grep -q . || echo "$line"
done'
这只是打印出结果;将其捕获到变量中或将其重定向到文件以便使用它做更多事情,或者只是将其传输到另一个本地while read -r
循环中。
如果你重构这个,那么身份验证详细信息是参数化的,您可以针对多个主机运行它。您可以将其保存为可执行脚本,以便可以从任何其他工具中调用它,或者如果您只是在有限的上下文中需要它,则可以将其作为函数调用。
missing () {
docker images -q |
"$@" 'while read -r line; do
docker images -q "$line" | grep -q . || echo "$line"
done'
}
现在您可以为一个或多个主机调用它:
missing sshpass -p 'password' ssh -t username@1.2.3.4 |
xargs -r -n 1 docker pull
答案 1 :(得分:0)
根据您的要求,您还可以远程使用docker socket:https://docs.docker.com/engine/reference/commandline/dockerd/#/daemon-socket-option
然而,你可以用这样的方式重写你的脚本,它连接到本地/远程docker引擎:
DOCKER_HOST=unix:///var/run/docker.sock/ docker images ...
DOCKER_HOST=tcp://remote.ip:2375 docker images ...
我知道这不是你要求的,但也许它激励了别人。