在hudson中运行脚本时,Putty不会缓存访问服务器的密钥

时间:2012-11-28 06:19:31

标签: hudson key putty host

我有一个简单的自动化过程,需要通过SSH将一些文件从linux服务器复制到Windows。这可以使用putty来完成。

SSH作为协议的一部分,验证主机的身份,如果不知道是否正确,将提示您接受主机的身份。当我用putty手动连接linux服务器时,它不会提示任何信息来接受主机的身份。但是,一旦我将这个自动化过程放入Hudson作为计划工作。确切的信息是:

  

服务器的主机密钥未缓存在注册表中。你没有   保证服务器是您认为的计算机。该   服务器的rsa2密钥指纹是:ssh-rsa 1024   cc:78:13:a3:68:a6:59:7e:b8:23:2d:13:3e:66:9b:b9如果你相信这个   主机,输入“y”将密钥添加到PuTTY的缓存并继续   连接。如果你想只进行一次连接,没有   将密钥添加到缓存中,输入“n”。如果你不相信这个主人,   按Return键放弃连接。将密钥存储在缓存中? (Y / N)   连接被遗弃。

通常你会在这里点击“Y”,假设主机密钥正确,以便在将来的连接中存储它。存储在HKEY_CURRENT_USER \ Software \ SimonTatham \ Putty \ SshHostKeys下的注册表中

但遗憾的是,在Hudson中运行的自动化进程无法通过点击“Y”进行交互,以将主机密钥存储在putty缓存中。而且我也无法通过在dos命令下运行自动化过程来重现该问题。

有谁知道如何解决问题?

10 个答案:

答案 0 :(得分:37)

echo y | pscp -i /path/to/key/file user@remote:/tmp/file  .
echo y | plink -i /path/to/key/file scripts.sh

它会在第一时间将主机密钥指纹存储到以下位置,并且下次将忽略“你”

HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys

答案 1 :(得分:17)

对于内部服务器,盲目echo y | ...技巧可能足够(而且非常简单)。

但是,对于通过互联网访问的外部服务器,接受服务器主机密钥一次而不是每次盲目接受都要安全得多。


