2009-02-19 22 views
31

Tôi đang cố gắng tìm một cách tốt để nối đuôi tệp trên máy chủ từ xa. Đây là một mạng nội bộ của các máy Linux. Các yêu cầu là:Làm thế nào tôi có thể đuôi một tập tin từ xa?

  1. Phải cư xử tốt (không có quá trình thêm đặt xung quanh, hoặc đầu ra liên tục)

  2. Không thể đòi hỏi mô-đun pet Perl của một ai đó.

  3. Có thể được gọi thông qua Perl.

  4. Nếu có thể, không đòi hỏi một kịch bản được xây dựng tùy chỉnh hoặc tiện ích trên máy từ xa (tiện ích Linux thường xuyên được sử dụng tốt)

Các giải pháp tôi đã cố gắng nói chung thuộc loại này

ssh remotemachine -f <some command> 

"một số lệnh" đã được:

tail -f logfile 

đuôi Basic doesn' t làm việc vì quá trình từ xa tiếp tục ghi đầu ra cho thiết bị đầu cuối sau khi quá trình ssh cục bộ chết.

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

Điều này hoạt động tốt hơn vì không có đầu ra màn hình sau khi thoát khỏi quá trình cục bộ nhưng quá trình từ xa không phát hiện ra ổ cắm của thiết bị đang hoạt động và vô thời hạn.

+0

Ví dụ mã bạn đăng hoàn toàn không có ý nghĩa gì cả. Bạn có thể đăng sự thật không? –

+0

Bạn có ý gì khi "quá trình từ xa tiếp tục phun ra"? Khi một trong hai bên của kết nối ssh chết, người kia cũng sẽ chết ... * bối rối * –

+0

Vâng - Tôi đã nhìn thấy các phiên ssh chết, và bất cứ điều gì cũng chạy qua chúng croak quá, trừ khi họ đang chạy trong phiên màn hình tách ra hoặc một cái gì đó – warren

Trả lời

51

Các bạn đã thử

ssh -t remotemachine <some command> 

tùy chọn -t từ trang ssh người đàn ông:

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

thay vì

-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

Thậm chí tốt hơn những gì tôi đã tìm thấy. Cảm ơn bạn. – Frosty

+0

đơn giản và hiệu quả, +1. –

+0

Vì vậy, nhiều chiến thắng! Tôi đã tìm kiếm ở khắp mọi nơi cho một giải pháp. -t rất thanh lịch và hoạt động với những thứ như hàng đầu! Cảm ơn :) –

0

File::Tail. Không biết nếu nó giúp?

+0

Điều đó không tự thực hiện các tệp từ xa –

2

Một số ý tưởng:

  • Bạn có thể gắn nó trên NFS hoặc CIFS, và sau đó sử dụng File::Tail.
  • Bạn có thể sử dụng một trong các mô-đun SSH của Perl (có một số mô-đun), kết hợp với tail -f.
0

rsync: // [USER @] HOST [: PORT]/SRC ... [DEST] | đuôi [DEST]?

+0

Số lượng và kích thước của tệp nhật ký giúp rsync-ing chúng vào máy cục bộ không thực tế. – Frosty

+0

rsync có thể khá hiệu quả vì nó chỉ chuyển giao vùng đồng bằng. Ngoài ra, vì nó có thể nén dữ liệu, và các tệp nhật ký thường khá nén, nó có thể hoạt động khá tốt. Có, rsync mất một thời gian nếu bạn có hàng triệu tệp, nhưng đối với hàng nghìn tệp lớn, nó hoạt động khá tốt. – brianegge

1

netcat nên làm điều đó cho bạn.

+0

Tôi đã có một giải pháp dựa trên netcat nơi chia rẽ và chạy netcat trên máy từ xa và exec'ed một người nghe nc trên máy địa phương mà làm việc tuyệt vời, nhưng giải pháp ssh -t của Manni thậm chí còn tốt hơn. – Frosty

0

Có người đề nghị sử dụng nc (netcat). Giải pháp này không hoạt động nhưng ít lý tưởng hơn là chỉ sử dụng ssh -t. Vấn đề lớn nhất là bạn phải sử dụng nc trên cả hai mặt của kết nối và cần thực hiện một số khám phá cổng trên máy cục bộ để tìm một cổng phù hợp để kết nối. Dưới đây là sự thích ứng của mã ở trên để sử dụng netcat:

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

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

Bạn chỉ có thể thử Survlog Chỉ OS X của nó.

1

Bạn có thể Đuôi tệp từ xa bằng bash và rsync. Tập lệnh sau được lấy từ hướng dẫn này: 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

Các bạn đồng đội của tôi là vua của bash và chúng tôi giải quyết vấn đề đó bằng cách sử dụng tập lệnh bash và rsync. nó đang làm việc trong sản phẩm như một giấc mơ. – user1381775

Các vấn đề liên quan