我想从我的 Jump 服务器运行一个脚本,让它通过 SSH 连接到服务器,然后运行一个命令(例如rm <file>
、top
或ls -lsa
),然后获取该输出并将其放入我的 Jump 服务器上的文件中,然后转到下一个 IP列表。
我希望能够为脚本提供 IP 地址列表,并让它在所有 IP 地址上执行脚本。
到目前为止我已经
ssh <IP> 'find ./<Path> -mtime +15 -exec rm <filename> {} \;' > <filename>
但这所做的只是通过 ssh 连接到盒子,运行命令并列出信息。我需要它来运行命令,将数据输出到我的跳转服务器上的文件,然后转到下一个框。
有什么建议么?
答案1
#! /bin/bash
cd /path/to/ssh_logs || exit 1
for targethost in a b c; do
log_file="${targethost}/$(date --iso-8601=seconds).log"
mkdir -p "${targethost}" || { echo "Error: ${targethost}";exit 1; }
{ ssh batchuser@"${targethost}" "$command"; rc=$?;
echo $'\n'"finished (with exit code ${rc}): $(date --iso-8601=seconds)";
} >"$log_file" 2>&1
done
编辑1:
需要一些解释(我还更改了脚本的详细信息):
- 在一个目录中(
/path/to/ssh_logs
在本例中),为每个目标主机创建一个子目录,输出文件将放置在其中。另一种方法是将所有文件放入同一目录中,并将主机作为文件名的一部分。这更多是一个品味问题(对于合理数量的文件)。因此,第一步是尝试更改到此目录(如果失败则中止)。 for targethost in a b c; do ... ; done
是主机上的循环。在示例中,主机名被硬编码在脚本中。或者,您可以将它们写入文本文件中,每行一个或用空格分隔,然后以这种方式将名称放入脚本中:for targethost in $(<targethosts.txt); do
- 输出文件的路径是该主机的子目录、当前时间戳和“.log”。
- 如果子目录尚不存在,则创建该子目录(如果失败,脚本将打印主机并中止)。
- 两个命令的输出被重定向到文件: ssh 调用本身以及 – 如果您愿意的话 – ssh 完成后立即的时间戳(包括 ssh 的退出代码),以便您可以从日志中看到它花了多长时间。命令的 stdout 重定向到文件后,stderr 也被重定向到 stdout,以便那里的消息也到达文件。