我们目前正在 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 连接将所有日志条目发送到日志服务器,并使用标头来识别它们是哪个日志。来自。我认为您只需要在日志服务器上将它们分成两个文件即可。