web-dev-qa-db-ja.com

リモートファイルをテール化するにはどうすればよいですか?

リモートホスト上のファイルをテールする良い方法を見つけようとしています。これは、Linuxマシンの内部ネットワーク上にあります。要件は次のとおりです。

  1. 正常に動作する必要があります(余分なプロセスを配置したり、出力を継続したりする必要はありません)

  2. 誰かのペットのPerlモジュールを要求することはできません。

  3. Perlを介して呼び出すことができます。

  4. 可能であれば、リモートマシンにカスタムビルドのスクリプトやユーティリティは必要ありません(通常のLinuxユーティリティで問題ありません)

私が試した解決策は一般的にこの種のものです

ssh remotemachine -f <some command>

「いくつかのコマンド」は次のとおりです。

tail -f logfile

ローカルの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 $_;
}

ローカルプロセスが終了した後は画面に出力がないため、これはより適切に機能しますが、リモートプロセスはソケットがダウンしていることを認識せず、無期限に存続します。

37
Frosty

やってみました

ssh -t remotemachine <some command>

-sshのmanページからのtオプション:

 -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.
65
innaM

あなたは試すことができます Survlog そのOSXだけです。

2
Kyle Browning

いくつかのアイデア:

  • NFSまたはCIFSを介してマウントしてから、 File :: Tail を使用できます。
  • PerlのSSHモジュールの1つ(それらは多数あります)をtail -fと組み合わせて使用​​できます。
2
Leon Timmermans

Bashとrsyncを使用してファイルをリモートでテールすることができます。次のスクリプトは、このチュートリアルから抜粋したものです。 bashと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
1
user1381775

netcatはあなたのためにそれをするべきです。

1
Ranjeet

誰かが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");
0
Frosty

File :: Tail があります。それが役立つかどうかわかりませんか?

0
dsm

rsync:// [USER @] Host [:PORT]/SRC ... [DEST] |しっぽ[DEST]?

0
rupert0