我正在编写一个需要使用scp在计算机之间传输文件的Perl脚本。我知道公钥认证,但我需要脚本完全自动化,因此在脚本运行之前我无法访问机器来设置密钥。
有没有办法将密码从Perl脚本传递给scp或从perl脚本中设置密钥?
此脚本将作为构建脚本的一部分运行,该脚本还会重新映像运行脚本所需的硬盘驱动器。因此,每次构建项目时,我都无法在那里设置密钥。
答案 0 :(得分:3)
您可以使用Net::SSH::Perl。以下是您可以使用的示例代码。
#!/usr/bin/perl -w
use strict;
use Net::SSH::Perl
my $cmd = 'command';
my $ssh = Net::SSH::Perl->new("hostname", debug=>0);
$ssh->login("username","password");
my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd");
print $stdout;
此代码将在远程计算机上运行给定的“命令”,并在本地系统上为您提供输出。因此,代替scp,您可以将此脚本与命令'cat'一起使用来捕获本地系统上'cat filename'的输出,并将输出重定向到本地系统上的文件中。
希望这有帮助。
答案 1 :(得分:2)
使用ssh-agent。如果你使用Gnome,Gnome Keyring SSH Agent就很棒了。
答案 2 :(得分:1)
您可以使用Perl Expect模块,请参阅an example at Well House consultants' forum。
其文档有telnet example,可以轻松更改为SSH。
Net::SSH::Expect是另一个Perl模块,可以完全按照您的意愿执行。不过我以前没用过这个。
答案 3 :(得分:0)
只需创建没有密码的密钥。
答案 4 :(得分:0)
您可以使用SSH-Key(无密码)。
答案 5 :(得分:0)
#!/usr/bin/perl -w
######################################################
# #
# #
# Script to send files to server #
# Author: Jurison Murati #
# #
######################################################
use strict;
use Net::SCP::Expect;
use File::Copy;
use IO::Compress::Gzip qw(gzip $GzipError);
my $host = "192.168.0.1";
my $user = "user";
my $pwd = "password";
my $RemoteDir = </nodes>;
my $file;
my $displaydate= `date +'%Y%m%d%H%M%S'`;
print "Filloi dergimi date $displaydate\n";
my $scp = Net::SCP::Expect->new(host=>$host,user=>$user,password=>$pwd,recursive=>1);
my $dir = '/arch';
opendir(DIR, $dir) or die $!;
while (my $file = readdir(DIR)) {
next if ($file =~ m/^\./);
$scp->scp("$dir/$file","$RemoteDir") or die $scp->{errstr};
print "file $dir/$file moved on date $displaydate\n";
}
exit 0;