最近生物信息學(xué)與現(xiàn)代統(tǒng)計(jì)課已經(jīng)進(jìn)入第二個(gè)項(xiàng)目RNA-seq數(shù)據(jù)分析,根據(jù)已有的流程肉瓦,我們需要使用cufflinks程序拼接轉(zhuǎn)錄本,但是cufflinks需要聯(lián)網(wǎng)更新數(shù)據(jù)(可以使用
--no-update-check
參數(shù)忽略網(wǎng)絡(luò)更新,但是合并轉(zhuǎn)錄本的程序cuffmerge并不能忽略)谴咸,但是一直以來(lái)大家都以為學(xué)校的小型機(jī)并不能上網(wǎng)搓逾,所以程序一直被阻塞卷谈,導(dǎo)致進(jìn)度卡住,本文就記錄一下我解決這個(gè)問(wèn)題的探索和最終的方案霞篡。
猜想
平時(shí)我們使用小型機(jī)世蔗,都是在機(jī)房?jī)?nèi)通過(guò)固定的IP來(lái)連接登陸小型機(jī),而在宿舍里朗兵,通過(guò)蘇大網(wǎng)(校園網(wǎng))也可以使用該IP來(lái)連接小型機(jī)污淋,那么,該小型機(jī)應(yīng)該連接在校園網(wǎng)的局域網(wǎng)中余掖,同時(shí)寸爆,猜想機(jī)房網(wǎng)絡(luò)使用固定IP,小型機(jī)的IP也是固定的(不固定怎么用,頓時(shí)覺(jué)得這個(gè)猜想不現(xiàn)實(shí)赁豆,但當(dāng)時(shí)確實(shí)這樣想了仅醇,不過(guò)最后也證實(shí)是正確的),所以很可能也在和機(jī)房在同樣的免費(fèi)上網(wǎng)的網(wǎng)段內(nèi)魔种。
證實(shí)可行
根據(jù)以上的猜想析二,進(jìn)行以下證實(shí)
- 使用
ping
命令來(lái)證實(shí)
$ ping baidu.com
PING baidu.com (180.149.132.47) 56(84) bytes of data.
64 bytes from 180.149.132.47: icmp_seq=1 ttl=48 time=208 ms
64 bytes from 180.149.132.47: icmp_seq=2 ttl=48 time=209 ms
64 bytes from 180.149.132.47: icmp_seq=3 ttl=48 time=207 ms
64 bytes from 180.149.132.47: icmp_seq=4 ttl=48 time=211 ms
64 bytes from 180.149.132.47: icmp_seq=5 ttl=48 time=209 ms
64 bytes from 180.149.132.47: icmp_seq=6 ttl=48 time=209 ms
^C
--- baidu.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5006ms
rtt min/avg/max/mdev = 207.858/209.435/211.620/1.187 ms
可以發(fā)現(xiàn),確實(shí)是能夠聯(lián)網(wǎng)的节预,但是叶摄,試試訪問(wèn)網(wǎng)頁(yè)
$ curl baidu.com
然后就沒(méi)有然后了……這就很尷尬了。
至于為什么ping
命令可以連通百度卻不能打開(kāi)網(wǎng)頁(yè)安拟,猜測(cè)應(yīng)該是網(wǎng)關(guān)系統(tǒng)是限制了HTTP請(qǐng)求蛤吓,但是ping
命令使用更為底層的ICMP協(xié)議,純屬猜測(cè)糠赦,別干壞事柱衔!
- 試試打開(kāi)網(wǎng)關(guān)的頁(yè)面
$ curl wg.suda.edu.cn
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>蘇州大學(xué)網(wǎng)關(guān)登錄</title>
……以下省略……
可以看到屏幕嘩啦嘩啦出來(lái)一大堆,然而愉棱,重要的是唆铐!我們打開(kāi)了網(wǎng)關(guān),所以我們知道奔滑,登陸網(wǎng)關(guān)應(yīng)該就是能夠上網(wǎng)了艾岂。而且這個(gè)舊版的網(wǎng)關(guān)是免費(fèi)網(wǎng)域內(nèi)才使用的,開(kāi)熏朋其!
發(fā)掘可用的工具
到了這一步王浴,就要想辦法來(lái)登陸網(wǎng)關(guān)了,根據(jù)多年爬蟲(chóng)經(jīng)驗(yàn)梅猿,猜測(cè)應(yīng)該是發(fā)起一個(gè)HTTP請(qǐng)求就可以登陸網(wǎng)關(guān)氓辣,然后轉(zhuǎn)戰(zhàn)自己的電腦,來(lái)研究如何來(lái)登陸袱蚓。
打開(kāi)Chrome钞啸,登陸網(wǎng)關(guān)頁(yè)面,調(diào)出調(diào)試工具喇潘,可以看到在登陸過(guò)程中体斩,瀏覽器發(fā)起了一個(gè)POST請(qǐng)求
再來(lái)發(fā)掘小型機(jī)上能用的資源颖低,雖然使用curl
也能模擬發(fā)送HTTP請(qǐng)求絮吵,但是因?yàn)檫€要在網(wǎng)頁(yè)里找到兩個(gè)奇怪的參數(shù)(應(yīng)該時(shí)CRSF的令牌),這個(gè)對(duì)于沒(méi)怎么接觸過(guò)shell的小白真的是會(huì)很無(wú)語(yǔ)忱屑,慶幸的是蹬敲,小型機(jī)安裝的是anaconda發(fā)行版的Python暇昂,還預(yù)裝了requests庫(kù),臉上瞬間就露出了老司機(jī)的笑容伴嗡。
開(kāi)始碼代碼
直接上改進(jìn)多次的最終代碼:
#! /opt/ibm/miniconda/bin/python
# -*- coding:utf-8 -*-
"""
@author: 楊滿球
@file: wg.py
@time: 2016/11/12 12:03
"""
from requests.exceptions import ReadTimeout
import requests
import re
import sys
import getpass
def login():
s = requests.session()
r = s.get('http://wg.suda.edu.cn/')
viewstate = re.findall('id="__VIEWSTATE" value="(.+?)"', r.text)[0]
eventvalidation = re.findall('id="__EVENTVALIDATION" value="(.+?)"', r.text)[0]
try:
studentid = sys.argv[1]
except:
studentid = raw_input(u'studentid:')
try:
password = sys.argv[2]
except:
password = getpass.getpass(u'password:')
data = {
'__EVENTTARGET': '',
'__EVENTARGUMENT': '',
'__VIEWSTATE': viewstate,
'__EVENTVALIDATION': eventvalidation,
'TextBox1': studentid,
'TextBox2': password,
'nw': 'RadioButton2',
'tm': 'RadioButton8',
'Button1': '登錄網(wǎng)關(guān)'
}
r = s.post('http://wg.suda.edu.cn', data=data)
html = r.text
if u'成功登錄' in html:
print(u'succeed!')
else:
print(u'fail!')
if __name__ == '__main__':
try:
r = requests.get('http://baidu.com', timeout=3)
except ReadTimeout as e:
login()
else:
print('no necessary!')
原理很簡(jiǎn)單急波,使用Python模擬發(fā)起請(qǐng)求,然后測(cè)試一下
$ python wg.py <studentid> <password>
succeed!
不會(huì)是假的吧闹究?試試訪問(wèn)網(wǎng)頁(yè)
$ curl baidu.com
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
這,真的成功了食店?好吧渣淤,真的是成功的!
人性化
最后想了想吉嫩,如果能把這東西直接變成一個(gè)命令价认,,讓大家能方便地使用才能順利裝逼白悦洹用踩!故又去研究了一大波,發(fā)現(xiàn)Linux是能夠根據(jù)第一行的注釋來(lái)規(guī)定解釋器的忙迁,如此這般就有了第一句注釋?zhuān)贿^(guò)這里有個(gè)大坑脐彩,那就是#!
之后這個(gè)空格,是必須的姊扔,找了老大一圈最后還是在StackOverflow上的小角落找到的答案惠奸,其次,一定要是Unix格式的文檔恰梢,不然還是一直報(bào)錯(cuò)佛南,最后重命名時(shí)去掉后綴名,然后移動(dòng)到usr/local/bin
下嵌言,再把權(quán)限改為755嗅回,那么大家就可以暢快地使用
$ wg
no necessary! # 當(dāng)還能上網(wǎng)時(shí)
studentid:<studentid> # 不能上網(wǎng)時(shí)
password: # 密碼保密不回顯
succeed! # 登陸成功
fail! # 登陸失敗,可能是密碼錯(cuò)誤