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 em> mais je ne suis pas capable de stocker la sortie sur la machine à partir de laquelle mon script fonctionne. P>
9 Réponses :
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: Vous devez être capable de blomposer / stocker cette sortie. P> p>
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"
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 p>
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;
Si vous utilisez des backticks, essayez ceci:
my @output = `ssh root@1.1.1.1 "which perl"`; print "output: @output";
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;
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 } }
J'ai eu un problème similaire et après de nombreuses recherches, j'ai trouvé une option simple. J'ai utilisé Ce qui suit est un exemple de ce que j'ai utilisé: p> Il exécute le qx () code> et dirigez-vous les commandes SSH comme je le ferais normalement. La capture est que je devais capturer à la fois STDRERR et STDOUT.
python -v < / Code> Commande, qui génère les informations de version sur
STDERR CODE>. Dans cet exemple, mon adresse IP a été stockée dans la variable code> curip code>. Enfin, le
2> & 1 code> 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. P> p>
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. 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. P> J'espère que cela aide à avoir une solution en cas de codage non dur. p> p>
Ê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.