SSH 到一个盒子,运行命令,将数据输出到文件,然后移动到下一个 IP 地址

SSH 到一个盒子,运行命令,将数据输出到文件,然后移动到下一个 IP 地址

我想从我的 Jump 服务器运行一个脚本,让它通过 SSH 连接到服务器,然后运行一个命令(例如rm <file>topls -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:

需要一些解释(我还更改了脚本的详细信息):

  1. 在一个目录中(/path/to/ssh_logs在本例中),为每个目标主机创建一个子目录,输出文件将放置在其中。另一种方法是将所有文件放入同一目录中,并将主机作为文件名的一部分。这更多是一个品味问题(对于合理数量的文件)。因此,第一步是尝试更改到此目录(如果失败则中止)。
  2. for targethost in a b c; do ... ; done是主机上的循环。在示例中,主机名被硬编码在脚本中。或者,您可以将它们写入文本文件中,每行一个或用空格分隔,然后以这种方式将名称放入脚本中:for targethost in $(<targethosts.txt); do
  3. 输出文件的路径是该主机的子目录、当前时间戳和“.log”。
  4. 如果子目录尚不存在,则创建该子目录(如果失败,脚本将打印主机并中止)。
  5. 两个命令的输出被重定向到文件: ssh 调用本身以及 – 如果您愿意的话 – ssh 完成后立即的时间戳(包括 ssh 的退出代码),以便您可以从日志中看到它花了多长时间。命令的 stdout 重定向到文件后,stderr 也被重定向到 stdout,以便那里的消息也到达文件。

相关内容