免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6929 | 回复: 11
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 2018-06-22 13:44 |只看该作者
把数据库的值取出来重新定义变量赋值,然后 print "hosts are same\n" if $host eq $dbhost来测试哪个不一样

论坛徽章:
0
3 [报告]
发表于 2018-06-22 13:53 |只看该作者
进来学习一下谢谢楼主lol

论坛徽章:
0
4 [报告]
发表于 2018-06-22 14:10 |只看该作者
回复 2# asthman

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

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

论坛徽章:
0
6 [报告]
发表于 2018-06-22 17:03 |只看该作者
到底是有没有用我的方法验证啊

论坛徽章:
0
7 [报告]
发表于 2018-06-24 11:54 |只看该作者
asthman 发表于 2018-06-22 17:03
到底是有没有用我的方法验证啊

不止用了你的办法

论坛徽章:
0
8 [报告]
发表于 2018-06-24 12:13 |只看该作者
回复 7# heyddo

玄学代表,没法帮

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期: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:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
9 [报告]
发表于 2018-06-26 18:11 |只看该作者
不是不可见字符的问题?

论坛徽章:
0
10 [报告]
发表于 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号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP