11
votes

Comment puis-je SSH à l'intérieur d'un script Perl?

Je veux ssh sur un serveur et exécuter une simple commande comme "id" et obtenir la sortie de celui-ci et stocker-le dans un fichier sur mon serveur principal. Je n'ai pas de privilèges à installer net :: SSH qui ferait ma tâche très facile. S'il vous plaît me fournir une solution pour cela. J'ai essayé d'utiliser back-ticks mais je ne suis pas capable de stocker la sortie sur la machine à partir de laquelle mon script fonctionne.


4 commentaires

Êtes-vous sûr de ne pas avoir les privilèges que vous devez installer net :: ssh? shadowcat.co.uk/blog / matt-s-truite / mais-i-net-utilité-cpan


Il y a beaucoup d'informations sur l'installation de modules Perl dans votre propre espace. Il est même sur Stackoverflow: Stackoverflow.com/Questtions/251705/...


Pendant que je réalise que c'est une vieille question, je pense avoir besoin de commenter. Pourquoi la plupart des programmeurs sont-ils fondés lorsque d'autres programmeurs demandent de l'aide car ils ne sont pas autorisés à utiliser un code open source, puis de commenter à quel point il est facile d'installer le code et de l'utiliser. Il existe toujours des entreprises qui ne permettent pas à leurs programmeurs d'utiliser un code externe à moins qu'il ne passe sous des tests rigoureux pour la fonctionnalité, la performance, la sécurité, etc. Ma société se trouve comme celle-là. Ils préfèrent réinventer la roue que d'utiliser du code extérieur et faire tout ce qui est en leur pouvoir pour empêcher son utilisation.


Salman écrit: Je n'ai pas les privilèges. Cela suggère une question de permission de fichiers, pas une question de politique de la société. Les commentaires expliquent comment les problèmes de permission de fichiers sont faciles à surmonter.


9 Réponses :


0
votes

Si vous avez la configuration des touches hôtes SSH, vous pouvez simplement exécuter la commande SSH System, puis spécifier la commande à exécuter sur la machine après cela. Par exemple: xxx

Vous devez être capable de blomposer / stocker cette sortie.


0 commentaires

8
votes

Vous pouvez toujours installer des modules localement, et c'est la méthode que vous devriez examiner; Cependant, vous devriez être capable de vous éloigner

#!/usr/bin/perl

use strict;
use warnings;

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

chomp $id;

print "id is [$id]\n"


0 commentaires

0
votes

supposer que vous êtes dans un environnement comme moi où vous ne pouvez pas ajouter de modules supplémentaires et vous ne pouvez pas créer de fichier d'identité, vous pouvez utiliser ce script comme point de départ.

Si vous pouvez configurer Les touches SSH utilisent ensuite simplement la commande Backticks déjà affichée, bien que vous ayez besoin de l'option -I option xxx


0 commentaires

15
votes

La meilleure façon d'exécuter des commandes à distance à l'aide de SSH est

#!/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 commentaires

1
votes

Si vous utilisez des backticks, essayez ceci:

my @output = `ssh root@1.1.1.1 "which perl"`;

print "output: @output";


0 commentaires

2
votes

ou, en supposant que les touches d'hôte sont présentes et que vous souhaitez faire quelque chose avec la commande OUPUT ...

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


0 commentaires

0
votes
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
    }
}

0 commentaires

1
votes

J'ai eu un problème similaire et après de nombreuses recherches, j'ai trouvé une option simple. J'ai utilisé qx () et dirigez-vous les commandes SSH comme je le ferais normalement. La capture est que je devais capturer à la fois STDRERR et STDOUT.

Ce qui suit est un exemple de ce que j'ai utilisé: xxx

Il exécute le python -v < / Code> Commande, qui génère les informations de version sur STDERR . Dans cet exemple, mon adresse IP a été stockée dans la variable curip . Enfin, le 2> & 1 aide à capturer à la fois STDOUT et STDERR. Je n'ai pas spécifié de mot de passe, car j'ai une configuration des échanges clés. J'espère que cela aide.


0 commentaires

0
votes

Je sais que c'est un très vieux fil, mais depuis que je rencontre le même problème, j'ai trouvé une autre solution utile au cas où quelqu'un utilise Linux. XXX

Ceci suppose que vous avez configuré ssh -Keys donc pas d'entrée utilisateur ne sera requis. Je ne voulais pas avoir des valeurs codées dures c'est le meilleur moyen pour moi qui a fonctionné le meilleur. J'utilise Readpipe pour atteindre cela.

J'espère que cela aide à avoir une solution en cas de codage non dur.


0 commentaires