失去与 Net::SSH::Perl 的连接

2024-01-05

解决方案如下

我们有一个 ETL 系统,它将数据提取到 CSV 中,将其上传到另一台服务器,然后需要连接到另一台服务器并调用 java jar 将 csv 加载到 memcache 中。我有一个脚本可以执行其中的每一步,但在最后一步会丢失 SSH 连接。远程计算机上的进程继续并完成。

我为此使用 Net::SSH::Perl ,它在运行一小段时间后收到“连接失败:连接由对等方重置”错误。我将脚本归结为以下内容并复制了结果:

#!/usr/bin/perl

use strict;
use Net::SSH::Perl;
use Log::Log4perl;

my ($stdout, $stderr, $exit, $ssh);

$ssh = Net::SSH::Perl->new('sshost',
        identity_files => ['/path/to/key.rsa'],
        protocol => 2,
        debug => 1);

$ssh->login('user');

my $cmd = "java -Xms4096m -Xmx4096m -DetlDate=20120427 -DmemcacheHosts=host1,host2 -cp etl-0.1-SNAPSHOT.jar com.nnn.platform.service.etl";

$ssh->register_handler("stdout", sub {
        my($channel, $buffer) = @_;
        print "STDOUT: ", $buffer->bytes;
});

$ssh->register_handler("stderr", sub {
        my($channel, $buffer) = @_;
        print "STDERR: ", $buffer->bytes;
});

$ssh->cmd("cd /usr/local/loader; $cmd");

我得到的 SSH 调试信息是:

localhost: Reading configuration data /home/user/.ssh/config
localhost: Reading configuration data /etc/ssh_config
localhost: Connecting to sshost, port 22.
localhost: Remote protocol version 2.0, remote software version OpenSSH_4.3
localhost: Net::SSH::Perl Version 1.34, protocol version 2.0.
localhost: No compat match: OpenSSH_4.3.
localhost: Connection established.
localhost: Sent key-exchange init (KEXINIT), wait response.
localhost: Algorithms, c->s: 3des-cbc hmac-sha1 none
localhost: Algorithms, s->c: 3des-cbc hmac-sha1 none
localhost: Entering Diffie-Hellman Group 1 key exchange.
localhost: Sent DH public key, waiting for reply.
localhost: Received host key, type 'ssh-dss'.
localhost: Host 'sshost' is known and matches the host key.
localhost: Computing shared secret key.
localhost: Verifying server signature.
localhost: Waiting for NEWKEYS message.
localhost: Send NEWKEYS.
localhost: Enabling encryption/MAC/compression.
localhost: Sending request for user-authentication service.
localhost: Service accepted: ssh-userauth.
localhost: Trying empty user-authentication request.
localhost: Authentication methods that can continue: publickey,gssapi-with-mic.
localhost: Next method to try is publickey.
localhost: Trying pubkey authentication with key file '/path/to/key.rsa'
localhost: Login completed, opening dummy shell channel.
localhost: channel 0: new [client-session]
localhost: Requesting channel_open for channel 0.
localhost: channel 0: open confirm rwindow 0 rmax 32768
localhost: Got channel open confirmation, requesting shell.
localhost: Requesting service shell on channel 0.
localhost: channel 1: new [client-session]
localhost: Requesting channel_open for channel 1.
localhost: Entering interactive session.
localhost: Sending command: cd /usr/local/loader; java -Xms4096m -Xmx4096m -DetlDate=20120427 -DmemcacheHosts=host1,host2 -cp etl-0.1-SNAPSHOT.jar com.nnn.platform.service.etl
localhost: Sending command: cd /usr/local/loader; java -Xms4096m -Xmx4096m -DetlDate=20120427 -DmemcacheHosts=host1,host2 -cp etl-0.1-SNAPSHOT.jar com.nnn.platform.service.etl
localhost: Requesting service exec on channel 1.
localhost: channel 1: open confirm rwindow 0 rmax 32768

然后 jar 的输出被打印到 STDERR,我看到它被返回。 9 秒后它停止了,我最终因对等错误而重置了连接。 STDERR 处理程序按预期工作。

