我有一个简单的自动化过程,需要通过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命令下运行自动化过程来重现该问题。
有谁知道如何解决问题?
答案 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>
)在客户端计算机上缓存主机密钥
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”输入时您会卡住:
从命令行运行 plink:plink <serverName>
验证第一个提示将密钥存储在缓存中
使用 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:
那帮了我大忙。