使用 perl openssh 传递命令服务器

Posted

技术标签:

【中文标题】使用 perl openssh 传递命令服务器【英文标题】:pass commands server using perl openssh 【发布时间】:2016-05-29 05:58:08 【问题描述】:

有2个系统,

客户端系统, 在其中我通过对服务器执行 openssh 将命令传递给服务器,我的脚本如下所示

#!/usr/bin/perl
use lib "/home/geek/app/usr/lib/perl5/site_perl/5.8.8";
use lib "/home/geek/app/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi";
use lib "/usr/lib/perl5/5.8.8";

use Net::OpenSSH;
my $host = '******010';
my $user = '*****';
my $pass = '*****';
my $ssh = Net::OpenSSH->new("$user:$pass\@$host");
$ssh->error and
 die "Couldn't establish SSH connection: ". $ssh->error;
my $out = $ssh->capture("/p/inway/bin/inway71 lib123 p123.0_CC default ");
#my $out = $ssh->capture("cd units; ls");
#$out = $ssh->capture("ls units/");

 print "output is $out";

在服务器 /p/inway/bin/inway71 中是一个脚本:

#!/bin/sh
. $MODULESHOME/init/sh
module load lsf

exec bsub -Is -q interactive -J INWAY71_LSF -R 'type==X64LIN && osrel==50 && clearcase' /nfs/site/proj/inway/bin/inway71 $1+"$@"

所以当我登录到我的服务器并在我的终端中运行这个脚本时,我将被定向到某个路径(我不知道它是什么,但我猜它还有一个服务器,我可以使用这个 bash 脚本登录)我可以完成其余的活动,例如 cd、ls、cat 等)

但是当我从我的客户端系统运行它时,它会将控制权传递给终端并等待我的输入,在我的终端中我收到一条错误消息,

stty:standard input:Invalid argument

在我的终端中,我可以执行 ls 或任何操作,但无法从 perl 脚本执行并捕获结果。 我该如何解决这个问题并得到我想要的?

【问题讨论】:

对不起我的英语:p 总是 use strict; use warnings;! 如果您不希望程序具有交互性,也许您不应该传递选项-q interactive no.. 删除 -q interactive 没有帮助.. 【参考方案1】:

该远程命令期望在交互模式下运行。这不适用于 SSH 命令模式。看到这个 Net::OpenSSH FAQ!

你可以:

    找到一种将命令作为参数传递给该脚本的方法。 重写它以接受命令作为参数。 使用Expect与它交谈。

【讨论】:

以上是关于使用 perl openssh 传递命令服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl 和 OpenSSH 与 Switch 交互

在 shell 命令中使用本地 perl 变量

perl Openssh ConnectionTimeout 不起作用

在 Perl 中使用 awk 解析两个字符串之间的所有内容

Net::OpenSSH 中的交互模式

如何使用 Perl 的 OpenSSH 读取输出的每一行