问题的发生大概是这样的:
配置搭建本博客所在的虚拟主机的SSH时,发生了一件比较尴尬的事情。
在新建主机的时候仅仅上传了本人在实验室的Ubuntu PC的SSH公钥,而没有上传在宿舍的Windows PC的SSH公钥。所以在宿舍无法远程登录,而由于Digital Ocean蛋疼的设置,在主机新建之后,无法通过监控的页面添加新的SSH公钥。不过还好,Digital Ocean的Support页面给出了如何添加SSH的教程,然而,仔细阅读之后发现,这完全是在创建主机时完成的,但是Support还是给出了链接如何在创建主机之后添加SSH公钥,并且链接到如何使用Putty远程登录主机。
最头疼的就在这里,试图用Putty远程登录添加SSH时发现登录的验证方式只能用SSH进行验证,于是毫无意外的成了一个类似于WinRar.rar的死循环。
(补充说明,后来才知道在/etc/ssh/sshd_config
文件中,PasswordAuthentication no
被设置了)
当然,这个问题自然不是这么解决的,如果是这么解决的不足以用一篇博客的篇幅来记述。本人于是在Digital Ocean的主机管理页面,打开了网页版的Console,这个Console是用Canvas构成的,大概直接传输的是Console的画面,加上服务器的位置是在国外,所以一直在以极其高的延时在Console中操作。每当Console出现大量刷新时,画面便会卡很久。我小心翼翼的打开了位于 ~/.ssh
目录下的公钥文件,Ubuntu主机的公钥肚子静静地躺在文件中,当我右键准备复制本地PuttyGen产生的公钥时,(补充说明,Putty似乎只支持自己生成的非对称加密的私钥,因为其后缀是.pkk
,无法使用大部分操作系统默认的无后缀名的那种。)发现并没有让我粘贴的选项,而是出现的是右键浏览器空白面经常出现的内容。摆在我面前的似乎只有一个方案了,那就是把长达256位的公钥敲进去。
当我敲到1/3的时候,发现我真的不能这么干,因为我还要检查几遍对于我来说是毫无意义乱码的公钥是否输入正确,那么小的Console页面估计会让我把眼睛瞅瞎了,于是还是决定找一找有没有其他的往终端中粘贴的解决方案,终于在Digital Ocean的Community中找到了这个解决方案:
右键浏览器检查元素,在Console中输入:
var sendString = (function(rfb, force, sendDelay) { sendDelay = sendDelay || 25; var _q = []; var _qStart = function() { var chr = _q.shift(); if (chr) { rfb.sendKey(chr); setTimeout(_qStart, sendDelay); } }; var _qStop = function() { _q.length = 0; }; var fn = function sendString(str) { _qStop(); str = str || ''; var chr; for (var i=0; i < str.length; i++) { chr = str[i].charCodeAt(); _q.push(chr); } _qStart(); }; if (rfb.sendString && true !== force) { console.warn('rfb.sendString not installed because it already exists. Use force if you\'d like'); } else { rfb.sendString = fn; } return fn; })(rfb);
JavaScript学的不是很好,这段代码大致就是定义了一个往浏览器中发送字符串的函数,也就是帮你完成了输入某个特定的字符串的功能。使用时只用继续在检查元素的Console中输入:sendString('The String You Wanna Paste')
,然后就实现了向远程终端中粘贴的功能。不过值得注意的是,似乎公钥里的所有的”+”都会自动转换成”=”(没有深究为什么),因为这个还浪费了很多时间。不过还好,有了这个复制方法,Xftp与Putty都顺利的连接上了远程主机,可以远程操作系统的文件目录与Console,操控变得十分便利。