如何尾部多个文件并将其输出通过管道传输到 SSH 连接

如何尾部多个文件并将其输出通过管道传输到 SSH 连接

我们目前正在 Linux 机器上运行一个我们几乎无法控制的命令。该命令跟踪日志文件,将结果通过管道传输到我们服务器的出站 SSH 连接,将输出重定向到文件。

我们用来执行此操作的命令是:

sh -c tail -f /var/log/x/a.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

然后我们能够对捕获的日志段执行额外的处理。

但是,我们现在需要能够使用以下命令转发附加日志文件的流输出:相同ssh 连接。

正在做

sh -c tail -f /var/log/x/a.log /var/log/x/b.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

有效,但它将两个日志文件合并为一个(每行之前出现一个标题,说明它来自哪个文件)。

我们需要输出两个不同的文件,但仅限于从日志服务器到我们的服务器的单个出站 SSH 连接。我们在日志服务器上没有 sudo 或管理员权限,并且无法获取任何需要安装它的软件。如果重要的话,远程日志服务器正在运行 CentOS,而我们的服务器正在运行 Ubuntu。

有没有办法将输出分成两个文件?或者通过反向 SSH 连接并行运行多个命令的其他方法?

答案1

如果little.control.server安装了 perl,您可以通过parallel --embed在开发计算机上运行来使用 GNU Parallel:

parallel --lb --tag tail -f ::: /var/log/x/a.log /var/log/x/b.log |
       ssh [email protected] -T perl -e \''
        $|=1; # if you need less buffering
        open(A, ">", "a.log");open(B, ">", "b.log");
        while(<>) {
           if(s:/var/log/x/a.log\t::) { print A } 
           if(s:/var/log/x/b.log\t::) { print B }
        }'\'

还要考虑ssh -M在单个 ssh 通道上复用多个 ssh。

答案2

您自己的解决方案:

sh -c tail -f /var/log/x/a.log /var/log/x/b.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

将所有需要的日志信息发送到日志服务器,即您控制下的 (Ubuntu) 服务器。 (将其写入文件一个日志看起来有点令人困惑,因为它实际上是在写一个文件更像a-和-b.log

因此,一种可能的解决方案似乎是:编写一个脚本来读取生成的单个结果a-和-b.log文件及其标题行,并写入两个单独的日志(没有标题行,只是使用它们来确定每个日志行属于哪个文件)。在日志服务器上运行此脚本,您应该已准备就绪。

这是一个可以接受的答案吗?它不会对 SSH 做任何“聪明”的事情,因为似乎不需要这样做——tail 已经查看了两个日志,并通过单个 SSH 连接将所有日志条目发送到日志服务器,并使用标头来识别它们是哪个日志。来自。我认为您只需要在日志服务器上将它们分成两个文件即可。

相关内容