我有一个简单的自动化过程写了需要通过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