2010-05-17 4 views
9

मैं सर्वर पर एसएसएच करना चाहता हूं और "आईडी" जैसे सरल कमांड को निष्पादित करना चाहता हूं और इसका आउटपुट प्राप्त कर सकता हूं और इसे अपने प्राथमिक सर्वर पर फ़ाइल में संग्रहीत कर सकता हूं। मेरे पास Net::SSH इंस्टॉल करने के लिए विशेषाधिकार नहीं हैं जो मेरा कार्य बहुत आसान बना देगा। कृपया मुझे इसके लिए एक समाधान प्रदान करें। मैंने बैक-टिक का उपयोग करने का प्रयास किया लेकिन मैं उस मशीन पर आउटपुट स्टोर करने में सक्षम नहीं हूं जिससे मेरी स्क्रिप्ट चलती है।मैं एक पर्ल स्क्रिप्ट के अंदर कैसे ssh कर सकते हैं?

+8

क्या आप वाकई नेट :: एसएसएच स्थापित करने के लिए आवश्यक विशेषाधिकार नहीं हैं? http://www.shadowcat.co.uk/blog/matt-s-trout/but-i-cant-use-cpan/ – Quentin

+0

आपकी अपनी जगह में पर्ल मॉड्यूल स्थापित करने के बारे में बहुत सारी जानकारी है। यह स्टैक ओवरफ्लो पर भी है: http://stackoverflow.com/questions/251705/how-can-i-use-a-new-perl-module-without-install-permissions –

+11

जबकि मुझे एहसास हुआ कि यह एक पुराना प्रश्न है, मुझे लगता है कि मैं टिप्पणी करने की आवश्यकता है। अधिकांश प्रोग्रामर क्यों चुने जाते हैं जब अन्य प्रोग्रामर मदद के लिए पूछते हैं क्योंकि उन्हें ओपन सोर्स कोड का उपयोग करने की अनुमति नहीं है और फिर कोड को इंस्टॉल करना और इसका उपयोग करना कितना आसान है इसके बारे में टिप्पणी करें। ऐसी कंपनियां अभी भी हैं जो अपने प्रोग्रामर को बाहरी कोड का उपयोग करने की अनुमति नहीं देती है जब तक कि यह कार्यक्षमता, प्रदर्शन, सुरक्षा इत्यादि के लिए कठोर परीक्षण न हो। मेरी कंपनी ऐसा ही होता है। वे आपको बाहरी कोड का उपयोग करने से चक्र को फिर से शुरू करना पसंद करते हैं और इसके उपयोग को रोकने के लिए जो भी कर सकते हैं वह कर सकते हैं। –

उत्तर

0

यदि आपके पास ssh होस्ट कुंजी सेटअप है तो आप बस ssh system कमांड चला सकते हैं और उसके बाद मशीन पर चलाने के लिए कमांड निर्दिष्ट कर सकते हैं। उदाहरण के लिए:

`ssh [email protected] id` 

आप chomp करने के लिए सक्षम होना चाहिए/कि उत्पादन की दुकान।

7

आप हमेशा स्थानीय रूप से मॉड्यूल स्थापित कर सकते हैं, और यही वह तरीका है जिसे आप देखना चाहिए; हालांकि, आप

#!/usr/bin/perl 

use strict; 
use warnings; 

my $id = qx/ssh remotehost id 2>&1/; 

chomp $id; 

print "id is [$id]\n" 
0

यह मानते हुए कि तुम मुझे पसंद है एक वातावरण में हैं, जहां आप अतिरिक्त मॉड्यूल नहीं जोड़ सकते हैं और आप एक पहचान फ़ाइल नहीं बना सकते के साथ भाग प्राप्त करने में सक्षम होना चाहिए, तो आप इस का उपयोग कर सकते एक प्रारंभिक बिंदु के रूप में लिपि।

आप सेट कर सकते हैं, तो ssh कुंजी तो बस यद्यपि आप मैं विकल्प

#!/usr/bin/perl 
use warnings; 
use strict; 
use Expect; 
use Data::Dumper; 

my $user = 'user'; 
my $pw = 'password'; 
my $host = 'host'; 
my $cmd = 'id'; 

my $exp = new Expect; 
$exp->log_file("SSHLOGFILE.txt"); 
$exp->log_stdout(0); 
$exp->raw_pty(1); 


my $cli = "/usr/bin/ssh $user\@$host -o StrictHostKeyChecking=no -q $cmd"; 

$exp->spawn($cli) or die "Cannot spawn $cli: $!\n"; 

$exp->expect(5, 
[ qr /ssword:*/ => sub { my $exph = shift; 
          $exph->send("$pw\n"); 
          exp_continue; }]); 

my $read = $exp->exp_before(); 
chomp $read; 
print Dumper($read); 

$exp->soft_close(); 
+1

अपेक्षा मानक मॉड्यूल नहीं है ... – lbalazscs

13

दूर से SSH का उपयोग कर आदेशों को चलाने के लिए सबसे अच्छा तरीका आवश्यकता हो सकती है, बैकटिक आदेश पहले से ही तैनात का उपयोग

$ ssh [email protected] "command" > output.file 
है

