28号的时候SSHChina又断了整整一天,无法,只好在网上找个临时的。翻了一下,发现Paying.org.ru还不错,只是会半个小时就修改密码并且断线一次。Bitvise Tunnelier蛮好用,但是每半个小时就打开浏览器再复制粘贴,也太折磨人了。
网上现成的脚本大多不是Windows里可以用的,而且也处理不了密码会变的问题,所以就自己写了个。这个脚本比较适用于频繁修改密码的SSH帐户,登陆信息固定那种还是用Bitvise Tunnelier吧。
话说,每次为了方便给别人用而逼不得已写VBScript或者JavaScript的时候我都在想,Windows要是内置一套Ruby该多好……
将以下内容保存为letsSSH.js,再去下一个Plink放到同一个目录,双击letsSSH.js即可。
function lets_ssh(ask_for_account) {
var fso = new ActiveXObject('Scripting.FileSystemObject');
var plink = fso.GetParentFolderName(WScript.ScriptFullName) + '\\plink.exe';
var sh = new ActiveXObject('WScript.Shell');
var ios;
var s, cmd, buf;
while (true) {
s = ask_for_account();
cmd = plink + ' -N -D 127.0.0.1:7070 -l ' + s[2] + ' -pw ' + s[3] + ' -P ' + s[1] + ' ' + s[0];
if (_debug) WScript.Echo(cmd);
ios = sh.exec(cmd);
buf = '';
while (true) {
try {
buf += ios.StdErr.read(1); // 写大了不成,会等读满N个字符才返回
if (/Store key in cache\? \(y\/n\)/.test(buf)) {
ios.StdIn.write("n\n");
}
} catch(e) {
break;
}
}
}
}
function bytes_to_str(data, charset) {
var stm = new ActiveXObject('ADODB.Stream');
stm.Type = 1;
stm.Open();
stm.Write(data);
stm.Position = 0;
stm.Type = 2;
stm.Charset = charset;
var s = stm.ReadText();
stm.close();
return s;
}
function get_account(url, args) {
var xhr = new ActiveXObject('Msxml2.XMLHTTP');
var s, html, r, re = / charset=([^"']+)[^"']?/i;
var n = 0;
while (n < 3) {
try {
xhr.open('GET', url, false);
xhr.send();
if (xhr.getResponseHeader('Content-Type').match(re)) {
html = xhr.responseText;
} else {
r = xhr.responseText.match(re);
if (r) {
html = bytes_to_str(xhr.responseBody, r[1]);
} else {
throw 'Unknow Content Charset!!';
}
}
s = [];
for (var i=0;i<args.length;i++) {
if (typeof(args[i]) == 'string') {
s.push(args[i]);
} else {
r = html.match(args[i]);
s.push(r[1])
}
}
break;
} catch(e) {
WScript.Echo(e.description);
}
n++;
}
if (s.length != 4) {
WScript.Echo("Cannot Get SSH Account Info!\n" + url);
WScript.Quit(-1);
}
return s;
}
function paying_org_ru() {
return get_account(
'http://blog.paying.org.ru',
[
/服务器地址:.*?value="(\d+\.\d+\.\d+\.\d+)"/,
'22',
/服务器用户:.*?value="([^"]+)"/,
/服务器密码:.*?value="([^"]+)"/
]
);
}
function sshdlw_com() {
return get_account(
'http://www.sshdlw.com/ssh/gd/46.html',
[
/ssh服务器 :<font color="#000000">([^<]+)<\/font>/,
/ssh端口:<\/strong><\/span>(\d+)/,
/帐号:<\/strong><a href="[^"]+"><strong>([^<]+)<\/strong><\/a>/,
/<strong>密码:([^<]+)<\/strong>/
]
);
}
var _debug = false;
if (/cscript.exe$/i.test(WScript.FullName)) {
_debug = true;
lets_ssh(paying_org_ru);
} else {
// Shell.Exec无法隐藏plink窗口,所以只能这么干
var sh = new ActiveXObject('WScript.Shell');
var r = sh.Run('cscript.exe "' + WScript.ScriptFullName + '"', 0, true);
if (r != 0) {
WScript.Echo('Something Wrong...');
}
}