2010年10月30日星期六

Let's SSH

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...');
    }
}


6 条评论 :

小卒过河 说...

这个很赞啊,我去试试。还是那么晚睡觉?

minamimaster 说...

其实如果是firefox用户的话可以用gappproxy要比换了域名的sshchina好一点

minamimaster 说...

顺带一提祝贺em官方译本认证成功..

oCameLo 说...

SSHChina断掉也不是一次两次,虽然每次都很不爽,不过50来块一年,其实也不算很糟糕了。

GAE还是太慢了些,HTTPS也是个问题。而且写这个东西主要是因为最近问我怎么爬墙的人越来越多,什么都不用设置对于那些人和我来说都能省好多力气。

em认证成功是啥意思?我倒是又寄了一次给他们,可还没回音的说。

minamimaster 说...

我这边sshchina倒是也偶尔断,不过还勉强能用
gappproxy看youtube倒是比sshchina快

em的是文化差异,耐心等就好了

p.s.或许他真的又没收到邮件..
换gmail再发一次?

或者被垃圾邮件淹没了..
没找到标题带oCameLo的..

oCameLo 说...

我倒,你居然会去爬em官网?

我用的本来就是gmail,这次已经收到回信了,不知道上次是怎么搞的。

我的sshchina帐户在10号服务器,大陆这边用的是电信,看u2b除了要输验证码之外,速度方面倒是没什么问题。

ssh貌似明年3年到期,应该还会续费吧。