【UpdateTime:20170717】
一、本文目的
本人最近想嘗試使用ssh遠程鏈接家里的電腦。事情是這樣的:本人最近想學習和專研【深度學習】,但是實驗室的電腦顯卡性能不夠用,都是2GB的顯存(GTX 960M)。跑一個MNIST代碼就因為顯存不夠而報錯,當然可以通過設置batch_size的大小解決這一問題。但是后面肯定會遇到更大的數據集(cifar100,ImageNet等等),需要更大的顯存。另一方面就是顯卡性能也不夠,別的實驗室都有幾塊GTX 1080Ti的集群顯卡,或者是TITAN Xp等,他們跑代碼的速度,那叫一個快?;诖?本人是想在家里買一臺配有 TITAN Xp 顯卡的機器,然后通過ssh遠程操作跑實驗(雖然還有 TeamViewer 這么好用的工具存在,但是ssh會比 TeamViewer 更穩(wěn)定些,或者說2種方式都存在的話更保險一些)。要通過ssh鏈接不屬于同一個內網的機器,需要一個外網IP來解決這個問題。同學介紹了一個工具,frp,可以解決這問題,下文將介紹基于frp通過ssh鏈接內網機器。
參考網址:
1. frp 使用文檔:https://github.com/fatedier/frp/blob/master/doc/quick_start_zh.md
2. github - frp:https://github.com/fatedier/frp/blob/master/README.md(有中文版)
二、相關說明&;&;介紹
1. frp :frp 是一個可用于內網穿透的高性能的反向代理應用,支持 tcp, udp, http, https 協(xié)議。frp的作用如下:
1)利用處于內網或防火墻后的機器,對外網環(huán)境提供 http 或 https 服務。
2)對于 http, https 服務支持基于域名的虛擬主機,支持自定義域名綁定,使多個域名可以共用一個80端口。
3)利用處于內網或防火墻后的機器,對外網環(huán)境提供 tcp 和 udp 服務,例如在家里通過 ssh 訪問處于公司內網環(huán)境內的主機。
2. 配置文件:frps.ini 和 frpc.ini
1)將 frps 及 frps.ini 放到具有公網 IP 的機器上( 本人此處使用阿里云服務器提供的公網)
2)將 frpc 及 frpc.ini 放到處于內網環(huán)境的機器上(本人此處的機器就是放在家里且性能好的機器)
3. 圖示說明:
如下圖所示,本文的目的就是實現“用戶實際操作的PC”通過 ssh 去控制“服務器A”。其中,服務器B提供了外網IP,不可缺少。本文的前期準備包括:1)準備1臺有外網的服務器B,本文選擇阿里云服務器。2)一臺你想要控制的服務器或者PC,本文是想要控制家里的一臺性能較好的PC機。3)一臺你實際操作的PC,如宿舍的筆記本電腦或者實驗室普通的PC等。4)針對服務器A和服務器B,我們需要安裝和配置go語言環(huán)境和frp環(huán)境。5)針對用戶實際操作的PC,我們只需要安裝ssh環(huán)境即可,如windows系統(tǒng)可以安裝SecureCRT或者Putty;Ubuntu系統(tǒng)可以安裝使用ssh或者安裝putty。

三、實現步驟:通過 ssh 訪問內網機器
1.安裝&;&;配置go語言開發(fā)環(huán)境
參考網址:
== https://www.runoob.com/go/go-environment.html
== http://blog.csdn.net/tigerisland45/article/details/53447199
1)根據系統(tǒng)類型下載go語言安裝包:https://www./download
2)解壓( 此處的路徑為/usr/local ):tar -xvxf go1.9beta2.linux-amd64.tar.gz
3)建立Go工作空間:
== 在/home目錄下, 建立一個名為gopath(名字任意)的目錄,在該目錄中建立三個子目錄(名字必須為src、pkg和bin),其實只要創(chuàng)建src目錄就可以了。
src   -- 里面每一個子目錄,就是一個包。包內是Go的源碼文件 
pkg  -- 編譯后生成的,包的目標文件 
bin   -- 生成的可執(zhí)行文件。
4)配置環(huán)境:
1)gedit ~/.bashrc 或者 vim  ~/.bashrc
2)在文件尾部添加以下命令: 
# Go environment 
export PATH=$PATH:/usr/local/go/bin 
export GOPATH=/home/gopath
5)生效配置文件:source ~/.bashrc
6)測試go語言環(huán)境是否配置完成,輸入:go version
2. 下載frp源碼并安裝
1)下載源碼:go get github.com/fatedier/frp
(確保go語言已經安裝和配置成功)執(zhí)行命令后代碼將會拷貝到 $GOPATH/src/github.com/fatedier/frp 目錄下。
2)編譯:進入下載后的源碼根目錄,執(zhí)行【make】命令,等待編譯完成。編譯完成后, bin 目錄下是編譯好的可執(zhí)行文件,conf 目錄下是示例配置文件。
3)部署:
== 將 ./bin/frps 和 ./conf/frps.ini 拷貝至服務器B任意目錄。 
== 將 ./bin/frpc 和 ./conf/frpc.ini 拷貝至服務器A任意目錄。 
== 根據要實現的功能修改兩邊的配置文件,詳細內容見后續(xù)章節(jié)說明。 
3.1)frps.ini
[common]bind_addr = 0.0.0.0# 用于接收 frpc 連接的端口bind_port = 7000log_file = ./frps.loglog_level = info# ssh 為代理的自定義名稱,可以有多個,不能重復,和frpc中名稱對應[ssh]auth_token = 123 bind_addr = 0.0.0.0# 最后將通過此端口訪問后端服務listen_port = 6000
3.2)frpc.ini
[common]# frps 所在服務器綁定的IP地址server_addr = x.x.x.xserver_port = 7000log_file = ./frpc.loglog_level = info# 用于身份驗證auth_token = 123 # ssh 需要和 frps.ini 中配置一致[ssh]# 需要轉發(fā)的本地端口local_port = 22# 啟用加密,frpc與frps之間通信加密,默認為 falseuse_encryption = true
== 在服務器B執(zhí)行 nohup ./frps &; 或者 nohup ./frps -c ./frps.ini &; 。
== 在服務器A執(zhí)行 nohup ./frpc &; 或者 nohup ./frpc -c ./frpc.ini &; 。 
== 通過 ssh -oPort=6000 {user}@x.x.x.x測試是否能夠成功連接服務器A({user}替換為服務器A上存在的真實用戶)
四、總結
1. (服務器A + 服務器B)安裝并配置go語言的環(huán)境
2. (服務器A + 服務器B)下載并安裝frp
3. (服務器A,被控制的PC)根據實際情況修改配置文件并運行:frpc.ini(nohup ./frpc -c ./frpc.ini &;)
4. (服務器B,具有外網)根據實際情況修改配置文件并運行:frps.ini(nohup ./frps -c ./frps.ini &; )
5. (用戶實際操作的PC)通過ssh鏈接服務器A,只需要執(zhí)行語句【 ssh -oPort=6000 {user}@x.x.x.x 】即可。
注:當用戶實際操作的PC是ubuntu系統(tǒng)時,使用上述命令即可。但是當PC是windows系統(tǒng)時,我們正常使用的是可視化的軟件(如,putty或者SecureCRT等),此時,我們只需要根據配置信息改變端口即可。如下圖所示,以putty為例:

(此時,Port端口為6000,IP address為公網IP地址)