情況:因?yàn)橐咔樵诩姨阋龋瑢W(xué)校的服務(wù)器處于內(nèi)網(wǎng)中奕翔,無法直接在家直接訪問
另 學(xué)校提供了一個(gè)跳板機(jī)用于訪問校內(nèi)服務(wù)器派继,從而進(jìn)行一些實(shí)驗(yàn)。
mobaxterm連跳板機(jī) 然后再ssh對應(yīng)的服務(wù)器庆猫,绅络,這樣左側(cè)也看不到文件列表,不能使用pycharm直接編輯代碼杉畜,只能用vim或者本地寫好上傳衷恭,并且上傳也麻煩,效果不好灭袁。
最近研究了一下 在此提供幾種解決辦法:
1牙丽、teamviewer
2兔魂、mobaxterm 的ssh隧道功能
3析校、本地pycharm設(shè)置ssh隧道 并進(jìn)行遠(yuǎn)程調(diào)試
法一:找學(xué)校的老師幫忙開下自己的電腦,開teamviewer就完事了
法二:mobaxterm的ssh隧道遂唧,新建一個(gè)ssh session:
這里的 remote host 和 specify username 填 內(nèi)網(wǎng)服務(wù)器的 ip 和自己的id
然后在下面的network settings中
開啟 ssh getway 填好跳板機(jī)的 ip 吊奢、port 和user
然后這樣的話 和 mobaxterm直連無區(qū)別,并且可以開pycharm
但是打開pycahrm的速度和服務(wù)器的負(fù)載有關(guān)系铺呵,并且編寫代碼響應(yīng)的速度也會受到影響隧熙。
法三:本地pycharm設(shè)置ssh隧道 并進(jìn)行遠(yuǎn)程調(diào)試
這個(gè)辦法需要在本地電腦安裝pycharm professional版本 只有pro版本可以使用ssh interpreter 使用學(xué)生郵箱可以申請一年的pro版本,不過郵箱驗(yàn)證比較慢音念。
首先
修改跳板機(jī)的一個(gè)文件
vim ~/.ssh/config
里面加上
Host *
ControlPersist yes
ControlMaster auto
ControlPath ~/.ssh/%n:%p
接著在本地cmd 或者 mobaxterm的local terminal輸入
(我用的是mobaxterm的)
ssh -N -f -L 6000:<內(nèi)網(wǎng)服務(wù)器ip>:22 -p <跳板機(jī)端口> username@<跳板機(jī)ip> -o TCPKeepAlive=yes
上述命令各個(gè)參數(shù)的含義如下:
- N 告訴SSH客戶端躏敢,這個(gè)連接不需要執(zhí)行任何命令件余。僅僅做端口轉(zhuǎn)發(fā)
- f 告訴SSH客戶端在后臺運(yùn)行
- L 做本地映射端口
- 關(guān)于SSH建立管道隧道
接著輸入
ssh -p 6000 服務(wù)器用戶名@localhost
就能建立起本地與內(nèi)網(wǎng)服務(wù)器的ssh隧道了
接著我們配置一下 windows的 pycharm
遠(yuǎn)程調(diào)試就是本地的一個(gè)proj對應(yīng)服務(wù)器的一個(gè)proj 自動同步的
打開pycharm 首先先配置一下ssh編譯器 用服務(wù)器上你所需要的環(huán)境的python
configure -settings - project interpreter
add一個(gè)編譯器
設(shè)置host 和 port 和Username
然后連接會輸入自己服務(wù)器ip的密碼 連接成功后 選擇所需python編譯的目錄即可
目錄大致如圖
這時(shí)候新建一個(gè)proj 對應(yīng)你的 服務(wù)器的proj
這里以3DDFA為例
選擇剛設(shè)置的編譯器
接下來就是下載代碼文件
tools -deployment configuration
設(shè)置一下root path 根目錄
和mappings里的deployment path
第三個(gè) excluded paths是你不想同步的文件目錄
設(shè)置完后
tools -deployment download from... 即可 如果是黑的 重啟一下pycharm就好
然后download下載完后如圖所示
我測試了一下 在excluded paths里面加了 moudle這個(gè)目錄 沒有同步到本地
這個(gè)可以適用于proj中有大量data的目錄 可以加在這個(gè)目錄里
另外tools- start ssh session 可以開啟服務(wù)器的terminal
總結(jié)一下 法一法二最簡單 但是受服務(wù)器負(fù)載和本地電腦因素
法三 最麻煩 但是代碼效率高
最后加上一個(gè)維護(hù)ssh隧道斷開的腳本
通過判斷socket文件是否存在來判斷隧道連接是否已經(jīng)斷開
在本地任意位置創(chuàng)建腳本auto_connect.sh并寫入如下內(nèi)容(注意更換<>中內(nèi)容)
#/usr/bin/env sh
if [[ ! -a "~/.ssh/<跳板機(jī)ip>:<跳板機(jī)端口>" ]]; then
echo "connecting <跳板機(jī)ip>:<跳板機(jī)端口> .."
ssh -N -f -L 6000:<內(nèi)網(wǎng)服務(wù)器ip>:22 -p <跳板機(jī)端口> username@<跳板機(jī)ip> -o TCPKeepAlive=yes
if [[ $? -ne 0 ]]; then
echo "failed to connect <跳板機(jī)ip>:<跳板機(jī)端口>" >&1
exit 2
fi
f
使用cron服務(wù)定時(shí)執(zhí)行腳本建立ssh 隧道镀首。在命令行中執(zhí)行如下語句:(注意修改腳本位置, 路徑不可用縮寫)
echo "0-59 * * * * sh /path/to/auto_connect.sh" > ~/.crontab
crontab ~/.crontab
本文參考:https://blog.csdn.net/huangbx_tx/article/details/93339715
https://www.cnblogs.com/xiongmao-cpp/p/7856596.html