我不确定这是否是 Net::SSH::Perl 处理命令的问题,这些命令需要一段时间才能通过 STDERR 或其他方式运行/返回。我一直在考虑切换到 Net::SSH2,因为它看起来是一个功能更齐全的库,但我真的很想知道为什么会失败。

SOLUTION

问题在于输出仅进入 STDERR。我编辑了命令来添加2>&1从而将 STDERR 重定向到 STDOUT,突然一切都按预期工作。


Net::SSH::Perl 不再维护,并且有一长串已知未解决的错误。如今,CPAN 提供了更好的模块,例如网络::SSH2 https://metacpan.org/module/Net%3a%3aSSH2 or 网络::OpenSSH https://metacpan.org/module/Net%3a%3aOpenSSH.

例如:

my $ssh = Net::OpenSSH->new($sshost,
                            user => $user,
                            key_path => '/path/to/key.rsa');
my ($out, $err) = $ssh->capture2($cmd);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

失去与 Net::SSH::Perl 的连接 的相关文章

  • 更新命令行输出

    我的程序 碰巧是用 Perl 编写的 尽管我不认为这个问题是 Perl 特定的 在程序中的某一点输出状态消息 Progress x yy where x and yy是一个数字 例如 Progress 4 38 我想在打印新的状态消息时 覆
  • Perl 脚本(或任何东西)来合计 CSV 列

    我写了 在其他人的很多帮助下 awk command https stackoverflow com questions 4159224 excel and awk disagree about csv totals 4159404 415
  • Perl - 以相反的顺序逐行读取文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Perl 中从文件末尾读取行 https stackoverflow com questions 303053 how can i read lines from the end of fil
  • 无法通过 SSH 连接到 Google 计算引擎

    我在一个新项目中设置了一个新的 Google Compute Engine 实例 我启动实例并使用命令gcloud init连接到我的项目 然后我使用命令sudo gcloud compute ssh instance 1 它引导我完成 S
  • 如何在没有循环的情况下初始化哈希中的值?

    我正在尝试找出一种无需经过循环即可初始化哈希的方法 我希望使用切片来实现这一点 但它似乎没有产生预期的结果 考虑以下代码 usr bin perl use Data Dumper my hash hash currency symbol B
  • MySQL Workbench(版本 6.0.8)SSH 身份验证问题

    我正在尝试通过 SSH 通过计算机 Y 连接到主机 X 上的 MySQL 服务器 相同的设置 但 MySQL 工作台的版本较旧 适用于我的另一个机器 CentOS 6 3 但是 相同的设置在我的 CentOS 6 5 上不起作用 我尝试使用
  • 如何使用 Net::SSH::Perl 和公钥?

    我正在尝试使用Net SSH Perl使用公钥与此代码进行连接 my ssh Net SSH Perl gt new host debug gt 1 die 我将密钥放在 root ssh id rsa 和 root ssh identit
  • 如何让 git 和 copSSH 在正确的目录中查找密钥?

    我刚刚安装了 Windows 版 copSSH 当我启动它时 我得到一个目录C copSSH home Nick ssh其中有我的酒吧和私钥 当我通过 Cygwin bash 窗口访问此目录时 使用 ssh 用户 主机 我很高兴地登录了 但
  • Perl 中可以使用哪种语法糖来减少左/右值运算符与 if 语句的代码?

    那里有很多语句 因为 Perl 是一种非常甜蜜的语言 但任何语言中最常用的语句都是 if 语句和设置值的组合 我想我已经找到了很多 但仍然存在一些空白 最终 目标是不必多次编写变量名 这是我到目前为止所拥有的 r s r s unless
  • unix df 上的正则表达式帮助

    我需要一些帮助来调整我的代码以查找此 UNIX 中的另一个属性df output Ex Filesystem Size Used Avail Capacity Mounted on dev ad4s1e 61G 46G 9 7G 83 ho
  • 如何为 VS Code SSH Remote 配置不同的 shell?

    当我连接到 VS Code 集成终端时 如何更改使用的 shell远程 ssh 工作区 https code visualstudio com docs remote ssh 添加 Matt Bierner 的答案 较新的版本vscode现
  • Perl YAML 模块无法识别标量类型

    我加载以下 yaml 文件 foo bar s 1 hx 0x34 用这段代码 use YAML qw LoadFile Dump use Data Dumper my d LoadFile test yaml print Dumper d
  • 如何确保我的代码永远不会直接退出?

    eval require file subsequent code goes here If file包含一个exit语句 后面的代码就没有机会运行 如何解决以便后续代码始终有机会运行eval已经完成了 中止是不可能的exit call f
  • 为什么我只得到第一个捕获组?

    https stackoverflow com a 2304626 6607497 https stackoverflow com a 2304626 6607497 and https stackoverflow com a 370042
  • 使用 Perl 获取 值

    因此 我有一个报告工具 可以在 HTML 文件中输出作业调度统计信息 并且我希望使用 Perl 来使用这些数据 但我不知道如何单步浏览 HTML 表 我知道如何使用 jQuery 来做到这一点 find tr each function v
  • perl-5.10 之前的高效版本相当于 pack("Q>")

    更新 萨尔瓦正确地指出我对 Q 包模板的介绍是错误的 这是 gt 修饰符 不会返回到 5 8 Perl 5 10 引入了 pack 修饰符 gt 对于我使用 Q 的用例 它将一个无符号四边形 64 位 值打包在大尾数法 现在 我正在寻找一个
  • paramiko ssh.connect - 要发送什么参数?

    我真的很新python and ssh 我正在尝试编写一个简单的程序来打开ssh连接使用python 我已经有了paramiko 但我遇到的问题是 使用终端我使用以下命令打开我的ssh ssh username email protecte
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 如何检查主机是否在您的known_host ssh中

    我的脚本中使用以下命令 将主机添加到 ssh 中的已知主机 VAR2 expect c spawn ssh o StrictHostKeyChecking no REMOTE HOST USER REMOTE HOST IP expect
  • 为使用 SSH.NET SshClient.CreateShellStream 执行的命令 (sudo/su) 提供子命令

    我正在尝试使用 Renci SSH NET 从 C Web 应用程序连接到远程 Linux 服务器并执行 shell 脚本 我想一个接一个地运行脚本 但不知道如何运行脚本并读取输出并将其存储在标签中 我已经尝试了下面的代码 但无法一行接一行

