在哈德森运行脚本时腻子不会缓存键来访问服务器(Putty won't cache the k

2019-07-04 04:42发布

我有一个简单的自动化过程写了需要通过SSH从Linux服务器的几个文件复制到Windows。 这可以使用腻子完成。

SSH,作为协议的一部分,验证主机的身份,如果不知道是正确的,将提示您接受主机的身份。 当我用手动连接腻子Linux服务器,它不会提示任何信息接收主机的身份。 但是,一旦我把这个自动化过程分成哈德森安排工作。 确切的消息是:

服务器的主机密钥未在注册表中缓存。 你有没有保证,该服务器是你认为它是计算机。 服务器的RSA2密钥指纹是:支持SSH-RSA 1024毫升:78:13:A3:68:A6:59:7E:B8:23:2D:13:3E:66:9下:B9如果您信任此主机,输入“ Y”的键添加到PuTTY的缓存并继续连接。 如果你想继续连接只有一次,不添加键到缓存中,输入“N”。 如果您不信任此主机,然后按回车键放弃的连接。 在高速缓存中存储的关键? (Y / N)连接抛弃。

通常你会打“Y”在这里,假设主机密钥是正确的,为了将其存储在未来连接。 这种存储进入下HKEY_CURRENT_USER \ SOFTWARE \ SimonTatham \腻子注册表\ SshHostKeys

但不幸的是,在哈德森运行自动化过程不能被打“Y”做互动,在腻子缓存存储的主机密钥。 而且我也无法重现该问题通过简单地运行DOS命令下的自动化过程。

有谁知道如何解决这个问题?

Answer 1:

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

它将存储主机密钥fingureprint以在第一时间之后的位置,并忽略“Y”下一次

HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys


Answer 2:

对于内部服务器,盲人echo y | ... echo y | ...招可能是适当的(和超级简单)。

然而,对于外部服务器通过互联网访问,它是更安全的接受服务器的主机密钥一次,而不是盲目地接受每一次。


创建一个可以在客户机(一个或多个)上运行一个.reg文件。

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

缓存客户端机器上的主机密钥(S)

  • 运行任何客户机上的.reg文件,将连接到该服务器
  • 确保使用将运行该用户帐户登录plink (即如果它是一个服务帐户)


Answer 3:

通过使用本地系统帐户批次调度时,我也有这个问题。 有了这个账号不能登录到接受主机密钥或手动设置HKEY_CURRENT_USER值。 我发现,在创建以下注册表项:

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

这里将主机添加字符串值就职于本地系统帐户。



Answer 4:

随着2014年9月9日与砰砰的相应版本的,你可以使用-hostkey选项,(与砰砰0.66测试)如下记载:

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)工作。

请注意,您必须改变hostkey如果更改主机或sshd服务器重新计算的关键。



Answer 5:

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

说明:使用回波到管中,用户输入“y”以所选择的命令,然后退出。 那么接下来的语句将调用砰砰执行第二次运行命令。



Answer 6:

使用时,我是有这个问题集市 ,和手动设置我的SSH客户端是腻子而不是内置的的paramiko,和我得到完全相同的问题,在这里想说的关键是不是在“已知主机”并询问是否我应该进行验证,但由于它由不同的程序中运行,而不是在普通的终端,它只是立即退出。

如果可以的话,只需要运行腻子连接到服务器手动把它保存SSH公共密钥在注册表中,所以当自动程序试图连接它不会与y / n选项来呈现。

或者你可以使用我写的两个“著名主持人”格式,油灰和OpenSSH使用之间进行转换小python3脚本: https://github.com/mgrandi/openssh-putty-knownhost-converter

`



Answer 7:

通过代码解决方案:编译腻子/砰砰自动接受和存储SSH密钥

系统将提示您SSH主机密钥存储在缓存中,由于用户账号执行砰砰不要在注册表中的主机,它挂起,因为它等待回复(是/否..)。
如果您想通过代码来解决这个问题,让腻子源代码,做一些修改,编译,并使用新的砰砰二进制 - 一个存储没有提示的ssh主机密钥。
怎么做 ? 对于Windows,我做到以下几点:

  • 从下载最新腻子源代码: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
    (查找“源代码”部分,下载“Windows源代码包”)
    注意 :要使用Visual Studio打开腻子的源代码,你必须下载一个发行版本 ,如果你签一个特定的提交(或头),将不存在的Visual Studio解决方案文件,因为它们是构建过程中创建的。
    来自无法编译腻子,或的Plink PSCP在Windows上,由于丢失的Windows / MSVC子目录

  • 源代码需要更新,我们想改变什么坐落在“wincons.c”功能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;

编译该解决方案,并采取砰砰/ PSCP ..你是好去不及时,它接受的ssh主机密钥,然后存储在注册表中。



Answer 8:

从Windows PowerShell中以管理员模式运行

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


Answer 9:

它一直在努力罚款

pscp file user@dest: 

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

pscp -l USERNAME -pw PASSWORD FILE 10.1.1.1:

而且奏效了我。



文章来源: Putty won't cache the keys to access a server when run script in hudson