2

我编写了两个批处理文件——一个用于启动 Pageant 并加载我的密钥,另一个用于将一些文件 ssh 到远程服务器上。单独地,脚本完美地工作。我试图将它们组合成一个批处理文件,但我无法让它工作。

这里是脚本 - 每个只有一行,真的。

要启动 Pageant 并加载密钥:

start E:\PuTTY\pageant.exe E:\Keys\priv.ppk

exit

要使用 pscp:

pscp F:\website\foobar\src\* foo@178.128.10.35:/var/www/html

问题是第一个脚本启动了密码提示。如果我完成这个然后启动下一个脚本,一切都会完美运行。但是我一直无法将这两个组合成一个脚本,第二个命令在第一个命令的提示完成后运行。我将如何创建一个这样做的批处理文件?

4

2 回答 2

4

你很难在批处理文件中解决这个问题。Pageant 是 GUI 应用程序。它几乎无法以某种方式向批处理文件发出信号,表明它已完成加载密钥。

出于这个原因,Pageant 有-cswitch,这使得它在加载键后运行指定的程序/批处理文件:

您可以安排 Pageant 在其自身初始化并加载其命令行上指定的任何键后启动另一个程序。该程序(可能是 PuTTY,或使用 Plink 的 WinCVS 或其他程序)将能够使用 Pageant 已加载的密钥。

您可以通过指定-c命令后跟的选项来执行此操作,如下所示:

C:\PuTTY\pageant.exe d:\main.ppk -c C:\PuTTY\putty.exe

所以这应该是你想要的:

start E:\PuTTY\pageant.exe E:\Keys\priv.ppk -c C:\path\your_scp_batch.bat
于 2018-09-24T06:52:58.477 回答
1

如果另一个实例已经在运行,您可以利用 pageant 的行为方式。这样,您可以将密钥加载到选美比赛中,然后在单个脚本中继续使用它。

START pageant.exe
TIMEOUT 1
pageant.exe E:\Keys\priv.ppk

:: Do stuff here.

TASKKILL /im pageant.exe

以下是它的工作原理:

  • START pageant.exe在后台开始选美。
  • TIMEOUT 1在执行下一行之前暂停脚本一秒钟以确保选美正在运行。
  • pageant.exe E:\Keys\priv.ppk再次启动选美并告诉它加载密钥。由于另一个 pageant 实例已经在运行,因此该实例在加载密钥后终止,使脚本仅在那时继续。
  • TASKKILL /im pageant.exe杀死选美使钥匙不能再使用。
于 2021-12-22T17:45:21.230 回答