リモートホスト上のファイルをテールする良い方法を見つけようとしています。これは、Linuxマシンの内部ネットワーク上にあります。要件は次のとおりです。
正常に動作する必要があります(余分なプロセスを配置したり、出力を継続したりする必要はありません)
誰かのペットのPerlモジュールを要求することはできません。
Perlを介して呼び出すことができます。
可能であれば、リモートマシンにカスタムビルドのスクリプトやユーティリティは必要ありません(通常の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 $_;
}
ローカルプロセスが終了した後は画面に出力がないため、これはより適切に機能しますが、リモートプロセスはソケットがダウンしていることを認識せず、無期限に存続します。
やってみました
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.
あなたは試すことができます Survlog そのOSXだけです。
いくつかのアイデア:
tail -f
と組み合わせて使用できます。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
netcatはあなたのためにそれをするべきです。
誰かが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");
File :: Tail があります。それが役立つかどうかわかりませんか?
rsync:// [USER @] Host [:PORT]/SRC ... [DEST] |しっぽ[DEST]?