[TOC]
[玩转树莓派] 吊炸天的远程控制
Connect to Raspberry Pi
安装好了系统,接下来我们就可以开始操作 Raspberry Pi 了。如果你不是拿来做家庭媒体中心,看视频之类,我们完全不需要给 Raspberry Pi 配置显示器,通过远程连接工具就可以完成我们所有的日常操作。由于连接显示器操作比较直观,这里仅给大家介绍无显示器的远程操作方法。
0x01 SSH
先看一段介绍,来自维基百科:
Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定;SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。
传统的网络服务程序,如rsh、FTP、POP和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。
而SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
SSH之另一项优点为其传输的数据可以是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。
上面的介绍是不是太抽象~~还是我来说吧。折腾 Raspberry Pi ,ssh作为一个重要的远程连接工具(或者理解为把 Raspberry Pi 的终端拿到本地来),日常操作中是必不可少的!在没有显示器的情况下,我们可以使用ssh完成绝大多数(甚至所有的)操作。因此,这里我必须着重介绍。我们装的 Raspbian 系统默认是打开ssh的(否则在没有显示器的情况下我们是无法操作的,当然你非得说用USB转TTL也行),因此,我们不需要做任何配置就可以直接使用ssh。
安装SSH
Windows系统推荐使用免费、小巧、无需安装、并且功能强大的ssh工具。
PuTTY
是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。
大家可以到他的官网下载,或者到这里下载,非常小,519KB。打开是界面如下:
使用也是非常的简单,在 Host Name(or IP address)
中填入你的域名或者IP,在 Port
中填入你的端口,默认是 22
(如果你修改了默认端口,在此改成新的端口即可),然后点击 Open
就开始连接,打开一个 terminal ,按照提示操作即可:
Mac和Linux系统中默认已经安装了 ssh 工具,我们可以直接在命令行中操作即可:
➜ ~ ssh -V
OpenSSH_6.9p1, LibreSSL 2.1.8
➜ ~ ssh
usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-E log_file] [-e escape_char]
[-F configfile] [-I pkcs11] [-i identity_file]
[-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-p port]
[-Q cipher | cipher-auth | mac | kex | key]
[-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] [user@]hostname [command]
➜ ~
使用SSH
ssh的使用比较简单,直接在我们本地的终端中输入 ssh pi@
命令,按照提示输入密码即可:
➜ ~ ssh [email protected]
[email protected]'s password:
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Mar 31 17:38:44 2016 from 58.11.22.33
pi@raspberry:~ $
完成ssh的登录,你就可以在本地直接操作 Raspberry Pi 了,而且体验和直接登录 Raspberry Pi 操作一样。
修改端口号
如果你跟我一样比较悲催——22端口 也 被电信封了(或者很不稳定),那你就需要给ssh换(或者增加)一个端口。如何判断22端口是否被封了?最简单就是如果你在内网通过ssh可以访问Raspberry Pi,外网却访问不了,那么22端口就有可能被运营商或者你的防火墙给封了。既然端口有问题,那最简单的办法换个端口,就可以规避这个问题,下面介绍如何操作:
-
编辑ssh配置文件
/etc/ssh/sshd_config
修改端口sudo nano /etc/ssh/sshd_config # Package generated configuration file # See the sshd_config(5) manpage for details # What ports, IPs and protocols we listen for Port 22 Port 2333 ...
找到
Port 22
,在这行下面增加一行Port 2333
。当然你也可以直接把22改成你要设置的端口号。他们的区别是:增加一行可以增加一个ssh端口号。如上面的写法,我可以使用ssh通过 22 或 2333 端口来访问Raspberry Pi。 -
使配置生效
- 重启ssh:
sudo service ssh restart
- 最简单你也可以直接重启设备:
sudo reboot
orsudo init 6
- 重启ssh:
-
使用新端口登录
使用新端口的登录方式如下:
ssh -p
@
如:ssh -p 2333 [email protected]
无密码登录
无密码登录就是把我们从每次登录 Raspberry Pi 都需要输入密码的繁琐中解脱出来。配置完成后,我们只需要 ssh
即可登录我们的设备而不需要输入密码。
这个配置很简单,只需要将我们的public秘钥传到Raspberry Pi的 ~/.ssh/authorized_keys
文件中即可。执行下面的命令(假设你的本地已经生成了相关的key):
cat ~/.ssh/id_rsa.pub | ssh @ 'cat >> .ssh/authorized_keys'
其中id_rsa.pub
为你的公钥。如果没有问题,当你再次尝试使用ssh登录的话就不需要密码了。如果有问题,请参考这里。
0x02 VNC
虽然ssh可以完成我们的绝大多说操作。但是如果习惯了图形界面的你,一时半会很难上手这种命令行方式,会想有个桌面操作环境,那接下来我们介绍下VNC,因为他可以满足你对GUI的要求。VNC的配置,我们可以在如下 Raspberry Pi 官方文档中找到。当然,你也可以到VNC的官方网站查看。
安装VNC
-
安装VNC
我们可以使用这个命令来安装VNC服务:
sudo apt-get install tightvncserver
-
设置密码
在启动服务之前,我们需要设置一个访问密码,命令为
tightvncserver
,操作如下:pi@raspberrypi:~/.vnc $ tightvncserver perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_CTYPE = "zh_CN.UTF-8", LANG = "en_GB.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("en_GB.UTF-8"). You will require a password to access your desktops. Password: Verify: Would you like to enter a view-only password (y/n)? y Password: Warning: password truncated to the length of 8. Verify: New 'X' desktop is raspberrypi:5 Starting applications specified in /home/pi/.vnc/xstartup Log file is /home/pi/.vnc/raspberrypi:5.log pi@raspberrypi:~/.vnc $
PS:密码无回显
-
运行一个vnc display
vncserver :1 -geometry 1920x1080 -depth 24
这样你就可以通过VNC客户端(如:VNC Viewer)连接到我们的树莓派了,客户端的配置,你可以参考这里。下面是我的效果图:
- VNC Viewer中我们需要指定连接哪个display,由于我们上面用的是 display 1,因此地址写:
ttdevs.com:1
- 另外,上面的命令是在display 1位置启动,如果你考虑节省资源可以关闭display 0,执行命令:
service lightdm stop
- VNC Viewer中我们需要指定连接哪个display,由于我们上面用的是 display 1,因此地址写:
配置VNC自启动
通过上面的配置我们就可以使用VNC了,但是如果我们重新启动设备,之前的配置失效,VNC就连不上了。因此最好能把启动VNC的操作添加到系统的自启动项中。具体操作如下:
切换到root账户:
sudo su
进到/etc/init.d/目录:
cd /etc/init.d/
创建vncboot文件:
touch vncboot
-
编辑vncboot文件,输入下面内容:
sudo nano vncboot
#! /bin/sh # /etc/init.d/vncboot ### BEGIN INIT INFO # Provides: vncboot # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start VNC Server at boot time # Description: Start VNC Server at boot time. ### END INIT INFO USER=pi HOME=/home/pi export USER HOME case "$1" in start) echo "Starting VNC Server" #Insert your favoured settings for a VNC session su - $USER -c "/usr/bin/vncserver :1 -geometry 1280x800 -depth 16 -pixelformat rgb565" ;; stop) echo "Stopping VNC Server" /usr/bin/vncserver -kill :1 ;; *) echo "Usage: /etc/init.d/vncboot {start|stop}" exit 1 ;; esac exit 0
修改vncboot的权限:
chmod 755 vncboot
设置VNC为默认启动:
update-rc.d vncboot defaults
-
最后,完整脚本如下
pi@raspberrypi:~ $ sudo su root@raspberrypi:/home/pi# cd /etc/init.d/ root@raspberrypi:/etc/init.d# touch vncboot root@raspberrypi:/etc/init.d# sudo nano vncboot root@raspberrypi:/etc/init.d# chmod 755 vncboot root@raspberrypi:/etc/init.d# update-rc.d vncboot defaults perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_CTYPE = "zh_CN.UTF-8", LANG = "en_GB.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("en_GB.UTF-8"). root@raspberrypi:/etc/init.d# ls -al total 308 drwxr-xr-x 2 root root 4096 Mar 22 05:41 . drwxr-xr-x 109 root root 4096 Mar 21 15:01 .. -rw-r--r-- 1 root root 1745 Mar 22 05:43 .depend.boot -rw-r--r-- 1 root root 930 Mar 22 05:43 .depend.start -rw-r--r-- 1 root root 1009 Mar 22 05:43 .depend.stop -rw-r--r-- 1 root root 2427 Apr 6 2015 README ... -rwxr-xr-x 1 root root 699 Mar 22 05:42 vncboot -rwxr-xr-x 1 root root 2666 Sep 25 2013 x11-common root@raspberrypi:/etc/init.d# reboot
密码管理
VNC的密码管理比较简单,详细描述可以参考这里,下面做简单描述:
-
修改密码
vncpasswd
pi@raspberrypi:~ $ vncpasswd Using password file /home/pi/.vnc/passwd Password: Verify: Would you like to enter a view-only password (y/n)? y Password: Warning: password truncated to the length of 8. Verify: pi@raspberrypi:~ $
PS:设置新的密码,好像并不会验证你的旧密码
-
忘记密码
VNC的密码文件存储在:
$HOME/.vnc/passwd
中,如果你忘记了VNC的密码,可以直接删除这个文件,运行tightvncserver
即可使用新的密码。
其他说明
- VNC默认端口号:
5901
- VNC配置文件:
~/.vnc
- VNC密码文件:
/.vnc/passwd
0x03 SCP
讲过上面的配置之后我们就可以通过这两种方式来远程操作我们的树莓派了。但是,有时候我们需要在本地和 Raspberry Pi 之间进行文件拷贝,这里我们可以有很多种选择,比如常见的FTP,SFTP等。但是由于FTP的配置比较麻烦,而且必须以服务的方式在系统常驻,因此给大家推荐 SCP。SCP 是secure copy的简写,用于在Linux下进行远程拷贝文件。我们比较常见的 cp
命令和 scp
类似,不过cp
只是在本机进行拷贝,不能跨服务器。考虑网络传输的安全性, scp
传输是加密的。默认情况,我们的Raspberry Pi 已经安装了SCP, 可以通过直接在终端输入 scp
来查看,如:
$ scp
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 ... [[user@]host2:]file2
由于我用的是Mac系统,默认情况也已经安装了SCP命令。如果你使用的是Windows系统,我们可以到这里下载WinSCP。
-
本地文件拷贝到 Raspberry Pi
-
拷贝本地文件file.txt到Raspberry Pi的用户目录下
scp file.txt [email protected]:
-
拷贝本地文件file.txt到Raspberry Pi的用户目录下的raspi文件下,路径为
/home/pi/raspi/
scp file.txt [email protected]:raspi
-
-
Raspberry Pi文件拷贝到本地
scp [email protected]:file.txt .
拷贝远程Raspberry Pi用户目录下的file.txt到本地的当前目录
-
多文件拷贝
scp支持多文件拷贝,我们可以一次指定多个文件或者使用通配符来进行操作
-
指定多个文件
scp file.txt file2.txt [email protected]:
-
使用通配符
scp *.txt [email protected]:
-
拷贝文件夹
scp -r [email protected]:/Users/jobs jobs
-
0x04 HTTP
为什么会提到这个呢?原因很简单,在接下来的学习中大部分的编码操作都会使用python来完成。所以我们会安装python语言,而且,默认情况我们的Raspberry Pi已经安装了python 2.7版本。python2 中默认包含了SimpleHTTPServer这个库。因此我们可以直接拿来使用。说了这么多你还不知道这个东东是干嘛的。其实从名字中我们就可以看出来,他是一个http server。既然是http server,那么我们就可以用来作为下载文件服务来使用,间接完成文件的拷贝。我们可以通过如下的命令来启动一个http服务:
~ $ python -m SimpleHTTPServer 8088
Serving HTTP on 0.0.0.0 port 8088 ...
...
如果你想使用80端口(请确保没有被运营商封掉),请将8088改成80,sudo python -m SimpleHTTPServer 80
。启动好之后我们就可以在浏览器中通过打开 http://
这样的方式来访问启动服务时那个位置下的所有文件。如果你想从Raspberry Pi中拷贝文件到本地,那就在 Raspberry Pi 中启动服务,如果你想把本地文件拷贝到Raspberry Pi中,在我们本地启动服务即可。
至此,我们可以真正开始Raspberry Pi 操作了~~
[图片上传失败...(image-8d743d-1542686249382)]