【问题标题】:How can I transfer a file using scp without a password from a Perl script?如何使用 scp 传输文件而无需 Perl 脚本中的密码?
【发布时间】:2011-04-19 00:01:26
【问题描述】:

我正在编写一个需要使用 scp 在计算机之间传输文件的 Perl 脚本。我知道公钥身份验证,但我需要脚本完全自动化,所以在脚本运行之前我无法访问机器来设置密钥。

有没有办法从 Perl 脚本将密码传递给 scp 或从 perl 脚本中设置密钥?

此脚本将作为构建脚本的一部分运行,该脚本还会重新映像运行脚本所需的硬盘驱动器。所以我不能在每次构建项目时都在那里设置密钥。

【问题讨论】:

  • 所以你不能提前在机器上设置authorized_keys文件但是你可以为每台机器设置相同的密码?不管你怎么做,这都是个坏主意。密钥是您尝试做的唯一正确答案。
  • 您可以自动设置授权密钥。尽管这可能意味着您必须在执行此操作的脚本中对密码进行硬编码。
  • 为什么不让authorized_keys成为原图的一部分?
  • 构建将在不同的硬件上完成,我将文件传输到的机器的硬盘驱动器不会被重新映像。

标签: perl passwords scp


【解决方案1】:

只需创建没有密码的密钥。

【讨论】:

    【解决方案2】:

    您可以使用 Perl Expect 模块,请参阅 an example at Well House consultants' forum

    它的文档有一个telnet example,可以很容易地更改为 SSH。

    Net::SSH::Expect 是另一个 Perl 模块,可以完全满足您的需求。不过我之前没用过这个。

    【讨论】:

      【解决方案3】:

      使用 ssh-agent。如果你使用 Gnome,Gnome Keyring SSH Agent 非常棒。

      【讨论】:

        【解决方案4】:

        您可以使用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 文件名”的输出,并将输出重定向到本地系统上的文件中。

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          您可以使用SSH-Key(无需密码)。

          【讨论】:

            【解决方案6】:
            #!/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;
            

            【讨论】:

            • 写一个简短的描述你所做的事情总是好的,这样更容易理解你的代码。
            猜你喜欢
            • 2013-10-12
            • 2010-11-23
            • 2018-09-26
            • 2013-09-22
            • 1970-01-01
            • 2010-11-24
            • 2017-03-14
            • 2011-02-23
            • 2010-11-30
            相关资源
            最近更新 更多