layout: post
title: 如何与Linux服务器优雅的交互
subtitle: ssh免密快速登录 & 内网穿透 & 文件传输与同步等
date: 2019-08-12
author: NSX
header-img: img/post-bg-2015.jpg
catalog: true
tags:
- 技术
- Linux
如何与Linux服务器优雅的交互
- 远程连接Linux客户端
- ssh免密快速登录
- 内网穿透(跨网段访问服务器)
- 文件传输与同步 syncthing
- 多开发环境管理 Anaconda
- 多任务管理 nohup screen
- 睡觉调参模式 python-fire
- jupyter notebook
- 单任务全霸占模式 run-one
0. 远程连接Linux客户端
主要介绍 MobaXterm、XManager、secureCRT、Putty、Cygwin、FileZilla.
1. MobaXterm
MobaXterm:远程计算的终极工具箱。
它提供了所有重要的远程网络工具 (如SSH、 X11、 RDP、 VNC、 FTP、 MOSH 等等),
以及 Windows 桌面上的 Unix 命令(bash、 ls、 cat、sed、 grep、 awk、 rsync等等),而这些都是由一个开箱即用的单一的便携程序所提供。
MobaXterm 对个人使用免费,你可以在这里下载 MobaXterm (单文件纯绿色软件,下载过来exe包直接运行即可,不需要任何的安装过程)。
参考 免费开源SSH客户端神器MobaXterm,是时候puttty、Xshell和SecureCRT说Byebye了
- 多协议,多Session管理
- 传输协议上支持SSH, X11, RDP, VNC, FTP,MOSH, … 等大量远程网络协议;
- 而且所有协议统一session管理,打开一个终端,所有功能都可以直接使用免登陆。
- RDP 连接Windows远程桌面
- 图形化的SSH隧道管理
- Linux shell小工具
- MobaXterm引入很多Linux shell的小工具直接在Windows使用
- SFTP传输
- SSH登陆后左边会自动列出sftp文件传输窗口,可以随手进行文件上传和下载;
- 多窗口和分屏
- MXterm也支持内置多标签页、横向纵向2分屏和田字形4分屏,用于一个窗口内管理多个连接
2. XManager
Xmanager是一个工具集合,里面包括了xshell,xftp,xbrowser,xstart,xlpd等等功能,
其中最常用的就是xshell和xftp,我个人认为xshell是最好用的ssh工具,这也是我目前每天使用的工具。
网址:http://www.netsarang.com/products/xmg_detail.html
Xshell4-Xftp4整合绿色便携版,免安装直接运行使用【亲测好用】-CSDN下载
* 注意:不要用盗版汉化版的ssh软件,可能植入木马,窃取你的用户名密码,证书
优点:
- xshell的设计简洁,支持多标签模式,默认可以进行自动登录,方便进行快速设置主题,字体等,
- 可以一键连接xftp工具。
缺点:
- 收费(home and school users可以申请免费使用xshell与xftp)
- 只有windows版本。
3. secureCRT
SecureCRT也是一款功能强大的工具,比较好用。但是也是收费的(钱不是白收的),同时支持windows,mac,linux,iOS等多系统平台。是mac用户的首选。
SecureCRT除了包括一般工具都有的特点之外,还包括自动注册、对不同主机保持不同的特性、打印功能、颜色设置、可变屏幕尺寸、用户定义的键位图等等功能。
网址:https://www.vandyke.com/products/securecrt/
4. Putty
putty是最简单的SSH工具,无需安装,支持多系统版本,下载后就可以直接使用
网址:https://www.chiark.greenend.org.uk/~sgtatham/putty/
缺点:
- 不支持标签模式;
- 默认设置不友好,很多功能都需要额外配置才行,例如自动登录功能;
- 不能传输文件;
- 没有X11,需要配置Xming工具;
- 默认keepalives没有设置,一段时间不操作后会断开。
5. Cygwin
Cygwin 是一款 GNU 和开源工具的大杂烩,提供的功能近似于一个 Windows 平台下的 Linux。
6. FileZilla
接下来的一个工具是FileZilla,这个工具主要方便我们将本机上的文件传输到服务器端。FileZilla使用起来也十分容易。
只需在上面输入相应的主机名、用户名和密码就行了,端口还是输入22,使用sftp
通过堡垒机登陆Linux服务器
最近公司线上服务器都换上了堡垒机登陆,这样每个开发人员都只分配堡垒机账号,然后运维人员划分对应的权限机器就好了。
相比之前的登陆有很多优点:
- 只需给开发人员分配一个账号和密码,避免机器过多账号繁多的情况;
- 运维人员分配机器权限便捷,只需给开发人员账号分配权限机器即可;
- 相对跳板机来说更安全,堡垒机登陆到线上服务器后,可以记录每个用户的所有操作记录;
大概说下堡垒机的使用机制:
- 开发人员使用自己的账号登陆堡垒机,输入账号和密码
- 登陆成功后,堡垒机会列出该账户下有权限可操作的服务器列表,每个服务器对应一个数字
- 开发人员输入对应的服务器数字或者选择搜索选项搜索服务器
- 如果是直接选择了服务器,则会列出可用的账户,如果是搜索服务器,则需输入服务器IP
- 然后堡垒机会列出可用的账号列表,每个账户对应一个数字
- 输入账户对应的数字,选择使用哪个账户操作服务器,进入服务器,登陆完成
也就是说我进入一台线上服务器,需要输入账号密码->选择/搜索服务器->选择操作账户->登陆成功这几个步骤。
具体步骤
使用XShell连接服务器图解
- 点击新建会话,填写堡垒机的地址与端口号
- 点击用户身份验证,填写堡垒机的用户名与密码
- 保存会话连接
- 连接堡垒机,输入OTP动态密码,选择相应的服务器
1. ssh免密快速登录
实现快速远程登录服务器,可以将你的服务器信息写入ssh配置文件中:
- ssh配置文件位于:~/.ssh/config
- 修改文件内容 ``` Host test User lhadmin Hostname 10.231.135.146 Port 22
Host github.com HostName github.com User ningshixian IdentityFile /Users/xxx/.ssh/id_rsa
<br />Host后面你自己起个名;<br />User后面是你的服务器用户名;<br />Hostname是服务器IP;<br />Port是端口号;
- 保存后 `source ~/.bash_profile*` 或者 `*source ~/.bashrc*` 激活一下启动脚本
- 快捷登录:ssh test
然后,经过第一步后,只需要再敲密码就可以进入啦。如何实现免密登录呢?也很简单,把你PC端的ssh公钥写入服务器的ssh信任列表里就可以啦。首先用`ssh-keygen`命令生成rsa密钥对(生成一只私钥和一只公钥),一路enter即可,但是注意:
![](https://pic1.zhimg.com/80/v2-4caf762d4648f366adcb23dc05fdad94_720w.jpg#crop=0&crop=0&crop=1&crop=1&id=yGSsN&originHeight=97&originWidth=720&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
_之前有已经生成过的同学在此处就选择n吧,没有生成过的同学就一路next~_
然后去 _~/.ssh/_ 文件夹下将公钥发送到服务器上的某文件夹里:
![](https://pic2.zhimg.com/80/v2-505040d0a11a5d5ba45af596377e5e91_720w.jpg#crop=0&crop=0&crop=1&crop=1&id=ogHql&originHeight=79&originWidth=720&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
然后去服务器上,把你PC端的公钥丢进ssh信任列表:
```bash
cat id_rsa.pub >> ~/.ssh/authorized_keys
好啦~搞定啦,再回到你的PC端登录试试吧,是不是连输入密码都省掉啦。
2. 内网穿透(跨网段访问服务器)
但是注意哦,如果你的服务器是在局域网内,那你的PC离开这个局域网的时候当然就找不到你的服务器啦。想要在家里用GPU服务器?很简单,小夕教你分分钟内网穿透!
在内网穿透方面,小夕试了好几种方案后,感觉还是花生壳对新手最友好也最稳定。我们的内网穿透只需要将服务器内网ip以及22端口号(即ssh端口号)映射到外网ip的某个端口号。这个过程使用花生壳非常简单,在网上有很多教程,小夕就不啰嗦啦。之后我们要做的就是将这个外网ip和端口号也封装成一条命令,比如花生壳分配给我们的外网ip是103.44.145.240,端口是12560,那么只需要把这个写入客户端shell启动脚本:
alias sshdlnlp_remote="ssh -p 12560 dlnlp@103.44.145.240"
(别忘用source刷新启动脚本)
之后就可以在世界各地用一条命令访问你的gpu服务器啦。
—— 10.19 更新 ——
放弃花生壳了,改用更稳定并且开源免费的frp了,当然这个需要你事先有一台外网服务器,推荐阿里云(学生每月10元)。在你的外网服务器上用frp搭一个反向代理超级容易,傻子都能学会,去frp的github看一下吧~亲测比花生壳好用最少一万倍,并且超级稳定。
3. 文件传输与同步
对于一次性的文件传输,这方面最简单的当然还是直接使用scp命令啦,文件夹和文件都能轻松传输。
但是我们做深度学习的话,在服务器端大面积改代码、重量级调试的话还是不方便,毕竟服务器上没有图形界面,大部分人还是用不惯vim的,那么能不能在PC端用漂亮的编辑器修改代码,将修改结果实时的同步到服务器端呢?当然可以!这里小夕推荐文件同步神器syncthing。
剩下的就是傻瓜式配置啦。记得要更改文件夹刷新频率哦(默认是60秒,我们可以改的短一点,比如3秒),这样在客户端我们用漂亮的文本编辑器对代码的改动就能实时的同步到服务器上啦,在服务器端就只需要负责运行就可以咯。
4. 多开发环境管理
如果不幸你的GPU服务器并不是你一个人用,那么这时多人(尤其是混入小白多话)经常把服务器默认的python环境弄的乌烟瘴气,比如有人用python2,有人用python3,有人用tensorflow1.3,有人用0.12等…最后导致大家的程序全跑崩了。
所以在服务器端管理深度学习的开发环境是极其必要的,这里anaconda直接搞定!每个人建立和管理自己的开发环境,包括python版本、各种库的版本等,互不干扰。而且在发布project时,也方便直接将环境导出为requirements文件,免得自己去手写啦。
5. 多任务管理(并行调参)
如果你的服务器上有多个GPU,或者你的任务消耗GPU资源不多,那么并行的训练模型调参数是极大提高开发效率的!这里小夕给出几种场景下的常用方案:
1、比如我们在服务器上除了训练还要接着干别的事情(比如还要捣鼓一下贪吃蛇什么的),那么我们就可以直接将训练任务挂后台。具体如下。
在linux中,在命令后面加上 & 符号可以将命令在后台执行,为了能看到训练日志,我们当时还需要输出重定向(否则会打印到屏幕上干扰正常工作的),所以比如我们调batchsize参数时可以这样:
dlnlp@ubuntu:~$ python train.py --batchsize=16 > log_batch16.txt &
当然再挂上其他batchsize大小,如:
dlnlp@ubuntu:~$ python train.py --batchsize=16 > log_batch16.txt &
dlnlp@ubuntu:~$ python train.py --batchsize=64 > log_batch64.txt &
dlnlp@ubuntu:~$ python train.py --batchsize=128 > log_batch128.txt &
通过 jobs 命令可以看到后台任务的运行状况(running、stopped等),通过 bg [任务号] 可以让后台stopped的命令继续running,通过 fg [任务号] 可以让后台的任务来前台执行。对于前台已经执行起来的任务,可以 ctrl+z 来丢进后台(丢后台时stop了的话用bg让其run起来)。
感谢微信用户A Bad Candy在微信订阅号后台留言提醒上面的丢后台方法会在ssh断开连接后进程终止,因此:
如果我们还不希望ssh断开后导致训练任务终止,那么需要再在命令前面加上 nohup 。如:
dlnlp@ubuntu:~$ nohup python train.py --batchsize=16 > log_batch16.txt &
2、如果我们特别着急,不仅要并行挂着很多训练任务,而且都要实时的监控它们的训练进展,那么使用 screen命令吧,这个命令就相当于可以让你同时开很多个窗口(就像桌面上那样,你可以开很多应用程序的很多窗口),而且多个窗口之间可以轻松切换,同样这种方法不会因为ssh的断开而停止训练任务。
具体的操作可以直接在linux下 man screen 来查看screen命令的帮助文档。英文恐惧症的童鞋可以看本文参考文献[1]。
6. 睡觉调参模式(串行调参)
大部分场合下我们没有那么多充裕的GPU可以用,我们一般只能一次挂一个任务,但是我们又有很重的调参任务,那怎么办呢?
依然很简单啦,首先,装好python-fire这个工具。
它可以非常轻松的将你的python程序变成命令行程序,并且可以轻松的将你要调的参数封装成命令行参数的形式。
然后,写一个调参shell脚本,把你要调的参数全都写进去!比如就像这样:
(当然别忘在代码里将训练的summary写到某个文件里)
然后就可以挂上这个脚本去睡觉啦~睡到天亮发现各个最优参数都找到了,超级开心有木有。
7. 关于jupyter notebook
jupyter notebook这个神器小夕在历史文章中写过啦,也是一个重量级调参神器!或者直接可以说深度学习神器!在服务器端依然犀利的无可替代,只需要如下的tricks。
1、服务器端开启jupyter notebook后
然后复制最后那一行的 token=xxx ,这个token就是远程访问的密码!同时记下 最后那行显示的端口号 8888(因为如果服务器上同时开多个的话,端口号就不一定是8888了哦),然后去PC端做一个端口映射!即通过ssh隧道来将服务器端的8888端口号映射到本地(PC端)的某个端口(如1234):
ssh -L 1234:localhost:8888 dlnlp@102.10.60.23
(这个操作同样可以用于远程监视服务器端tensorboard)
这时就可以在PC端的浏览器
http://localhost:1234
直接访问服务器上的jupyter notebook啦~当然,访问时会让你输入密码,这时就输入之前记下的那个token哦。
2、让jupyer notebook跟anaconda开发环境融合。
默认的情况下jupyter notebook是运行在系统默认环境里的,如果要让它运行在我们自己用ananconda创建的环境中,要进入那个环境中,然后安装 nb_conda 这个库:
conda install nb_conda
这时再开启jupyter notebook就能选择在我们这个环境里运行代码啦。
8. 单任务全霸占模式
有时我们的训练任务非常重要且急迫,且绝对不允许被别人挤崩,或者我们明知要占用全部GPU资源了,那么这时我们就可以。。。emmm事先说明,非必要时刻请勿频繁使用哦:
使用linux中的 run-one 命令,这个命令可以保证同一条命令最多同时运行一个。比如 run-one python xxx 就会只允许运行一个python程序,后来的python程序在这个python程序执行完毕前是得不到执行的(一执行就会出错返回)。所以我们可以写入.bashrc:
alias python='run-one python'
(别忘source激活哦)
这时
看,我通过将第一个python挂到后台了,后面的python完全执行不起来。除非前一个python结束。(所以其他小伙伴可能以为自己的程序出问题了,然后emmm陷入了无尽的困惑)