2009-02-19 12 views
31

Estoy tratando de encontrar una buena forma de alinear un archivo en un host remoto. Esto es en una red interna de máquinas Linux. Los requisitos son:¿Cómo puedo alinear un archivo remoto?

  1. Debe estar bien educados (sin proceso adicional por ahí, o una salida continua)

  2. no puede exigir módulo de Perl mascota de alguien.

  3. Se puede invocar a través de Perl.

  4. Si es posible, no requiere una escritura hecha a la medida o la utilidad de la máquina remota (utilidades de Linux regulares están bien)

Las soluciones que he probado son generalmente de este tipo

ssh remotemachine -f <some command> 

"algún comando" ha sido:

tail -f logfile 

cola básico doesn' t funciona porque el proceso remoto continúa escribiendo salida en el terminal después de que el proceso ssh local muere.

$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 $_; 
} 

Esto funciona mejor porque no hay una salida a la pantalla después de salir del proceso local pero el proceso a distancia no darse cuenta de que su órbita es hacia abajo y vive de forma indefinida.

+0

El ejemplo de código que publicó no tiene absolutamente ningún sentido. ¿Puedes publicar lo real? –

+0

¿Qué quiere decir con "el proceso remoto sigue arrojando"? Cuando uno de los lados de la conexión ssh muere, el otro también debe morir ... * desconcertado * –

+0

Sí, he visto morir sesiones de ssh, y lo que estaba corriendo por ellas también croa, a menos que estuvieran ejecutándose en sesiones de pantalla separadas o algo – warren

Respuesta

51

Ha intentado

ssh -t remotemachine <some command> 

opción -t de la página 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. 

en lugar de

-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. 
+0

Incluso mejor de lo que ya encontré. Gracias. – Frosty

+0

simple y eficiente, +1. –

+0

¡Tanto gana! He estado buscando una solución en todas partes. -t es tan elegante, y funciona con cosas como superior también! Gracias :) –

0

Hay File::Tail. No sé si ayuda?

+0

Eso no hace los archivos remotos por sí mismo –

2

Algunas ideas:

  • usted podría montarlo sobre NFS o CIFS, y luego usar File::Tail.
  • Puede usar uno de los módulos SSH de Perl (hay algunos de ellos), combinados con tail -f.
0

rsync: // [USER @] HOST [: PORT]/SRC ... [DEST] | cola [DEST]?

+0

El número y el tamaño de los archivos de registro hace que rsync-ing a la máquina local no sea práctico. – Frosty

+0

rsync puede ser bastante eficiente ya que solo transfiere los deltas. Además, dado que puede comprimir los datos, y los archivos de registro generalmente son bastante compresibles, podría funcionar bastante bien. Sí, rsync tarda un tiempo si tienes millones de archivos, pero para miles de archivos grandes funciona bastante bien. – brianegge

1

netcat debe hacerlo por usted.

+0

Tenía una solución basada en netcat donde bifurcaba y ejecutaba netcat en la máquina remota y ejecuté un oyente nc en la máquina local que funcionó de maravilla, pero la solución ssh -t de Manni es aún mejor. – Frosty

0

Alguien sugirió utilizar nc (netcat). Esta solución funciona, pero es menos ideal que simplemente usar ssh -t. El mayor problema es que debe usar nc en ambos lados de la conexión y necesita hacer algún descubrimiento de puerto en la máquina local para encontrar un puerto adecuado sobre el que conectarse. Aquí está la adaptación del código anterior para usar netcat:

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

exec("nc -l -p $port"); 
2

podría intentar Survlog Su OS X sin embargo.

1

Puede rastrear archivos de forma remota utilizando bash y rsync. La siguiente secuencia de comandos está tomada de este tutorial: 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 [email protected]$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 
+0

Chicos mi compañero de equipo es el rey de bash y resolvimos ese problema usando bash script y rsync. está trabajando en prod como un sueño. – user1381775

Cuestiones relacionadas