忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 2994 | 回复: 11

使用Net::SFTP连接SFTP服务器失败(Connection closed by remote host) [复制链接]

论坛徽章:
0
发表于 2018-06-22 11:31 |显示全部楼层
    我在用Net::SFTP连接SFTP服务器时,遇到一个奇怪的问题。
    先上脚本片段:
    $host = $rSelectInfoRef->[0][2];
    $user = $rSelectInfoRef->[0][3];
    $password = $rSelectInfoRef->[0][4];

    print "[DEBUG] $host|$user|$password|\n";

    my $sftp;

    eval {
        $sftp = Net::SFTP->new($host, user=>$user, password=>$password);
    };
    if( $@ ) {
        print "[ERROR] $@";
        exit -1;
    }
    我的脚本要实现一个简单的逻辑,从oracle中获取SFTP服务器的连接信息,然后使用Net::SFTP连接服务器进行一些操作,但是运行的时候出现报错:
        Connection closed by remote host. at /usr/local/lib64/perl5/Net/SSH/Perl/AuthMgr.pm line 165
    但是,奇怪的是,我修改了脚本,在程序中直接对SFTP连接信息赋值,程序又能成功运行,数据库中的值和我直接赋值的值是完全一样的(确认过很多遍),希望大家能帮忙看下这个问题。

    # 将数据库取值注释,改为直接赋值

    #$host = $rSelectInfoRef->[0][2];
    #$user = $rSelectInfoRef->[0][3];
    #$password = $rSelectInfoRef->[0][4];

    $host = "168.16.5.110";
    $user = "test";
    $password = "000000";
    print "[DEBUG] $host|$user|$password|\n";

    my $sftp;

    eval {
        $sftp = Net::SFTP->new($host, user=>$user, password=>$password);
    };
    if( $@ ) {
        print "[ERROR] $@";
        exit -1;
    }


论坛徽章:
0
发表于 2018-06-22 13:44 |显示全部楼层
把数据库的值取出来重新定义变量赋值,然后 print "hosts are same\n" if $host eq $dbhost来测试哪个不一样

论坛徽章:
0
发表于 2018-06-22 13:53 |显示全部楼层
进来学习一下谢谢楼主lol

论坛徽章:
0
发表于 2018-06-22 14:10 |显示全部楼层
回复 2# asthman

数据库的值和我写死的常量值是一样的,我想了很多办法验证了。

论坛徽章:
0
发表于 2018-06-22 14:53 |显示全部楼层
查了一上午还是没发现原因,没办法,我换了一个模块 Net::SFTP::Foreign,然后就可以运行,不报错了。我去看了一下Net::SFTP模块的代码,也调试了一下,不过没有发现什么问题,可能我有的技术还不是很懂,有没有大神有空看看。

论坛徽章:
0
发表于 2018-06-22 17:03 |显示全部楼层
到底是有没有用我的方法验证啊

论坛徽章:
0
发表于 2018-06-24 11:54 |显示全部楼层
asthman 发表于 2018-06-22 17:03
到底是有没有用我的方法验证啊

不止用了你的办法

论坛徽章:
0
发表于 2018-06-24 12:13 |显示全部楼层
回复 7# heyddo

玄学代表,没法帮

论坛徽章:
39
技术图书徽章
日期:2018-08-21 13:30:492015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2018-08-21 13:30:242016科比退役纪念章
日期:2018-03-07 11:23:33
发表于 2018-06-26 18:11 |显示全部楼层
不是不可见字符的问题?

论坛徽章:
0
发表于 2018-06-27 09:56 |显示全部楼层
回复 9# laputa73

谢谢你的回复,这个问题确实有点奇怪。

之前也怀疑过不可见字符,特意检查过了,没有发现有不可见字符,而且用另外一个模块Net::SFTP::Foreign去同样的数据库表取连接信息连接SFTP是没有问题的。

跟踪了一下代码,发现在Net::SSH:erl:acket模块的read函数里面抛出的异常, 代码如下。
在sysread那行,如果是从数据库取连接信息,每次运行到sysread调用时都会出现读取不到数据的情况。

sub read {
    my $class = shift;
    my $ssh = shift;
    my $sock = $ssh->sock;

    while (1) {
        if (my $packet = $class->read_poll($ssh)) {
            return $packet;
        }
        my $s = IO::Select->new( $sock );
        my @ready = $s->can_read;
        my $buf;
        my $len = sysread $sock, $buf, 8192;
        croak "Connection closed by remote host." if $len == 0;
        if (!defined $len) {
            next if $! == EAGAIN || $! == EWOULDBLOCK;
            croak "Read from socket failed: $!";
        }

        ## Untaint data read from sshd. This is binary data,
        ## so there's nothing to taint-check against/for.
        ($buf) = $buf =~ /(.*)/s;
        $ssh->incoming_data->append($buf);
    }
}

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP