首页 > 解决方案 > Bash - SSH 到远程服务器并检索数据

问题描述

我有一个 bash 脚本,它需要连接到另一台服务器以部分执行。我已经尝试了许多执行 ssh 命令的标准指令和语法,但进展甚微。

在远程服务器上,我需要获取一个 shell 脚本,其中包含一些软件的几个 env 参数。然后在文件路径中使用其中一个参数指向可执行文件,该可执行文件包含一个函数“-lprojects”,该函数可以列出该服务器上软件的项目。

我已经验证在服务器本身上运行命令可以多次运行。我的问题是当我尝试通过 SSH 运行相同的命令时。如果我使用将 env 变量用于文件路径的方法,则表明该变量在文件路径中为空,从而给出未找到文件/目录的错误。如果我硬编码文件路径以指向可执行文件,它会给我一个错误,说 shell 脚本不是来源(我假设它需要其他函数和可执行文件的 api 来显示它的 -lprojects 函数)

下面是代码的样子:

ssh remote.server 'source /filepath/remotescript.sh'
filelist=$(ssh remote.server $REMOTEVARIABLE'/bin/executable -lprojects')

echo ${filelist[@]}

for file in $filelist
do
    echo $file
    ssh SERVER2 awk 'something' /filepath/"$file"/somefile.txt | sed 'something' >> filepath/values.csv;

done

如您所见,然后我还需要遍历 remote.server 中 -lprojects 输出的内容,对文件执行一些 awk 和 sed 以提取想要的文本(这可行),但是我需要编写返回客户端(本地服务器)values.csv 文件。这更通用,因为我必须为多台服务器执行此操作,但所有服务器都必须写入同一个 .csv 文件。为简单起见,您可以将其视为一个远程服务器案例,因为我一开始就让它至少为一个服务器工作是至关重要的。

请注意,我还尝试了类似的方法:

ssh remote.server << EOF
    'source /filepath/remotescript.sh'
    filelist=$(ssh remote.server $REMOTEVARIABLE'/bin/executable -lprojects')
EOF

但结果相似。还将单引号放在远程变量之前和之后的文件列表中,等等。

我该如何正确地做到这一点?

标签: bashssh

解决方案


要访问环境变量,您必须在与使用它的地方相同的 SSH 调用中获取定义环境的脚本,否则,您将在两个不相关的不同 shell 中运行命令:

filelist=$(ssh remote.server 'source /filepath/remotescript.sh; $REMOTEVARIABLE/bin/executable -lprojects')

推荐阅读