bash - 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
但结果相似。还将单引号放在远程变量之前和之后的文件列表中,等等。
我该如何正确地做到这一点?
解决方案
要访问环境变量,您必须在与使用它的地方相同的 SSH 调用中获取定义环境的脚本,否则,您将在两个不相关的不同 shell 中运行命令:
filelist=$(ssh remote.server 'source /filepath/remotescript.sh; $REMOTEVARIABLE/bin/executable -lprojects')
推荐阅读
- linux - 在 Fedora 上安装 PyPi“sshtunnel”包时出错
- bash - Windows bash shell:如何可靠地识别正在运行的风格
- python - 如何在 Python3 中打印奇数个符号
- java - 如何更快地在 Java 中进行多线程处理?
- json - 将基于文本的键/值对转换为 JSON 格式
- flutter - Flutter - 从列表中返回属性设置为 true 的项目
- highcharts - 我们如何在单个高图中绘制带有堆积柱形图的柱形图?
- java - 发生了一些不寻常的事情导致驱动程序失败。Heroku postgresql 数据库
- python - 检测空列表的嵌套列表时如何返回True?
- swift - 如何从另一个视图控制器更改标签的文本并使用核心数据保存