随机推荐

  • EmberJS pre2 将车把模板放在错误的位置

    我尝试在我的网络应用程序上将 EmberJS 从 pre1 更新到 pre2 但我注意到它将所有车把模板作为最后一个主体元素 有时根本不这样做 I ve 创建一个重现 http emberjs pre2 bug staticloud com
  • 有什么办法可以等到 DirectionsService 返回结果吗?

    我在使用 Google DirectionsService 时遇到问题 我知道它是异步的 这就是我遇到麻烦的原因 我想等到 DirectionsService 返回结果 而不是在没有答案的情况下执行代码 这是一个示例 function sn
  • 如何在集成测试中传递授权令牌标头?

    A 相关问题 https stackoverflow com questions 12041091 ror testing an action that uses http token authentication意味着我可以使用令牌身份验
  • Linux进程间通信如何选择“Key”?

    再会 我正在做作业 其中指出我有 5 个进程 一个服务器 其余的都是客户端 每个进程都应该由不同的可执行文件引发 我将实现一个双向消息传递解决方案 但问题不在于消息传递本身 有没有一种优雅的方式来传达key这些不同的可执行文件之间 即当我调
  • 递增指针 (ptr++) 和 (*ptr++)

    当我有这个疑问时 我正在重新审视指针 int ptr int arr 5 10 20 30 40 50 ptr arr 0 Now printf Value d ptr 会打印10 if I do ptr printf Value d pt
  • 我如何告诉 R 正确舍入?

    我如何告诉 R 正确舍入 R 中的小数位数 我遇到了一个不知道如何解决的问题 我希望 R 计算 5 26 100 19 230769 x lt 5 26 100 x 给我 1 19 23077 让我们尝试使用 round 首先将数字设置为
  • 通过 pyCurl 上传文件

    我正在尝试将以下curl代码转换为pycurl 我不想使用请求 我需要使用 pycurl 因为 requests 在我的旧 python 版本中不能完全工作 curl X POST H Accept Language en F email
  • 如何将 amazon S3 存储桶策略设置为除管理员之外的所有人私有?

    我有一个存储桶 我不小心将数千个带有 ACL 的文件上传到 public read 我希望除生成的访问 URL 之外的所有文件均不可用 我尝试创建一个存储桶策略 拒绝所有人的所有操作 并允许我的所有操作 它不起作用 即使生成了访问 URL
  • 将 DataTable 转换为 XML 文件,反之亦然

    我在将 XML 文件读取到DataTable 最初 我正在写一个Datatable到 XML 文件并保存 现在 当我想将 XML 文件读回到DataTable 它没有发生 以下代码用于写入文件 private void saveAsTool
  • Elastic Search:具有自定义类型的一个索引来区分文档模式 VS 多个索引,每个文档类型一个索引?

    我在 ES 方面没有经验 我的背景更多是关系数据库 我试图实现在我的 Web 应用程序中拥有一个搜索栏来搜索它的全部内容 或者我愿意索引的内容 的目标英语 实现的架构是 Jamstack 其中 gatsby 应用程序从 Strapi 应用程
  • 错误:“无法分配给‘Bool’类型的不可变表达式”?

    我该如何解决 我是一名新编码员 谢谢 我收到以下错误 无法分配给 Bool 类型的不可变表达式 当我尝试将 isSelected 设置为false and true IBAction func onFilter sender Any if
  • 使用 Sympy 方程进行绘图

    创建 Sympy 方程 求导 然后绘制该方程的结果的最佳方法是什么 我有符号方程 但无法弄清楚如何制作用于绘图的值数组 这是我的代码 from sympy import symbols import matplotlib pyplot as
  • 使用 protobuf-net 进行惰性、流驱动的对象序列化

    我们正在开发一个用于流式传输大量数据的 WCF 服务 因此我们选择使用WCF 流式传输 http msdn microsoft com en us library ms733742 aspx功能结合protobuf网络 http code
  • 如何区分用户是否处于订阅试用期或不在google play?

    我正在实现一项服务器端服务 用于检查用户的 google play 订阅状态 我使用 Android Publisher API https developers google com android publisher api ref p
  • Rails3 & Git & Heroku - 开发/登台服务器

    我有一个 Rails 3 应用程序 正在与一个使用 Git Github 的团队一起开发 并部署到 Heroku cedar 堆栈 我们的 Github 存储库有 2 个主要分支 Master 和 Development 我想定期将我们的开
  • REST 查询中的 UTF-8 编码字符未正确呈现

    我正在使用一个外部 REST 服务 该服务以 UTF 8 编码提供所有内容 由于某种原因 我的应用程序无法正确处理响应 如果我转储回复 我会看到像 Lule 应该是 Lule 这样的东西 编辑 如果我将字符串转发 不更改 到 UI 也会发生
  • 如何让 toString() 返回多行字符串?

    我正在开发一个程序 该程序搜索数组并找到最小值 然后打印出跑步者的时间 名字和姓氏 我需要弄清楚如何在不同的行上返回三个值 例如 public String toString return String format firstName l
  • Java 同步 String IllegalMonitorStateException

    我试图让 Thread2 等待 String 并让 Thread1 通知 String 更新 我确实同步了 String 对象 如下面的代码所示 但我仍然得到IllegalMonitorStateException这是我的代码 public
  • CreateFile 无法共享串行 (COM) 端口

    The 创建文件 https msdn microsoft com en us library windows desktop aa363858 v vs 85 aspx函数对于打开文件或设备进行读 写访问非常有用 提供句柄 第三个参数 d
  • 失去与 Net::SSH::Perl 的连接

    解决方案如下 我们有一个 ETL 系统 它将数据提取到 CSV 中 将其上传到另一台服务器 然后需要连接到另一台服务器并调用 java jar 将 csv 加载到 memcache 中 我有一个脚本可以执行其中的每一步 但在最后一步会丢失