3

好的,这就是我想要做的。我正在编写一个程序,它将从我的手机(通过 ssh)中检索一个 keepass 数据库,并在其中搜索我感兴趣的任何密码。我想为 keepass 数据库使用与 ssh 密钥相同的密码我检索 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);
}
4

1 回答 1

0

阅读 ssh-add 手册页后,我发现分离终端有效:

system("/usr/bin/ssh-add /home/user/.ssh/keepass-retriever < /dev/null &>/dev/null");
于 2013-01-02T08:39:17.757 回答