1. 引言
之前每次听到有人说自己的TeamViewer账号被莫名奇妙的鉴定为商用,连接受限制的时候,我都会说一句:“我的账号用了这么长时间了,怎么一点问题都没有?” 。然而,在我假期了频繁使用并且用远程传递了一个接近1G的文件之后:
呵呵,垃圾!!!
虽然这个貌似可以通过修改MAC地址然后重装软件来解决,不过我也懒得去试了,实在是摸不准它的商用鉴定规则,谁知道今后会不会又莫名奇妙的被限制哪。并且使用的时间长了我也发现了很多让我不能忍受的bug,所以我就干净利落的删掉了我的所有电脑上的TeamViewer!
但是,作为一个非常懒的重度远程用户,不在实验室的时候没有点什么来控制实验室的电脑总感觉不舒服。并且,电脑上跑算例的时候不实时看着的话也很不踏实。既然这个渠道得收费了,那我就去寻一条免费的方式,然后我就开始了接近一周的“瞎折腾”。从目前的结果来看基本上已经满足我的需求了,所以我就把我折腾出来的方法记录一下,有需要的可以自取。另外,本人并非专业人士,下面的内容都是根据我的经验和所学到的总结出来的,如有错误的地方,欢迎指正!!
2.方法
说一下我的手头的电脑资源,一般我会随身携带一个Windows系统的小surface,然后在我的实验室有两台Ubuntu 16.04系统的台式机:一台普通PC机,只有我一个用户使用;一台工作站,这个是多用户的。我所希望的就是用我的surface去远程控制Ubuntu的台式机。具体的需求有如下两点:
- 可以控制正在运行的程序,最好是有界面的,因为需要查看运行结果
- 可以进行远程文件的传输
需求提完了,该怎么解决哪?然后我就“折腾”了如下的几个方式:
2.1 SSH
这个是我感觉无论是安装还是使用起来都是最省事的一种方式,具体的操作如下:
在Ubuntu端安装SSH服务(如果你没有安装过的话):
sudo apt-get install openssh-server
然后开启SSH服务:
sudo service ssh start
将其设置为开机启动,利用如下命令打开/etc/rc.local文件(不习惯使用vim的话可以将它换位你用的顺手的编辑器):
sudo vim /etc/rc.local
在打开文件的exit 0语句前加入:/etc/init.d/ssh start, 然后保存退出即可。
然后,在Windows可以选择安装的软件有很多,我所选择的是Putty(用于远程控制)和WinSCP(用于远程文件传输),点击软件名称即可跳转到下载界面。具体的安装过程我就不说了,安装完成后是这个样子的:
`
要想利用这两个软件进行远程控制及文件传输需要再Putty登陆界面Host Name栏和WinSCP的主机名一栏输入被控电脑的ip地址,至于这个ip地址如何获得,接下来会说明,现在只需知道这两个地方需要输入ip即可。界面里面的端口号暂时不需要改动,SSH服务默认的端口号即为22。在WinSPC界面中需要输入被控电脑的用户名和密码,点击连接即可。Putty的也需要输入用户名和密码,只不过是在连接之后的终端里面输入。连接成功之后如下图所示:
Putty打开的是一个终端,在这里面就可以输入linux的命令控制程序的运行了。WinSCP的界面就和TeamViewer的文件传输界面很像了,可以方便的进行远程文件传输。哦,对了,在登陆了WinSPC之后按Ctrl+p就可以直接打开Putty终端了。
这样一来,远程控制的基本功能算是满足了。但是,有些人可能不习惯单纯的命令行操作,没有界面的话总是感觉不舒服。并且在查看计算结果的时候也需要界面来打开paraView之类的软件。如果想和TeamViewer一样用界面操作可以参考接下来的方法。
2.2 VNC
VNC (Virtual Network Console)是虚拟网络控制台的缩写,它由客户端和服务端组成。简单而言,所谓客户端就是你安装在Windows里面用于远程控制的软件,而服务端就是在Ubuntu系统里面安装的VNC服务。
比较常用的VNC服务主要包括x11vnc和Tigervnc等,但是Tigervnc我配置了很时间也没配置好,有兴趣的同学可以参考:TigerVNC。而x11vnc的安装和配置就简单很多了,它可以返回真是的X信号,也就是说和TeamViewer一样,你通过客户端的访问操作在被控端的屏幕上都可以显示出来。
具体的安装配置过程如下:
安装x11vnc服务
sudo apt-get install x11vnc -y
设置访问密码,并存储于/etc/x11vnc.pass,中间过程会要求输入两次密码,并且询问是否存储。
sudo x11vnc -storepasswd /etc/x11vnc.pass
创建x11vnc服务
sudo vim /lib/systemd/system/x11vnc.service
将如下内容粘贴进打开的文件中,保存
Description=x11vnc service
After=multi-user.target
[Service]
ExecStart=/usr/bin/x11vnc -xkb -noxrecord -noxfixes -noxdamage -forever -loop -auth guess -rfbauth /etc/x11vnc.pass -rfbport 5901 -shared
ExecStop=/usr/bin/killall x11vnc
[Install]
WantedBy=multi-user.target
注意-rfbport 5901为你进行连接的端口号,这个很重要!!! 然后配置防火墙并开启服务
sudo ufw allow 5901
sudo systemctl daemon-reload
sudo systemctl enable x11vnc.service
sudo systemctl start x11vnc.service
重启电脑之后,打开终端输入如下命令查看x11vnc是否在运行
ps -ef | grep x11vnc
正常运行时显示结果如下
至此,linux端x11vnc服务配置完成。为了进行远程连接,需要在Windows端安装VNC客户端,这个同样有很多可以选,我所选用的客户端为TightVNC。安装完成之后打开客户端,在Remote Host一栏中输入被控端的IP地址::端口号连接,注意是两个冒号。
连接的过程中会要求你输入你在-storepasswd设置的连接密码,验证成功后即可看到被控端的屏幕啦!并且操作的过程中几乎很少卡顿,非常流程。
你可能会觉得这个屏幕看起来有些怪异,这是因为我的电脑有两块屏幕,一个横屏一个竖屏,它把两个屏幕都显示在了一个界面里面,不像TeamViewer一样可以分开显示两个屏幕。不过不要紧,想看哪一个屏幕的话可以点哪个放大镜+将这个屏幕放大就行。相比而言TeamViewer所显示的的屏幕好像就不能放大,我每次切换到竖屏上的时候就把竖屏压缩到了我的小surface屏幕上去,那真是瞅个字老费劲了。。。。
这个TightVNC配合上x11vnc貌似也可以进行文件传输,就在放大镜+按钮的左边就有一个文件传输按钮,但是我不知道为啥它老是灰色的,尝试过配置文件传输但是一直没成功,所以我就放弃了,还是老老实实的用SSH吧。
好了,如果你的电脑是只有你一个人在用的,也就是说只有和我的普通PC机一样里面只有一个账户,那么ok,这种方法的连接简直完美,可以说几乎不比TeamViewer差。但是,如果说你的电脑是和我的工作站一样,有很多人在用,每个人都有一个登陆账户的话,假设你开机之后通过x11vnc连接成功了,如果一旦工作站发生自动锁屏或者别人切换了用户之后,这样你就会来到如下的用户登陆界面
在这个界面的情况下,你再次使用x11vnc连接,那么你连接成功后的显示界面为
一片黑!!!点击鼠标键盘什么的被控端都不会有任何反应,除非你通过SSH连接上之后用命令行来重启电脑才行。不过,开什么玩笑,正在跑着程序的电脑怎么能随意重启哪。。。。。所以,对于存在多用户的电脑来说,这样的连接是由bug的,我尝试了多办法都没能解决,这个的具体原因我也没搞太清楚,不知道是不是我的参数配置不全面的原因还是这个x11vnc只支持对一个用户的访问。所以对于这种存在多个用户的电脑可以通过下面的方式实现对桌面的远程访问。
2.3RDP
RDP就是远程桌面协议,大部分Windows都默认支持此协议,可以远程接入操作桌面。在Linux端需要安装xrdp协议:
sudo apt-get install xrdp
在安装的过程中会默认安装vnc4service等vncservice,xrdp启动之后,系统会自动启动一个VNC会话进程监听服务。
不过这样完成后是不能进行远程访问的,这是因为xrdp在13.10之后版本就已经不支持的Gnome桌面了和原生Unity桌面,所以你还需要安装一个第三方桌面,我使用的是xfce4。还可以安装mate桌面来实现访问,并且mate桌面还支持同时对不同的用户访问,而使用xfce4只能一次登陆一个用户。我不用mate桌面的主要原因是,我感觉它太丑了,一点也不圆润。。。。具体的mate桌面安装详见教程。对于xfce4可采用如下方式安装:
sudo apt-get install xubuntu-desktop
然后配置xrdp:`
echo xfce4-session >~/.xsession
并且设置配置文件:
sudo gedit /etc/xrdp/startwm.sh
在打开文件中的在. /etc/X11/Xsession 前一行插入:xfce4-session,保存退出。重启xrdp协议即可:
sudo service xrdp restart
在Windows端采用mstsc来开启远程连接,啥是mstsc,其实就是远程桌面连接,在应用程序搜索里面输入这几个字就能找到,它大概张这样:
在计算机这一栏输入ip地址点击连接就可以了。然后会打开如下窗口
第一栏选用默认模式即可,第二栏输入你所想要登陆用户的用户名,最后一栏为你的用户名所对应的密码。点击ok,连接成功之后的界面如下所示:
看到这个如你可能会有疑问,不对呀,这不是我电脑上的ubuntu桌面呀!是的,这个是xfce4的桌面,有点苹果电脑桌面的感觉。不但桌面显示不一样,而且你再远程桌面上的任何操作都不会在你的被控端电脑上显示出来。所以这就是一个独立的桌面,和x11vnc不一样,并不是真实的实时显示。但是至少可以在这个界面上操作那些需要图形操作的软件。
鱼和熊掌不可兼得,如果你想问有没有既可以兼容多用户又可以显示实时桌面的方式,抱歉,我没找到,如果有请告诉我。
3.IP
ok,前面介绍完了远程连接的方式,但是如果要真的想实现远程连接那么有一个东西是必不可少的,那就是你所要连接电脑的ip地址是什么。这个应该怎么获得那,对于Linux系统来说,可在终端输入如下命令:
ifconfig
得到如下的结果,找到除了lo之外的哪个网卡的inlet后面有数值,这个值就是你电脑的ip地址(图中红框)
如果采用的是静态ip联网,并且只需要控制一台电脑的话,那么ok,只需要记住这个ip就可以了,以后到哪里连接都输入这个ip就行,下面的内容也都不需要再看了。但是对于我们的校园网而言就有另外一个问题了。去年,我们实验室的网络终于从整个实验室共用一个路由器的情况改成了现在的每个人用自己的账号进行拨号上网,这样的好处就是网速得到了巨大的提升,然而不好的地方就是,拨号上网的ip并不是固定的,校园网隔一段时间就会重新拨号一次,这样一来ip就变了,可能你这一次用这个ip连接的好好的,隔了一段时间在想用这个ip连接的话就练接不上了。这样一来就很尴尬了,为了远程连接你需要知道ip,但是你的ip只能在你连接上了之后才能查到,死循环…
怎么才能让你的ip不变那,然后我就测试了另外一个办法:连接路由器。先用路由器连接网络,然后把电脑连接到路由器上,然后通过路由器的静态ip分配将两台电脑的MAC地址于ip绑定,这样电脑的ip就再也不会变了(我连接的是小米路由器,不同的路由器应该都有这个功能的)
搞定之后,我就去拿这ip尝试了远程连接,结果发现根本连不上!!!!!
这个时候我意识到了我犯了一个多么213的错误,远程连接所需要的ip是你接入互联网的公网ip,而这个ip是这个局域网的ip,远程连接根本找不到这个ip,所以咋连…
那么这个时候的公网ip到底是什么呀,其实公网ip就是你路由器联网的ip,这个可以在路由器设置界面查到
打开这个界面你就会找到公网ip是多少,但是这个界面上显示的不还是通过PPPoE的拨号上网嘛,所以这个ip也是会变得呀,那么这样折腾连个路由器有什么意义那?别急,虽然它会变但是并不代表我们无法得知这个ip到底是多少。有人说可以通过路由器得DDNS的功能,然后通过花生壳来绑定域名,就可以通过域名来直接访问了。这方面的教程如有兴趣请自行搜索,反正我是尝试了一下没有成功,貌似还要花点钱啥的。那么除了这种方法还能怎么搞那?其实现在的路由器也都很智能了,各大厂商的路由器也都有响应配套的手机app,只要app绑定了你的路由器之后,这个路由器的所有联网信息都可以通过app查得到,比如小米wifi里面就可以看的到我的路由器信息
这样ip的问题就搞定了!!!!然后就可以尝试先用手机app查询到ip之后,再用上述的方法进行连接了,这样当你采用vnc的方式在客户端输入ip::5901或者采用xrdp方式在远程桌面里面输入ip地址进行远程连接的时候,你就会发现还是连不上!!!!!感觉要崩溃…
这是因为这个时候你所输入的ip是路由器的ip呀,那么远程连接的时候访问它的5901端口口啥的没什么意义呀,当然连不上了,我们所需要访问的是所连接电脑的端口,这个时候就要用到路由器的另外一个功能了:端口转发。端口转发的意思就是将路由器的端口映射到你电脑上的某个端口,当你访问路由的这个端口是将自动转接到电脑上面对应的端口。
就像上面的这个图一样,我把路由器外部端口中5901和5902分别映射到了我的两台电脑上的5901端口上面,对于ssh协议的22端口同样做如此映射,最后的3389端口所对应的为xrdp的默认连接端口。经过这样的设置之后我如果通过ssh的方式访问将Putty或者WinSCP的端口号改为23将会访问我的普通PC机,端口号改为34将会访问工作站;同理若采用vnc的方式连接输入ip::端口号,5901访问PC机器,5902访问工作站。对于xrdp来说,需要在mstsc的计算机窗口中输入ip:3389(注意,只有一个冒号)即可通过xrdp来访问工作站。
至此,所有设置完成,这次是真的完成了!!!
4.总结
终于要结束了,可累死我了。以上设置我都在Ubuntu里面测试成功了,但是对于其他Linux系统是否有效还有待验证。对于Windows系统之间的远程操作我也没尝试,因为我手中没有两台Windows的电脑,不过在安装TightVNC的时候我发现除了安装了客户端,同样也安装了TightVNC Service,至于能否可行有兴趣的话可以去尝试一下。另外,在声明一遍本人并非专业,这么瞎折腾完全因为兴趣爱好,若有错误,敬请指出,本人将不慎感激!!!
参考
https://www.cnblogs.com/platero/p/4123720.html
https://blog.csdn.net/longhr/article/details/51657610
https://www.linuxidc.com/Linux/2017-09/147112.htm
https://blog.csdn.net/u011054333/article/details/79905102
http://c-nergy.be/blog/?p=8952
(100%纯手打,未经允许 请勿转载)