用Bitvise SSH Client在两台服务器之间免密钥加密传输文件

从上手SSH客户端以来,几乎一直使用Bitvise家的客户端,觉得它易上手且稳定。昨天下载了一份NetSarang Computer, Inc提供的免费版Xshell,意外的发现它支持在两台服务器间免密传输文件,不禁大为惊喜,这可是我一直以来都想要的功能。简单的说,这类SSH客户端都支持免密登录服务器,也就是不使用密码,仅通过密钥认证方式登录进服务器,但是如果要把一台服务器的文件传输到另一台(此处不涉及HTTP、FTP等方式,只说SCP),一般只有两个办法,即先下载到本地再上传,或直接从一台服务器拷贝到另一台。前一种办法只适合较小的文件,如果动辄上G甚至上T的容量,就不太现实。后一种办法在服务器带宽有保证的情况下可行的多,但需要解决密钥的问题,也就是要把本来保存在本机的密钥上传到其中一台服务器以便另一台存有匹配公钥的服务器进行认证,但这样一来,密钥相对的就不“密”了。Xshell内置了一个叫Xagent的工具很好的解决了这个问题,把服务器间传输文件过程中所需要的密钥认证转移到了本机的Xagent上来完成。

用Bitvise SSH Client久了,有些难舍,也不相信这个历史悠久的客户端会没有考虑过免密对传的需求,于是探究了一圈互联网,亲自尝试过后,把解决方案奉上。

理论上,SSH客户端都有这样的功能[1],Xshell和PuTTY把免密对传过程中的认证环节交给自己的同门来做,而Bitvise SSH Client则只提供了这样一个功能,认证环节交由PuTTY门下的Pageant或Cygwin-based OpenSSH的认证代理工具。考虑到PuTTY的用户面比较广,这里就以Pageant为例来说明[2]

首先到PuTTY官方网站下载Pageant保存至硬盘相应目录,启动后导入Bitvise SSH Client中对应的服务器原密钥[3],再将Bitvise SSH中服务器登录界面的密钥设置为PuTTY格式,这样Bitvise SSH客户端便可用PuTTY格式的密钥来完成服务器登录过程中的用户认证。

第二步,到Bitvise SSH的Terminal标签项下勾选中Enable authentication agent forwarding,这样服务器端对密钥的认证就可通过本机的Pageant转发认证来完成。[4]

第三步,通过Bitvise SSH以免密方式登录服务器,然后执行scp命令从远程服务器(IP为12.34.56.78,端口号为22222,用户账号为root)将/var/www/html/download目录下的文件复制到本服务器的/home/soft/目录下

1
scp -r -P 22222 [email protected]:/var/www/html/download /home/soft/

命令执行过程中,服务器端一般会提示用户进行确认,以完成两台服务器之间的“互信”沟通,当然,这是籍由本地电脑中运行着的Pageant服务来完成的,因此在后续服务器对拷文件的操作之前,记得要先打开Pageant服务。


  1. MobaXterm到11.1版为止,我还没有发现这样的功能 ↩︎

  2. 因我用的Windows 10 64位版,因此下载了64-bit的pageant.exe ↩︎

  3. Bitvise的密钥格式与PuTTY格式不同,需要一次导出为PuTTY格式的操作才能被Pageant识别 ↩︎

  4. https://www.bitvise.com/ssh-client-putty-openssh-auth-agents ↩︎