为什么我拒绝连接?

时间:2014-11-24 10:22:06

标签: bash perl

我正在通过sftp传输文件。我的bash和Perl脚本都无法连接。

我可以使用psftp和复制文件连接到远程服务器,但我们的想法是能够实现自动化。

关于SO帖子的建议我在本地机器上安装了ssh和sshd。但是在远程服务器上没有.ssh目录,所以我无法在那里复制id_dsa.pub文件。 我的下面的bash脚本

#!/bin/bash

USERNAME="rema"
HOSTS="aa.bb.ccc.ddd"
PASSWORD="rema"
SCRIPT="cd data; pwd; cp gateway_data* /home/meteo/AWS_Data/Data"
    ssh -l ${USERNAME} ${HOSTNAME} ${PASSWORD} ${SCRIPT}

如果这是将所有文件gateway_data复制到本地PC的正确方法,我需要更正,但这不是当前的问题。

脚本一直要求输入密码,第三次尝试停止时使用(公钥,密码)

rema@meteo's password: 

Permission denied, please try again.
rema@meteo's password: 

Permission denied, please try again.

rema@meteo's password: 
Permission denied (publickey,password).

我的perl脚本

#!/usr/bin/perl -w
  use  Net::FTP;

  use strict;
  use warnings;

  use POSIX qw{strftime};
  use File::Path;
  use File::Copy;
  my $debug = 0;

  my $User = 'rema';
  my $Pass = 'rema';
  my $host = 'aa.bb.ccc.ddd';

  my $remote_basedir = '/';
  my $local_basedir = '../Data';
  my $remote_datadir ='data';

  my $yr = strftime "%Y", localtime();
  my $hr = strftime "%H", localtime();
  my $dat = strftime "%Y%m%d", localtime();

  my $localdir= "$local_basedir/$dat$hr";
   if(! -d $localdir) {
    print "mkpath $localdir\n" if $debug;
    mkpath ($localdir) or die "mkpath '$localdir' failed: $! ($^E)";
}

# Setup to do the ftp
  print "Connecting to $host ...\n";
  my $ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
  $ftp->setcwd($remote_datadir) or die "unable to change cwd: " . $ftp->error;

# retrieve data
  print "Copying data\n";
  $ftp->cwd($remote_datadir);

  print "Retrieving files from $remote_datadir to $localdir\n";
  my @files = $ftp->ls;
  foreach my $file (@files) {
    next if -d $file;
    next unless $file =~ /^gateway_data/;
    print $file;

    print "Getting $file\n" if $debug;
    $ftp->get($file) or warn "Failed '$file': $! ($^E)";
    }

  $ftp->close;
  print "copying ends\n";
  exit 0;

这使得" Connection拒绝于./AWS_ftptransf_rema.pl第44行。"

此脚本的副本放在远程计算机上以将文件发送到本地计算机。该脚本不会给出任何错误。它实际上列出了要复制的文件但什么也没做。这是连接后第三个脚本的代码片段

  opendir(DIR, './');
  my @files=readdir(DIR);
  foreach my $file (@files) {
    next if -d $file;
    next unless $file =~ /^gateway_data/;
    $ftp->put($file) or warn "Failed '$file': $! ($^E)";
#    $ftp->send($file) or warn "Failed '$file': $! ($^E)";
}

put和send都做同样的事情,即notihng 将不胜感激。

2 个答案:

答案 0 :(得分:1)

Connection refused不是perl错误消息,它是操作系统错误消息。从字面上看,没有任何内容可以监听您尝试连接的端口。

我认为您的问题的核心可能是您尝试使用一个脚本和另一个脚本进行ssh。那是行不通的。

我可以建议而不是编写脚本你可能想看看rsync这是一个用于在两个不同系统之间同步目录的系统吗?

除此之外:

  • 您的第一个问题是ssh不接受内联密码。您需要将您的ssh公钥/私钥auth排序为执行此操作。

答案 1 :(得分:-1)

连接被拒绝:基础内核抛出了多数民众赞成。原因之一可能是防火墙可能阻止了传入连接。输入的默认策略可能已设置为下降。由于ssh使用端口22,因此您需要使用以下命令显式打开端口

ufw允许22 / tcp

Ufw是简单的防火墙。

即使防火墙允许将流量分配给特定端口,您也需要在该端口上运行服务。 例如说 您已使用ufw allow 7777 / tcp打开了端口7777,然后使用 echo> /dev/tcp/127.0.0.1/7777,您将拒绝bash连接。 它实际上无法将数据包发送到您自己的回送接口。 但是echo> /dev/tcp/www.google.com/80可以工作。这是因为端口80后面有服务在运行。 在上述情况下,即使您告诉防火墙接受传入连接,端口7777上也没有运行任何服务。 因此,您可以运行诸如netcat之类的服务,或者就我而言,我编写了一个python代码来接受与端口7777的连接。 我也曾尝试用C语言编程。您所需的一切都是套接字编程。在您的情况下,可能是珍珠脚本。