आप इसे या तो बैश या पेर्ल में उपयोग कर सकते हैं। हालांकि, यदि आप पर्ल का उपयोग करना चाहते हैं तो आप अपनी स्थानीय निर्देशिका पथ में पर्ल मॉड्यूल स्थापित कर सकते हैं जैसा कि ब्रायन द्वारा उनकी टिप्पणी में या पर्ल एफएक्यू से "How do I keep my own module/library directory?" पर सुझाया गया है। नेट :: एसएसएच का उपयोग करने के बजाय मैं नीचे दिए गए उदाहरण के साथ नेट :: एसएसएच :: पर्ल का उपयोग करने का सुझाव दूंगा।

#!/usr/bin/perl -w 
use strict; 
use lib qw("/path/to/module/"); 

use Net::SSH::Perl; 

my $hostname = "hostname"; 
my $username = "username"; 
my $password = "password"; 

my $cmd = shift; 

my $ssh = Net::SSH::Perl->new("$hostname", debug=>0); 
$ssh->login("$username","$password"); 
my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd"); 
print $stdout; 
+0

@ सलमान: इस पर कोई अपडेट? – Space

1

बैकटिक आप उपयोग कर रहे हैं इस प्रयास करें:

my @output = `ssh [email protected] "which perl"`; 

print "output: @output"; 

यह केवल उपयोगी है अगर आप एक publickey कि उपरोक्त आदेश पासवर्ड के लिए संकेत नहीं होगा।

2

या, यह मानते हुए मेजबान कुंजी मौजूद नहीं है और आप आदेश ouput के साथ कुछ करना चाहता हूँ ...

open(SSH,"/usr/bin/ssh you\@server ps aux |") or die "$!\n"; 
while (<SSH>) { 
    # do stuff with $_ 
} 
close SSH; 
0
use warnings; 
use strict; 
use NET::SSH2; 

sub is_sshalive; 

my $host = "ip"; # use the ip host to connect 
my $user = "UNAME"; # your account 
my $pass = "PASSWD"; # your password 
my $cmd; 
my $ssh2 = Net::SSH2->new(); 
$ssh2->debug(1); 
if ($ssh2->connect($host)) { 
    #if ($ssh2->auth_password($user,$pass)) { 
    if ($ssh2->auth_keyboard($user,$pass)) { 
     print "\n Executing command...\n"; 
     $cmd = "ls"; 
     print " ==> Running $cmd\n"; 
     if(is_sshalive($ssh2) == 1) { 
       print "\nSSH connection died"; 
       exit 1; 
     } else { 
      run_testsuite($cmd, $ssh2); 
     } 
    } else { 
     warn "ssh auth failed.\n"; 
     exit 1; 
    } 
} else { 
    warn "Unable to connect Host $host \n"; 
    exit 1; 
} 
print "test passed done 0\n"; 


sub run_testsuite { 
    my $cmd = $_[0]; 
    my $ssh2 = $_[1]; 

    my $chan2 = $ssh2->channel(); 
    $chan2->shell(); 
    print $chan2 "$cmd \n"; 
    print "LINE : $_" while <$chan2>; 
    $chan2->close; 
    return 0; 
} 

sub is_sshalive { 
    my $ssh2 = $_[0]; 
    if ($ssh2->poll(1000) == 0) { 
     return 0; # passed 
    } else { 
     return 1; #failed 
    } 
} 
1

मैं एक ऐसी ही समस्या हुई, और भी बहुत खोज करने के बाद मैं एक साधारण पाया है विकल्प। मैंने qx() का उपयोग किया और सामान्य रूप से एसएसएच कमांड चलाया। पकड़ है कि मुझे दोनों stderr और stdout पर कब्जा करना पड़ा था।

my $output = qx(ssh root\@$curIP python -V 2>&1); 

यह python -V आदेश है, जो stderr के संस्करण जानकारी आउटपुट चलाता है:

निम्नलिखित मैं क्या प्रयोग किया जाता का एक उदाहरण है। इस उदाहरण में, मेरा आईपी पता $curIP चर में संग्रहीत किया गया था। अंत में, 2>&1 दोनों stdout और stderr को कैप्चर करने में मदद करता है। मैंने पासवर्ड निर्दिष्ट नहीं किया है, क्योंकि मेरे पास मुख्य एक्सचेंज सेटअप है। उम्मीद है की यह मदद करेगा।

0

मुझे पता है कि यह एक बहुत पुराना धागा है, लेकिन जब से मुझे एक ही समस्या का सामना करना पड़ता है तो मुझे लिनक्स का उपयोग करने के मामले में एक और उपयोगी समाधान मिला।

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my $host = $ARGV[0]; 
my $port = $ARGV[1]; 
my $cmd = $ARGV[2]; 

my @output = readpipe("ssh -p ". 
       $port." ". 
       $host." ". 
       $cmd.""); 

chomp @output; 

print Dumper \@output; 

__END__ 

perl sample.pl 127.0.0.1 22 "which perl" 
Ubuntu 16.04.1 LTS 
$VAR1 = [ 
      '/usr/bin/perl' 
     ]; 

यह मानता है कि आप ssh-कुंजी ताकि कोई उपयोगकर्ता इनपुट की आवश्यकता होगी कॉन्फ़िगर किया है। मैं कठोर कोडित मूल्य नहीं चाहता था यह मेरे लिए सबसे अच्छा तरीका है जो सर्वोत्तम काम करता है। मैं इसे प्राप्त करने के लिए readpipe का उपयोग कर रहा हूं।

उम्मीद है कि यह हार्ड कोडिंग के मामले में समाधान करने में मदद करता है।