创建一个可以在客户端计算机上运行的.reg文件。

  • 从任何计算机plink ...
  • 以交互方式进行连接
  • 验证并接受主机密钥
  • 打开regedit
  • 导航至HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
  • 右键单击该条目(名称将为rsa2@<port>:<address>
  • 导出到.reg文件

在客户端计算机上缓存主机密钥

  • 在将连接到该服务器的任何客户端计算机上运行.reg文件
  • 请务必使用将运行plink的用户帐户登录(例如,如果是服务帐户)

答案 2 :(得分:15)

使用使用本地系统帐户的批处理调度程序时,我也遇到此问题。使用此帐户,您无法登录以接受主机密钥或手动设置HKEY_CURRENT_USER值。 我发现创建了以下密钥:

HKEY_USERS\.DEFAULT\Software\SimonTatham\PuTTY\SshHostkeys

并在此处添加主机字符串值,适用于本地系统帐户。

答案 3 :(得分:8)

截至2014年9月9日,相应版本的plink(使用plink 0.66测试),您可以使用-hostkey选项,如下所示:

http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/accept-host-keys.html

使用原始问题中的密钥:

plink -hostkey cc:78:13:a3:68:a6:59:7e:b8:23:2d:13:3e:66:9b:b9 user@remote 

我在脚本中成功使用了“-hostkey”来解决初始主机密钥提示问题。

“ - hostkey”也被记录为与pscp一起使用(版本0.66)。

请注意,如果更改主机或sshd服务器重新计算密钥,则必须更改主机密钥。

答案 4 :(得分:6)

echo y | plink -ssh <username@remotemachine> -pw <password> exit
plink -ssh <username@remotemachine> -pw <password> [yourcommand]

说明:使用echo to pipe,用户输入所选命令的“y”,然后退出。 然后,下一个语句将再次调用plink可执行文件来运行命令。

答案 5 :(得分:4)

我在使用Bazaar时出现此问题,并手动将我的ssh客户端设置为putty而不是内置的paramiko,我得到了完全相同的问题,它试图说密钥是不在已知的主机中#39;并询问我是否应该验证它,但由于它是由不同的程序运行而不是在正常的终端,它只是立即退出。

如果可以的话,只需运行putty并手动连接到服务器以使其在注册表中保存ssh公钥,这样当自动程序尝试连接时,它将不会显示y / n选项

或者你可以使用我编写的一个小python3脚本来转换两个已知的主机&#39; putty和openssh使用的格式:https://github.com/mgrandi/openssh-putty-knownhost-converter

`

答案 6 :(得分:1)

通过代码解决方案:编译putty / plink以自动接受和存储ssh密钥

系统会提示您将SSH主机密钥存储在缓存中,因为用户帐户执行plink没有主机在注册表中,它会挂起,因为它等待回复(是/否..)。
如果你想通过代码解决这个问题,请获取putty源代码,进行一些更改,编译并使用新的plink二进制文件 - 一个存储ssh主机密钥而没有提示的文件。
怎么做 ?对于Windows,我执行以下操作:

  • https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html下载最新的putty源代码 (查找“源代码”部分并下载&#34; Windows源存档&#34;)
    注意:要使用Visual Studio打开putty源代码,您必须下载发布版本,如果您签出特定提交(或头),Visual Studio解决方案文件将因为它们是在构建期间创建的,所以不存在 取自:Cannot compile PuTTY, Plink or Pscp on Windows due to missing Windows/MSVC subdirectory

  • 需要更新源代码,我们要更改的内容位于&#34; wincons.c&#34;中的函数verify_ssh_host_key(..),我们要注释掉提示的代码部分对于是/否,只需存储密钥,开始注释掉提示代码:

    /*hin = GetStdHandle(STD_INPUT_HANDLE);
    GetConsoleMode(hin, &savemode);
    SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT |
             ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT));
    ReadFile(hin, line, sizeof(line) - 1, &i, NULL);
    SetConsoleMode(hin, savemode);
    
    if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') {
    if (line[0] == 'y' || line[0] == 'Y')
    store_host_key(host, port, keytype, keystr);
    return 1;
    } else {
      fprintf(stderr, abandoned);
      return 0;
    }*/  
    

继续添加以下行(负责存储主机密钥的代码):

store_host_key(host, port, keytype, keystr);
return 1;

编译解决方案并使用plink / pscp ..你很高兴没有提示,它接受ssh主机密钥然后存储在注册表中。

答案 7 :(得分:0)

从Windows PowerShell以管理员模式运行

pscp -i /path/to/private_key source_file user@ip:/home/location

答案 8 :(得分:0)

我的回答与评论中所说的 @Clay 的第一个答案非常相似,我会放过它,因为它指的是一个特定的案例 (GIT),而且它有点短。

当使用 GIT_SSH="path_to_plink.exe" 将 Putty 用作 SSH 客户端时,必须执行一次验证服务器的步骤,否则当 Putty 要求交互式“y”输入时您会卡住:

  1. 从命令行运行 plink:plink <serverName>

  2. 验证第一个提示将密钥存储在缓存中

  3. 使用 Ctrl+c 退出命令

现在您运行命令的客户端将不再提示进行指纹验证。

Putty 使用注册表而不是文件 <...>\.ssh\known_hosts,因此您可以通过导出/导入注册表项 Computer\HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys 来配置另一个主机。 由于此密钥引用当前用户,因此您需要在以将运行 GIT 命令的用户身份登录时导入。

答案 9 :(得分:-1)

它与

正常运行
pscp file user@dest: 

但是我得到了同样的错误。所以我做到了:

pscp -l USERNAME -pw PASSWORD FILE 10.1.1.1:

那帮了我大忙。