2009-02-19 16 views
31

Sto cercando di trovare un buon modo per accodare un file su un host remoto. Questo è su una rete interna di macchine Linux. I requisiti sono:Come posso codificare un file remoto?

  1. Deve essere ben educati (senza processo in più, che in giro, o uscita continua)

  2. non può richiedere il modulo Perl animale domestico di qualcuno.

  3. Può essere richiamato tramite Perl.

  4. Se possibile, non richiede uno script su misura o l'utilità sul computer remoto (regolari utility Linux vanno bene)

Le soluzioni che ho provato sono generalmente di questo tipo

ssh remotemachine -f <some command> 

"un po 'di comando" è stata:

tail -f logfile 

coda di base doesn' t lavorare perché il processo remoto continua a scrivere output sul terminale dopo la morte del processo ssh locale.

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

Questo funziona meglio perché non v'è alcuna uscita allo schermo dopo il processo termina locali ma il processo remoto non capire che la sua presa è giù e vive all'infinito.

+0

L'esempio di codice che hai postato non ha assolutamente senso. Puoi pubblicare la cosa reale? –

+0

Cosa intendi con "il processo remoto continua a vomitare"? Quando entrambi i lati della connessione ssh muoiono, anche l'altro dovrebbe morire ... * perplesso * –

+0

Sì - ho visto le sessioni ssh morire, e qualsiasi cosa stesse scorrendo attraverso di loro gracchiava, a meno che non stessero correndo in sessioni di schermate separate o qualcosa – warren

risposta

51

Hai provato

ssh -t remotemachine <some command> 

opzione -t dalla pagina ssh man:

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

invece di

-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

Ancora meglio di quello che ho trovato già. Grazie. – Frosty

+0

semplice ed efficiente, +1. –

+0

Così tanto successo! Ho cercato ovunque una soluzione. -t è così elegante e funziona anche con cose del genere! Grazie :) –

0

C'è File::Tail. Non so se aiuta?

+0

Questo non fa da solo i file remoti –

2

Alcune idee:

  • Si potrebbe montare su NFS o CIFS, e quindi utilizzare File::Tail.
  • È possibile utilizzare uno dei moduli SSH di Perl (ce ne sono alcuni), combinato con tail -f.
0

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

+0

Il numero e la dimensione dei file di registro non li rende inattuabili. – Frosty

+0

rsync può essere abbastanza efficiente poiché trasferisce solo i delta. Inoltre, poiché è in grado di comprimere i dati e di solito i file di registro sono abbastanza comprimibili, potrebbe funzionare abbastanza bene. Sì, rsync richiede un po 'di tempo se hai milioni di file, ma per migliaia di file di grandi dimensioni funziona abbastanza bene. – brianegge

1

netcat dovrebbe farlo per voi.

+0

Avevo una soluzione basata su netcat dove forked ed eseguivo netcat sulla macchina remota ed eseguivo un listener nc sulla macchina locale che funzionava benissimo ma la soluzione ssh -t di Manni è ancora migliore. – Frosty

0

Qualcuno ha suggerito di utilizzare nc (netcat). Questa soluzione funziona ma è meno ideale rispetto all'uso di ssh -t. Il problema più grande è che devi usare nc su entrambi i lati della connessione e devi fare qualche scoperta della porta sul computer locale per trovare una porta adatta su cui connetterti. Ecco l'adattamento del codice di cui sopra da usare netcat:

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

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

Si potrebbe provare Survlog suo OS X solo però.

1

È possibile codificare i file in remoto utilizzando bash e rsync. Il seguente script è tratto da questo 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

Ragazzi il mio compagno di squadra è il re di bash e abbiamo risolto il problema usando lo script bash e rsync. sta lavorando in prod come un sogno. – user1381775

Problemi correlati