2009-02-19 32 views
31

मैं रिमोट होस्ट पर फ़ाइल को पूंछ करने का एक अच्छा तरीका खोजने की कोशिश कर रहा हूं। यह लिनक्स मशीनों के आंतरिक नेटवर्क पर है। आवश्यकताएँ हैं:मैं रिमोट फाइल कैसे बना सकता हूं?

  1. अच्छी तरह व्यवहार किया जाना चाहिए (बिना किसी अतिरिक्त प्रक्रिया के आसपास बिछाने, या जारी उत्पादन)

  2. किसी के पालतू पर्ल मॉड्यूल की आवश्यकता नहीं कर सकते हैं।

  3. पर्ल के माध्यम से बुलाया जा सकता है।

  4. संभव हो तो, एक कस्टम बनाया स्क्रिप्ट या दूरस्थ मशीन पर उपयोगिता की आवश्यकता नहीं है कर रहे हैं आम तौर पर इस तरह की (नियमित linux उपयोगिताओं ठीक हैं)

समाधान मैं कोशिश की है

ssh remotemachine -f <some command> 

"कुछ कमांड" कर दिया गया है:

tail -f logfile 

बेसिक पूंछ नहीं करता ' टी काम नहीं करता क्योंकि स्थानीय एसएसएच प्रक्रिया मरने के बाद रिमोट प्रक्रिया टर्मिनल को आउटपुट लिखना जारी रखती है।

$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

"रिमोट प्रक्रिया जारी है" से आपका क्या मतलब है? जब एसएसएच कनेक्शन के दोनों तरफ मर जाते हैं, तो दूसरे को भी मरना चाहिए ... * परेशान * –

+0

हाँ - मैंने देखा है कि एसएसएच सत्र मर गए हैं, और जो कुछ भी उनके माध्यम से चल रहा था, तब भी जब तक वे अलग स्क्रीन सत्र में नहीं चल रहे थे या कुछ – warren

उत्तर

51

आप की कोशिश की

ssh आदमी पृष्ठ से
ssh -t remotemachine <some command> 

आयकर विकल्प होता है। यह समाधान काम करता है लेकिन एसएसएचटी का उपयोग करने से कम आदर्श है। सबसे बड़ी समस्या यह है कि आपको कनेक्शन के दोनों किनारों पर एनसी का उपयोग करना होगा और कनेक्ट करने के लिए एक उपयुक्त बंदरगाह खोजने के लिए स्थानीय मशीन पर कुछ पोर्ट खोज करने की आवश्यकता है।

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

exec("nc -l -p $port"); 
+0

जो भी मैंने पहले से पाया उससे भी बेहतर है। धन्यवाद। – Frosty

+0

सरल और कुशल, +1। –

+0

इतनी जीत! मैं समाधान के लिए हर जगह देख रहा हूं। यह बहुत सुरुचिपूर्ण है, और शीर्ष की तरह चीजों के साथ भी काम करता है! धन्यवाद :) –

0

File::Tail है। पता नहीं है कि यह मदद करता है?

+0

यह दूरस्थ रूप से दूरस्थ फ़ाइलों को नहीं करता –

2

कुछ विचार:

  • आप इसे NFS या CIFS से अधिक माउंट सकता है, और फिर File::Tail का उपयोग करें।
  • आप पर्ल के एसएसएच मॉड्यूल में से एक का उपयोग कर सकते हैं (उनमें से कई हैं), tail -f के साथ संयुक्त।
0

rsync: // [USER @] HOST [: पोर्ट]/एसआरसी ... [DEST] | पूंछ [DEST]?

+0

लॉग फ़ाइलों की संख्या और आकार उन्हें स्थानीय मशीन अव्यवहारिक में rsync-ing बनाता है। – Frosty

+0

rsync काफी कुशल हो सकता है क्योंकि यह केवल डेल्टा स्थानांतरित करता है। इसके अतिरिक्त, चूंकि यह डेटा को संपीड़ित कर सकता है, और लॉग फ़ाइल आमतौर पर काफी संपीड़ित होती है, यह काफी अच्छी तरह से काम कर सकती है। हां, अगर आपके पास लाखों फाइलें हैं, तो rsync में कुछ समय लगता है, लेकिन हजारों बड़ी फाइलों के लिए यह काफी अच्छी तरह से काम करता है। – brianegge

1

नेटकैट आपके लिए यह करना चाहिए।

-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

किसी nc (netcat) का उपयोग का सुझाव दिया:

2

आप केवल हालांकि Survlog इसकी ओएस एक्स की कोशिश कर सकते: यहाँ ऊपर कोड के अनुकूलन netcat उपयोग करने के लिए है।

1

आप बैश और 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

दोस्तों मेरी टीम साथी बैश का राजा है और हमने बैश स्क्रिप्ट और rsync का उपयोग करके उस समस्या को हल किया। यह एक सपने की तरह प्रोड में काम कर रहा है। – user1381775

संबंधित मुद्दे