0

我需要从作为 FTP 服务器的服务器 B 到作为 mysql 服务器的服务器 A(从服务器 A)检索 *.zip 文件的列表。我无法在没有密码的情况下使用 PHP 或 KeyGen 进行 SSH。我能做的事情非常有限。我开始尝试创建一个 Perl 脚本以允许 ssh 无需密码登录,但依赖项不断增加,网络无法连接到 Internet 进行更新,我无法安装在 mysql 或 ftp 上的默认文件夹中一旦我离开我的 ~ 主目录,服务器由于缺乏权限。

以下 bash 脚本完全符合我的要求,但是我无法在生产中使用它,因为我无法生成允许 ssh 没有密码的 ssh-rsa/dsa-auth 密钥。对此事的任何想法将不胜感激。

`##Check tmp for previous listing

   fileExists=$(ls /tmp | grep file | wc -l);

 ## File should not exist--- Just incase we will check and remove it 
   if [ $fileExists = "1" ]; then

      rm /tmp/File.tmp

   fi

   ssh usr@100.0.0.0 ls | grep .zip >> /tmp/File.tmp

   echo "File list recieved sucessfully $DATE" >> ./logs/fileList.log

提前感谢您能给我的任何指导。

4

3 回答 3

2

我知道这个答案可能不是你想要的,但我没有看到除了使用Net::SSH::Expectperl 之外的任何其他方法。我发现您可能已经尝试过那个。如果您整理了依赖项,这应该可以帮助您开始:

免责声明:未经测试,但重写了我为其他一些东西所拥有的一些功能代码

#!/usr/bin/perl

use warnings;
use strict;
use Net::SSH::Expect;


# Remove that file you didn't want in /tmp
if (-e '/tmp/File.tmp') { unlink('/tmp/File.tmp') }

# These should be obvious
my $username = 'bob';
my $password = 'bobsecretpassword';
my $targethosts = '100.0.0.0';

print "Trying $host... ";
my $ssh = Net::SSH::Expect->new(
  host      => $host,
  user      => $username,
  password  => $password,
) or die "Couldn't create SSH client\n";

$ssh->run_ssh() or die "Couldn't run SSH client\n";

my $output = $ssh->exec("ls *.zip");

open LOG,">>./logs/fileList.log"

my $timestamp = time();    # !!!! You probably want a better sollution for a timestamp than this
print LOG "$timestamp\tFile list received OK\n";

# Cleanup time... not a whole lot to do, tho
$ssh->close();
close LOG;

__END__

至于依赖问题,恐怕除了希望 cpan 为你解决它之外,我无能为力,因为这通常是它为我做的:cpan -i Net::SSH::Expect

在(希望)为您的用户安装模块之后,您可能需要告诉 perl 将您的个人模块目录添加到 @INC,但这超出了本文的范围(无论如何,google 应该花费太长时间)。

或者,贿赂系统管理员并让他/她在系统范围内安装它。

于 2012-11-09T21:02:33.567 回答
2

lftp如果您对进程列表中显示的用户名和密码不敏感,可以快速执行此操作

lftp -u username,password sftp://server -e "ls"

它还可以从文件运行一系列命令(使用 -f 开关),因此不会显示用户名和密码。它应该出现在大多数 linux 机器上。

于 2012-11-09T21:48:07.187 回答
0
#!/usr/bin/perl

use strict;
use warnings;
use Net::SFTP::Foreign;

my $sftp = Net::SFTP::Foreign->new(host => '...', user => '...', password => '...');
$sftp->setcwd('...');
$sftp->mget('*.zip');
于 2012-11-09T22:55:12.047 回答