perl - traductor - tradusir en ingles
¿Cómo puedo alinear un archivo remoto? (8)
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:
Debe comportarse bien (sin proceso adicional, o producción continua)
No se puede requerir el módulo de Perl de una mascota.
Se puede invocar a través de Perl.
Si es posible, no requiere una secuencia de comandos o utilidad personalizada en la máquina remota (las utilidades normales de Linux 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
La cola básica no 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 salida a la pantalla después de que sale el proceso local, pero el proceso remoto no se da cuenta de que su socket está inactivo y permanece indefinidamente.
Alguien sugirió usar 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");
Algunas ideas:
- Puede montarlo sobre NFS o CIFS, y luego usar File::Tail .
- Puede usar uno de los módulos SSH de Perl (hay varios de ellos), combinados con
tail -f
.
Has probado
ssh -t remotemachine <some command>
-t opción de la página man de 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.
Hay File::Tail . No sé si ayuda?
Puede rastrear archivos de forma remota utilizando bash y rsync. La siguiente secuencia de comandos se toma de este tutorial: Tail files de forma remota con bash y 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
Sin embargo, puedes probar Survlog Its OS X.
netcat debería hacerlo por usted.
rsync: // [USER @] HOST [: PORT] / SRC ... [DEST] | cola [DEST]?