3
use SVN::Client;
my $ctx = new SVN::Client(
      auth => [SVN::Client::get_simple_provider(),
      SVN::Client::get_simple_prompt_provider(\&simple_prompt,2),
      SVN::Client::get_username_provider()]
      );

$ctx->cat(\*STDOUT, 'http://mysvn.repo.com/www/xxx','HEAD');

sub simple_prompt {
  my $cred = shift;
  my $realm = shift;
  my $default_username = shift;
  my $may_save = shift;
  my $pool = shift;

  print "Enter authentication info for realm: $realm\n";
  print "Username: ";
  my $username = <>;
  chomp($username);
  $cred->username($username);
  print "Password: ";
  my $password = <>;
  chomp($password);
  $cred->password($password);
}

问题

首次登录后,SVN 正在缓存凭据,并且不会提示我再次输入身份验证。config我启用了&文件中的某些条目servers以禁用缓存。但它没有用。

还有一件事:
SVN::Client使用. 我不知道 perl 模块使用的是哪个 SVN。CPANsvn/apacheapt-get

我更改的配置是我稍后安装的 SVN。

有人可以让我知道如何解决这个问题吗?我希望 perl 脚本始终提示输入凭据。

4

1 回答 1

0

据此:_

为提示样式提供程序返回 svn_auth_provider_object_t 的函数采用对用于回调的 Perl 子例程的引用。这些子例程中的每一个接收的第一个参数是一个凭证对象。...这些函数和凭证对象总是有一个 may_save 成员,它指定是否将缓存身份验证数据。

所以,我想在你的回调的实现中你需要设置$may_save

$cred->may_save(0);

或使用此处描述的用户交互:

print(
        $may_save
            ? "(R)eject, accept (t)emporarily or accept (p)ermanently? "
            : "(R)eject or accept (t)emporarily? "
    );

    my $choice = lc(substr(<STDIN> || 'R', 0, 1));

    if ($choice eq 't') {
        $cred->may_save(0);
    }
    elsif ($may_save and $choice eq 'p') {
        $cred->may_save(1);
    }
于 2012-11-22T21:11:35.493 回答