如何在远程服务器上执行多个命令并获得输出?

时间:2017-02-07 09:21:34

标签: shell unix docker

我需要在远程计算机上执行一些命令,并且我在本地计算机上编写了这样的脚本。

基本上我在我的本地计算机上获得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变量在我的本地机器中。

有人可以帮我解决这个问题吗? 非常感谢您的帮助 最诚挚的问候。

2 个答案:

答案 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 ...

我知道这不是你要求的,但也许它激励了别人。