最近生物信息學與現(xiàn)代統(tǒng)計課已經(jīng)進入第二個項目RNA-seq數(shù)據(jù)分析,根據(jù)已有的流程,我們需要使用cufflinks程序拼接轉(zhuǎn)錄本,但是cufflinks需要聯(lián)網(wǎng)更新數(shù)據(jù)(可以使用
--no-update-check參數(shù)忽略網(wǎng)絡更新,但是合并轉(zhuǎn)錄本的程序cuffmerge并不能忽略),但是一直以來大家都以為學校的小型機并不能上網(wǎng),所以程序一直被阻塞,導致進度卡住,本文就記錄一下我解決這個問題的探索和最終的方案。
猜想
平時我們使用小型機,都是在機房內(nèi)通過固定的IP來連接登陸小型機,而在宿舍里,通過蘇大網(wǎng)(校園網(wǎng))也可以使用該IP來連接小型機,那么,該小型機應該連接在校園網(wǎng)的局域網(wǎng)中,同時,猜想機房網(wǎng)絡使用固定IP,小型機的IP也是固定的(不固定怎么用,頓時覺得這個猜想不現(xiàn)實,但當時確實這樣想了,不過最后也證實是正確的),所以很可能也在和機房在同樣的免費上網(wǎng)的網(wǎng)段內(nèi)。
證實可行
根據(jù)以上的猜想,進行以下證實
- 使用
ping命令來證實
$ 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),確實是能夠聯(lián)網(wǎng)的,但是,試試訪問網(wǎng)頁
$ curl baidu.com
然后就沒有然后了……這就很尷尬了。
至于為什么ping命令可以連通百度卻不能打開網(wǎng)頁,猜測應該是網(wǎng)關系統(tǒng)是限制了HTTP請求,但是ping命令使用更為底層的ICMP協(xié)議,純屬猜測,別干壞事!
- 試試打開網(wǎng)關的頁面
$ 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>蘇州大學網(wǎng)關登錄</title>
……以下省略……
可以看到屏幕嘩啦嘩啦出來一大堆,然而,重要的是!我們打開了網(wǎng)關,所以我們知道,登陸網(wǎng)關應該就是能夠上網(wǎng)了。而且這個舊版的網(wǎng)關是免費網(wǎng)域內(nèi)才使用的,開熏!
發(fā)掘可用的工具
到了這一步,就要想辦法來登陸網(wǎng)關了,根據(jù)多年爬蟲經(jīng)驗,猜測應該是發(fā)起一個HTTP請求就可以登陸網(wǎng)關,然后轉(zhuǎn)戰(zhàn)自己的電腦,來研究如何來登陸。
打開Chrome,登陸網(wǎng)關頁面,調(diào)出調(diào)試工具,可以看到在登陸過程中,瀏覽器發(fā)起了一個POST請求


再來發(fā)掘小型機上能用的資源,雖然使用curl也能模擬發(fā)送HTTP請求,但是因為還要在網(wǎng)頁里找到兩個奇怪的參數(shù)(應該時CRSF的令牌),這個對于沒怎么接觸過shell的小白真的是會很無語,慶幸的是,小型機安裝的是anaconda發(fā)行版的Python,還預裝了requests庫,臉上瞬間就露出了老司機的笑容。
開始碼代碼
直接上改進多次的最終代碼:
#! /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)關'
}
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!')
原理很簡單,使用Python模擬發(fā)起請求,然后測試一下
$ python wg.py <studentid> <password>
succeed!
不會是假的吧?試試訪問網(wǎng)頁
$ curl baidu.com
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
這,真的成功了?好吧,真的是成功的!
人性化
最后想了想,如果能把這東西直接變成一個命令,,讓大家能方便地使用才能順利裝逼啊!故又去研究了一大波,發(fā)現(xiàn)Linux是能夠根據(jù)第一行的注釋來規(guī)定解釋器的,如此這般就有了第一句注釋,不過這里有個大坑,那就是#!之后這個空格,是必須的,找了老大一圈最后還是在StackOverflow上的小角落找到的答案,其次,一定要是Unix格式的文檔,不然還是一直報錯,最后重命名時去掉后綴名,然后移動到usr/local/bin下,再把權限改為755,那么大家就可以暢快地使用
$ wg
no necessary! # 當還能上網(wǎng)時
studentid:<studentid> # 不能上網(wǎng)時
password: # 密碼保密不回顯
succeed! # 登陸成功
fail! # 登陸失敗,可能是密碼錯誤