我在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
在第二个字段上以数字方式排序,最大的第一个,与第三个字段以数字方式组合,也是最大的第一个。