我有一个Windows服务,它将使用plink.exe
进行SSH连接,我发现Plink找不到正在运行的Pageant。
这是我到目前为止所做的步骤。
注意:如果我将Windows服务作为该用户的控制台应用程序运行,一切正常。
答案 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