如何使用ssh从远程服务器获取命令的结果?



我在Linux bash(版本16.04.4 LTS)工作。我使用ssh连接到远程服务器,在那里我想从文件列表(最新的文件版本)中找到特定的文件,然后只检索版本。例如,考虑远程服务器(server.com)上的这些文件:

file-30.0-2.tar.xz
file-30.0-3.tar.xz
file-30.0-4.tar.xz
file-30.0-5.tar.xz
file-30.0-7.tar.xz
file-30.0-10.tar.xz

如果我直接在远程服务器上登录,如果我尝试下面的命令,它可以工作。

ls file-*.tar.xz | sort -V | tail -n1 | grep -o '[[:digit:]]+.[[:digit:]]+.[[:digit:]]+'

输出:30.0-10

当我从另一个服务器工作时,我使用ssh连接到远程服务器,像这样:

#!/bin/bash
set -euxo pipefail
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey user@server.com "cd /myDir; \
ls file-*.tar.xz | sort -V | tail -n1 | grep -o '[[:digit:]]+.[[:digit:]]+.[[:digit:]]+')"

这个命令正在工作,我得到了与之前相同的输出(30.0-10)。

但是我希望能够将结果(30.0-10)传递到脚本外部并在本地服务器中使用它。

任何想法?

只需将脚本的输出分配给一个变量,然后使用该变量:

result="$(./yourscript)"
echo "Result from SSH = $result"

远程打印以空分隔符分隔的文件列表,按反向主版本和补丁版本排序,因此最新的优先列出

read -r -d '' latest_archive < <(
ssh 
-o UserKnownHostsFile=/dev/null 
-o StrictHostKeyChecking=no 
-o PreferredAuthentications=publickey 
user@server.com 
printf '%s\0' '/my/dir/file-*[[:digit:]].tar.xz' | sort -zt- -k2nr,3nr
)

工作原理:

  • printf '%s\0' '/my/dir/file-*[[:digit:]].tar.xz':打印与模式匹配的文件列表。
  • | sort -zt- -k2nr,3nr:管道排序-z以空分隔的条目,-t-以破折号-作为字段分隔符,-k2nr,3nr在第二个字段上以数字方式排序,最大的第一个,与第三个字段以数字方式组合,也是最大的第一个。

最新更新