【问题标题】:How can I tail a remote file?如何跟踪远程文件?
【发布时间】:2010-10-08 15:26:09
【问题描述】:

我正在尝试找到一种在远程主机上跟踪文件的好方法。这是在 Linux 机器的内部网络上。要求是:

  1. 必须表现良好(没有额外的进程放置,或继续输出)

  2. 不能要求某人的宠物 Perl 模块。

  3. 可以通过 Perl 调用。

  4. 如果可能,不需要在远程机器上自定义构建脚本或实用程序(常规的 linux 实用程序就可以)

我尝试过的解决方案一般都是这样的

ssh remotemachine -f <some command>

“一些命令”是:

tail -f logfile

Basic tail 不起作用,因为在本地 ssh 进程死亡后远程进程继续向终端写入输出。

$socket = IO:Socket::INET->new(...);
$pid = fork();
if(!$pid)
{
  exec("ssh $host -f '<script which connects to socket and writes>'");
  exit;
}

$client = $socket->accept;
while(<$client>)
{
  print $_;
}

这效果更好,因为在本地进程退出后没有输出到屏幕,但远程进程没有发现它的套接字已关闭并且它无限期地存在。

【问题讨论】:

  • 您发布的代码示例完全没有意义。能发一下实物吗?
  • “远程进程继续喷”是什么意思?当 ssh 连接的任何一方死亡时,另一方也应该死亡...... 困惑
  • 是的 - 我已经看到 ssh 会话死了,并且通过它们运行的​​任何东西也会发出嘶嘶声,除非它们在分离的屏幕会话或其他东西中运行
  • @Aaron:从 shell 尝试:ssh host -f "tail -f " 然后按 Ctrl-C。在我的 RedHat 机器上,我继续在终端中获取文件的尾部,远程 SSH+tail 仍然非常活跃。使用 -t 而不是 -f 可以解决此问题。

标签: perl scripting ssh tail netcat


【解决方案1】:

你试过了吗

ssh -t remotemachine <some command>

-t 来自 ssh 手册页的选项:

 -t      Force pseudo-tty allocation. This can be used to execute 
         arbitrary screen-based programs on a remote machine, which
         can be very useful, e.g. when implementing menu services.
         Multiple -t options force tty allocation, even if ssh has no local tty.

而不是

 -f      Requests ssh to go to background just before command execution.  
         This is useful if ssh is going to ask for passwords or passphrases, 
         but the user wants it in the background.
         This implies -n.  The recommended way to start X11 programs at a remote
         site is with something like ssh -f host xterm.

【讨论】:

  • 赢了这么多!我一直在到处寻找解决方案。 -t 非常优雅,也适用于 top 之类的东西!谢谢:)
  • 来自 ssh 手册页。 "-t 强制分配伪 tty。这可用于在远程机器上执行任意基于屏幕的程序"
【解决方案2】:

一些想法:

  • 您可以将它挂载在 NFS 或 CIFS 上,然后使用 File::Tail
  • 您可以使用 Perl 的 SSH 模块之一(有很多),与 tail -f 结合使用。

【讨论】:

    【解决方案3】:

    不过你可以试试Survlog 它的 OS X。

    【讨论】:

    • 我刚试了一下,好像根本没用;自 2015 年以来未维护。浪费了 3 美元。
    • 嗨@stephan.com。我制作了应用程序survlog。更新即将推出,您无需再花钱。
    【解决方案4】:

    netcat 应该为你做这件事。

    【讨论】:

    • 我有一个基于 netcat 的解决方案,在远程机器上分叉并运行 netcat,并在本地机器上执行一个 nc 监听器,效果很好,但 Manni 的 ssh -t 解决方案更好。
    【解决方案5】:

    您可以使用 bash 和 rsync 远程跟踪文件。以下脚本来自本教程:Tail files remotely using bash and rsync

    #!/bin/bash
    #Code Snippet from and copyright by sshadmincontrol.com
    #You may use this code freely as long as you keep this notice.
    
    PIDHOME=/a_place/to/store/flag/file
    FILE=`echo ${0} | sed 's:.*/::'`
    RUNFILEFLAG=${PIDHOME}/${FILE}.running
    
    if [ -e $RUNFILEFLAG ]; then
       echo "Already running ${RUNFILEFLAG}"
       exit 1
    else
       touch ${RUNFILEFLAG}
    fi
    
    hostname=$1 #host name to remotlely access
    log_dir=$2  #log directory on the remotehost
    log_file=$3 #remote log file name
    username=$3 #username to use to access remote host
    log_base=$4 #where to save the log locally
    
    ORIGLOG="$log_base/$hostname/${log_file}.orig"
    INTERLOG="$log_base/$hostname/${log_file}.inter"
    FINALLOG="$log_base/$hostname/${log_file}.log"
    
    rsync -q -e ssh $username@$hostname:$log_dir/$log_file ${ORIGLOG}
    grep -Ev ".ico|.jpg|.gif|.png|.css" > ${INTERLOG}  
    
    if [ ! -e $FINALLOG ]; then
       cp  ${INTERLOG} ${FINALLOG}
    else
       LINE=`tail -1 ${FINALLOG}`
       grep -F "$LINE" -A 999999999 ${INTERLOG} \
          | grep -Fv "$LINE" >> ${FINALLOG}
    fi
    
    rm ${RUNFILEFLAG}
    exit 0
    

    【讨论】:

    • 伙计们,我的队友是 bash 之王,我们通过使用 bash 脚本和 rsync 解决了这个问题。它正在像梦一样工作。
    【解决方案6】:

    rsync://[USER@]HOST[:PORT]/SRC... [DEST] |尾巴 [目的地] ?

    【讨论】:

    • 日志文件的数量和大小使得将它们同步到本地机器是不切实际的。
    • rsync 可以非常有效,因为它只传输增量。此外,由于它可以压缩数据,而且日志文件通常是可压缩的,所以它可能工作得很好。是的,如果您有数百万个文件,rsync 确实需要一段时间,但对于数千个大文件,它工作得很好。
    【解决方案7】:

    有人建议使用 nc (netcat)。此解决方案确实有效,但不如仅使用 ssh -t 理想。最大的问题是你必须在连接的两边都使用 nc 并且需要在本地机器上做一些端口发现来找到一个合适的端口来连接。下面是对上面代码使用netcat的适配:

    $pid = fork();
    if(!$pid)
    {
      exec("ssh $host -f 'tail -f $filename |nc $localhost $port'");
      exit;
    }
    
    exec("nc -l -p $port");
    

    【讨论】:

      【解决方案8】:

      File::Tail。不知道有没有帮助?

      【讨论】:

      • 它自己不做远程文件
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 2023-03-05
      • 2012-09-14
      • 2022-10-05
      • 1970-01-01
      • 2019-08-14
      • 2020-12-05
      相关资源
      最近更新 更多