Bash - 通过 SSH 连接到远程服务器并检索数据



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

在远程服务器上,我需要为某些软件提供一个包含多个 env 参数的 shell 脚本。然后在文件路径中使用这些参数之一来指向可执行文件,该可执行文件包含一个函数" -lprojects",可以列出该服务器上软件的项目。

我已经验证了在服务器本身上运行命令可以多次工作。我的问题是当我尝试通过 SSH 运行相同的命令时。如果我使用将 env 变量用于文件路径的方法,则表明该变量在文件路径中为 null,从而给出找不到文件/目录的错误。如果我对文件路径进行硬编码以指向可执行文件,它会给我一个错误,说 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 以提取所需的文本(这有效(,但随后我需要将其写回客户端(本地服务器(值.csv文件。这更通用,因为我必须为多个服务器执行此操作,但所有服务器都必须写入同一个.csv文件。为简单起见,您可以将其视为一个远程服务器案例,因为至关重要的是,我现在至少要让它在开始时为一个服务器工作。

请注意,我还尝试了类似的东西:

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

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

我该如何正确地执行此操作?

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

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

假设executable每行输出一个文件名,则可以使用readarray来实现以下效果:

readarray -t filelist < <(ssh remote.server '
source /filepath/remotescript.sh
$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

最新更新