从perl中向SSH-Agent添加密钥

时间:2013-01-01 06:40:14

标签: perl ssh ssh-keys

好的,所以这就是我要做的。我正在编写一个程序,它将从我的手机中检索一个keepass数据库(通过ssh)并在其中搜索我感兴趣的任何密码。我想使用与ssh-key相同的keepass数据库密码我已经检索了keepass数据库,但我不想输入密码两次。所以。这就是我的想法:我会编写一个perl脚本,要求输入一次密码(通过ssh-askpass)(这是我在底部的readpass函数。它运行正常。)我可以通过该键读取keepass等,一切都很好。

但是,当我尝试ssh到手机时,我似乎无法弄清楚如何添加ssh-add而不会提示我输入密钥

我尝试制作一个简单地回显环境变量的shell脚本,然后将SSH_ASKPASS设置为该脚本,(并在环境变量中设置密码并系统化......就像这样:

my $key = readpass();
$ENV{"SSH_ASKPASS_ENV"} = $key;
$ENV{"SSH_ASKPASS"} = "/home/user/bin/ssh-askpass-env";
system("/usr/bin/ssh-add /home/user/.ssh/keepass-retriever");

ssh-askpass-env只有:

#! /bin/sh
echo "${SSH_ASKPASS_ENV}"

但是,似乎没有这样做,它仍然要求我输入密码。我可以验证是否正在调用ssh-askpass-env ,并且 获取密码。

我想我的问题是:如何使用预先指定的密码从perl中为ssh-agent添加密钥? (因为我刚从下面的readpass()读取密码)

谢谢!

sub readpass() {
    my $passwd = undef;
    if (defined($ENV{"DISPLAY"})) {
        if (open(PASSWD, "/usr/bin/ssh-askpass 'KeePass' |")) {
            chomp($passwd = <PASSWD>);
            close(PASSWD);
        }
    }
    else {
        ReadMode('noecho');
        printf("Enter keepass password: ");
        $passwd = ReadLine(0);
        chomp($passwd);
        ReadMode('normal');
    }
    return($passwd);
}

1 个答案:

答案 0 :(得分:0)

在阅读ssh-add手册页后,我发现终端工作正在分离:

system("/usr/bin/ssh-add /home/user/.ssh/keepass-retriever < /dev/null &>/dev/null");