使用ssh时如何自动输入密码?

时间:2013-11-13 15:15:49

标签: perl ssh automation

如何在Perl中自动输入密码?

代码:

my $makecmd .=  system "ssh remotehost;";
system( "$makecmd" );

输出:

Enter passphrase for key '~/.ssh/id_rsa':

3 个答案:

答案 0 :(得分:7)

您可以使用SSH代理将密码存储在内存中。虽然这种方法比使用未加密的密钥更麻烦,但稍微更安全。在第11.1节Unattended SSH: Batch or cron Jobs下的O'Reilly书籍 SSH,安全外壳:权威指南中,对这两种方法进行了很好的比较。

使用未加密的密钥

使用未加密(无密码)密钥的一大优势是易于配置。要使用空密码短语生成密钥或在现有密钥上将密码短语设置为空,请运行

ssh-keygen -f ~/.ssh/id_rsa -p

就是这样,不再需要配置了。这样做的一大缺点是您的私钥现在以纯文本形式存在于您的文件系统中。

使用代理

SSH代理的配置过程涉及更多,取决于您使用的代理。 O'Reilly一书的第6.3章SSH Agents和IBM developerWorks文章Getting started with SSH security and configuration描述了如何配置OpenSSH附带的默认代理ssh-agentThe archlinux wiki page on SSH Keys还描述了其他代理,如GNOME Keyring和pam_ssh。

让我们看一下ssh-agent的设置过程。运行命令时

ssh-agent

它不仅启动代理,而且还吐出shell命令来设置一些环境变量。在Bourne样式的shell中,输出如下所示:

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-barrett/ssh-3654-agent; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3655; export SSH_AGENT_PID;
echo Agent pid 3655;

这些环境变量告诉shell如何访问代理。使用代理的任何脚本都需要设置这些环境变量。您可以将shell命令保存到文件中,以便以后在首次调用代理时使用:

$ ssh-agent | head -2 > ~/agent-info

接下来,您需要将私钥添加到代理:

$ source ~/agent-info
$ ssh-add ~/.ssh/id_rsa
Need passphrase for ~/.ssh/id_rsa
Enter passphrase: **************

最后,您需要确保在调用Perl脚本时设置适当的环境变量。一种方法是编写包装脚本:

#!/bin/sh
source ~/agent-info
/path/to/perl/script "$@"

只要代理程序正在运行,您的脚本就可以使用私钥而无需输入密码。请注意,如果只有一个uid将使用代理,那么最简单的方法是在该uid下启动代理:

$ su <script_user> ssh-agent ...

使用代理的一个缺点是您必须手动重启代理并在服务器重启时重新输入密码。这是您使用加密密钥获得的(可以说是边际的)额外安全性所支付的价格。

答案 1 :(得分:0)

Net::OpenSSH支持密码短语:

use Net::OpenSSH;
my $ssh = Net::OpenSSH->new($host, passphrase => $passphrase);
$ssh->system($makecmd);

在任何情况下,包括脚本中的密码短语都会破坏其目的,主要是。

答案 2 :(得分:-2)

您可以使用Expect来执行此操作。在此页面中:http://metacpan.org/pod/Net::SSH::Expect

使用passpharse:

    # Starting ssh without password
    # 1) run the constructor
    my $ssh = Net::SSH::Expect->new (
        host => "myserver.com", 
        user => 'bnegrao', 
        raw_pty => 1
    );
    # 2) now start the ssh process
    $ssh->run_ssh() or die "SSH process couldn't start: $!";

使用密码:

    use Net::SSH::Expect; 
    # Making an ssh connection with user-password authentication
    # 1) construct the object
    my $ssh = Net::SSH::Expect->new (
        host => "myserver.com", 
        password=> 'pass87word', 
        user => 'bnegrao', 
        raw_pty => 1
    );

    # 2) logon to the SSH server using those credentials.
    # test the login output to make sure we had success
    my $login_output = $ssh->login();
    if ($login_output !~ /Welcome/) {
        die "Login has failed. Login output was $login_output";
    }