2009-02-19 3 views
31

Я пытаюсь найти хороший способ хвостать файл на удаленном хосте. Это во внутренней сети машин Linux. Требования:Как я могу забрать удаленный файл?

  1. Должен быть хорошо себя (без дополнительного процесса прокладки вокруг, или продолжения вывода)

  2. не может требовать от кого-то модуля животного Perl.

  3. Может быть вызван через Perl.

  4. Если возможно, не требуют пользовательского встроенного скрипта или программы на удаленном компьютере (обычные Linux утилиты отлично)

Решения я пытался, как правило, такого рода

ssh remotemachine -f <some command> 

"некоторые команды" были:

tail -f logfile 

Базовый хвост Безразлично» t, потому что удаленный процесс продолжает записывать вывод на терминал после того, как локальный процесс 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 $_; 
} 

Это работает лучше, потому что нет никакого вывода на экран после того, как местные выходы процесса, но удаленный процесс не понять, что его гнездо вниз, и он живет на неопределенный срок.

+0

Приведенный выше код не имеет абсолютно никакого смысла. Можете ли вы опубликовать реальную вещь? –

+0

Что вы подразумеваете под «удаленным процессом продолжает извергать»? Когда обе стороны ssh-соединения умирают, другая тоже должна умереть ... * puzzled * –

+0

Да, я видел, что сеансы ssh умирают, и все, что бежало через них, тоже хрипит, если они не работают в сеансах отдельного экрана или что-то – warren

ответ

51

Вы пробовали

ssh -t remotemachine <some command> 

опция -t со страницы 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. 

вместо

-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

Даже лучше, чем я уже нашел. Спасибо. – Frosty

+0

простой и эффективный, +1. –

+0

Так много победить! Я искал везде решение. -t настолько изящна и работает с такими вещами, как верх! Спасибо :) –

0

File::Tail. Не знаю, помогает ли это?

+0

Это не делает удаленные файлы сами по себе –

2

Некоторые идеи:

  • Вы можете установить его через NFS или CIFS, а затем использовать File::Tail.
  • Вы можете использовать один из модулей SSH Perl (их число), в сочетании с tail -f.
0

rsync: // [USER @] HOST [: PORT]/SRC ... [DEST] | хвост [DEST]?

+0

Число и размер файлов журнала делают невозможным их использование на локальной машине. – Frosty

+0

rsync может быть довольно эффективным, поскольку он передает только дельта. Кроме того, поскольку он может сжимать данные, а файлы журналов обычно сжимаются, это может работать довольно хорошо. Да, rsync занимает некоторое время, если у вас есть миллионы файлов, но для тысяч больших файлов он работает достаточно хорошо. – brianegge

1

netcat должен сделать это за вас.

+0

У меня было решение на основе netcat, где разветвлено и бежало netcat на удаленной машине, и исполнил nc-прослушиватель на локальном компьютере, который отлично работал, но решение ssh -t от Manni еще лучше. – Frosty

0

Кто-то предложил использовать 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"); 
2

Вы можете попробовать Survlog Сво OS X только, хотя.

1

Вы можете удаленно обрабатывать файлы с помощью bash и rsync. Следующий сценарий взят из этого учебника: 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

Ребята, мой помощник по команде является королем bash, и мы решили эту проблему с помощью сценария bash и rsync. он работает в prod как сон. – user1381775

Смежные вопросы