Jak Mogę śledzić zdalny plik?

Próbuję znaleźć dobry sposób na śledzenie pliku na zdalnym hoście. To jest w wewnętrznej sieci maszyn Linuksa. Wymagania są następujące:

  1. Musi być dobrze wychowany (bez dodatkowego procesu leżącego wokół, lub ciągłego wyjścia)

  2. Nie można wymagać czyjegoś modułu pet Perl.

  3. Można wywoływać przez Perl.

  4. Jeśli to możliwe, nie wymaga niestandardowego skryptu lub narzędzia na zdalnym komputerze (zwykły linux narzędzia są w porządku)

Rozwiązania, które wypróbowałem, są zazwyczaj tego rodzaju

ssh remotemachine -f <some command>

"some command" has been:

tail -f logfile

Basic tail nie działa, ponieważ zdalny proces kontynuuje zapisywanie danych wyjściowych do terminala po śmierci lokalnego procesu 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 $_;
}

To działa lepiej, ponieważ nie ma wyjścia na ekran po wyjściu lokalnego procesu, ale zdalny proces nie zorientuje się, że jego gniazdo jest wyłączone i żyje w nieskończoność.

Author: Frosty, 2009-02-19

8 answers

Czy próbowałeś

ssh -t remotemachine <some command>

- opcja t ze strony man 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.

Zamiast

 -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.
 69
Author: innaM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-20 17:59:25

Kilka pomysłów:

  • możesz zamontować go przez NFS lub CIFS, a następnie użyć File::Tail .
  • Możesz użyć jednego z modułów SSH Perla (jest ich kilka), w połączeniu z tail -f.
 2
Author: Leon Timmermans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 16:38:33

Możesz spróbować Survlog tylko z OS X.

 2
Author: Kyle Browning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-31 21:31:51

Netcat powinien to zrobić za Ciebie.

 1
Author: Ranjeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 17:01:37

Możesz śledzić pliki zdalnie za pomocą bash i rsync. Poniższy skrypt pochodzi z tego samouczka: Pliki ogonowe zdalnie za pomocą bash i 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
Author: user1381775,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-31 21:29:49

Rsync:/ / [USER@]HOST[:PORT] / SRC... [Dest] / tail [dest]?

 0
Author: rupert0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 16:57:34

Ktoś zasugerował użycie nc (netcat). To rozwiązanie działa, ale jest mniej idealne niż tylko użycie ssh-T. największym problemem jest to, że musisz użyć nc po obu stronach połączenia i musisz wykonać pewne wykrywanie portów na lokalnej maszynie, aby znaleźć odpowiedni port, przez który chcesz się połączyć. Oto adaptacja powyższego kodu do użycia netcata:

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

exec("nc -l -p $port");
 0
Author: Frosty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 17:30:03

Jest File:: Tail . Nie wiesz, czy to pomaga?

 -1
Author: dsm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 16:33:48