来自Windows服务的Plink无法找到Pageant

时间:2012-08-02 10:42:34

标签: windows-services ssh plink pageant

我有一个Windows服务,它将使用plink.exe进行SSH连接,我发现Plink找不到正在运行的Pageant。

这是我到目前为止所做的步骤。

  1. 安装Windows服务以特定用户身份运行
  2. 在启动Windows服务之前,我以该用户身份登录并使用PuTTY生成的密钥启动Pageant。
  3. 然后我启动了Windows服务(但由于Plink无法找到Pageant和服务器回复没有支持的身份验证方法,因此无法使其正常工作。)
  4. 注意:如果我将Windows服务作为该用户的控制台应用程序运行,一切正常。

3 个答案:

答案 0 :(得分:4)

PLink将在服务会话(Session \ 0)中运行,而Pageant在用户会话(Session \ 1)中运行。 Plink使用一些进程间通信,从您的问题看,它不能跨会话工作。很可能内部有MMF通信,没有前缀就创建了对象,即它们变为仅会话(非全局)。您需要构建自定义版本的plink来解决问题。

答案 1 :(得分:2)

Pageant明确允许将密钥提供给仅在同一Windows会话中运行的应用程序(PuTTY,PSFTP,PSCP,WinSCP,FileZilla)。这显然是出于安全原因,不允许同一台机器上的不同用户劫持其他用户加载的私钥。即使为了方便(具有讽刺意味),也不要无意中使用其他用户的密钥(导致您的帐户因登录尝试无效而被锁定)。

另请注意,无论如何,Pageant并非用于自动化。对于自动化,使用-i命令行参数显式使用私钥 见https://the.earth.li/~sgtatham/putty/latest/htmldoc/Chapter3.html#using-cmdline-identity

这样的私钥必须是未加密的。请注意,如果有人获得对密钥的访问权限,则会带来安全风险。您应该考虑将对未受保护的私钥文件的访问限制为仅运行脚本的本地帐户(使用Windows file system permissions)。

答案 2 :(得分:1)

作为@Eugene point out,它是Session 0 Isolation

我设法通过不使用代理但直接将私钥和密码传递给plink.exe来解决问题。通过这样做,我可以在不使用pageant的情况下运行。

在没有座席的情况下启动plink.exe;

plink.exe -noagent -i private_key.ppk -pw mypassword -P 1234 user@host.com