[TOC]
[玩轉(zhuǎn)樹莓派] 吊炸天的遠(yuǎn)程控制
Connect to Raspberry Pi
安裝好了系統(tǒng)娱颊,接下來我們就可以開始操作 Raspberry Pi 了郭膛。如果你不是拿來做家庭媒體中心横堡,看視頻之類粪薛,我們完全不需要給 Raspberry Pi 配置顯示器掘宪,通過遠(yuǎn)程連接工具就可以完成我們所有的日常操作穴肘。由于連接顯示器操作比較直觀歇盼,這里僅給大家介紹無顯示器的遠(yuǎn)程操作方法。
0x01 SSH
先看一段介紹评抚,來自維基百科:
Secure Shell(縮寫為SSH)豹缀,由IETF的網(wǎng)絡(luò)工作小組(Network Working Group)所制定;SSH為一項(xiàng)創(chuàng)建在應(yīng)用層和傳輸層基礎(chǔ)上的安全協(xié)議慨代,為計(jì)算機(jī)上的Shell(殼層)提供安全的傳輸和使用環(huán)境邢笙。
傳統(tǒng)的網(wǎng)絡(luò)服務(wù)程序,如rsh鱼响、FTP鸣剪、POP和Telnet其本質(zhì)上都是不安全的;因?yàn)樗鼈冊(cè)诰W(wǎng)絡(luò)上用明文傳送數(shù)據(jù)、用戶帳號(hào)和用戶口令筐骇,很容易受到中間人(man-in-the-middle)攻擊方式的攻擊债鸡。就是存在另一個(gè)人或者一臺(tái)機(jī)器冒充真正的服務(wù)器接收用戶傳給服務(wù)器的數(shù)據(jù),然后再冒充用戶把數(shù)據(jù)傳給真正的服務(wù)器铛纬。
而SSH是目前較可靠厌均,專為遠(yuǎn)程登錄會(huì)話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議。利用SSH協(xié)議可以有效防止遠(yuǎn)程管理過程中的信息泄露問題告唆。通過SSH可以對(duì)所有傳輸?shù)臄?shù)據(jù)進(jìn)行加密棺弊,也能夠防止DNS欺騙和IP欺騙。
SSH之另一項(xiàng)優(yōu)點(diǎn)為其傳輸?shù)臄?shù)據(jù)可以是經(jīng)過壓縮的擒悬,所以可以加快傳輸?shù)乃俣饶KSH有很多功能,它既可以代替Telnet懂牧,又可以為FTP侈净、POP、甚至為PPP提供一個(gè)安全的“通道”。
上面的介紹是不是太抽象~~還是我來說吧。折騰 Raspberry Pi 阳惹,ssh作為一個(gè)重要的遠(yuǎn)程連接工具(或者理解為把 Raspberry Pi 的終端拿到本地來)泣矛,日常操作中是必不可少的!在沒有顯示器的情況下,我們可以使用ssh完成絕大多數(shù)(甚至所有的)操作。因此,這里我必須著重介紹验懊。我們裝的 Raspbian 系統(tǒng)默認(rèn)是打開ssh的(否則在沒有顯示器的情況下我們是無法操作的,當(dāng)然你非得說用USB轉(zhuǎn)TTL也行)盯孙,因此鲁森,我們不需要做任何配置就可以直接使用ssh。
安裝SSH
Windows系統(tǒng)推薦使用免費(fèi)振惰、小巧歌溉、無需安裝、并且功能強(qiáng)大的ssh工具骑晶。
PuTTY
是一個(gè)Telnet痛垛、SSH、rlogin桶蛔、純TCP以及串行接口連接軟件匙头。
大家可以到他的官網(wǎng)下載,或者到這里下載仔雷,非常小蹂析,519KB舔示。打開是界面如下:
使用也是非常的簡單,在 Host Name(or IP address)
中填入你的域名或者IP电抚,在 Port
中填入你的端口惕稻,默認(rèn)是 22
(如果你修改了默認(rèn)端口,在此改成新的端口即可)蝙叛,然后點(diǎn)擊 Open
就開始連接俺祠,打開一個(gè) terminal ,按照提示操作即可:
Mac和Linux系統(tǒng)中默認(rèn)已經(jīng)安裝了 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@<your domain or ip>
命令肺然,按照提示輸入密碼即可:
? ~ ssh pi@ttdevs.com
pi@ttdevs.com'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 了狰挡,而且體驗(yàn)和直接登錄 Raspberry Pi 操作一樣捂龄。
修改端口號(hào)
如果你跟我一樣比較悲催——22端口 也 被電信封了(或者很不穩(wěn)定),那你就需要給ssh換(或者增加)一個(gè)端口加叁。如何判斷22端口是否被封了?最簡單就是如果你在內(nèi)網(wǎng)通過ssh可以訪問Raspberry Pi唇撬,外網(wǎng)卻訪問不了,那么22端口就有可能被運(yùn)營商或者你的防火墻給封了窖认。既然端口有問題,那最簡單的辦法換個(gè)端口扑浸,就可以規(guī)避這個(gè)問題烧给,下面介紹如何操作:
-
編輯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
喝噪。當(dāng)然你也可以直接把22改成你要設(shè)置的端口號(hào)础嫡。他們的區(qū)別是:增加一行可以增加一個(gè)ssh端口號(hào)。如上面的寫法酝惧,我可以使用ssh通過 22 或 2333 端口來訪問Raspberry Pi。 -
使配置生效
- 重啟ssh:
sudo service ssh restart
- 最簡單你也可以直接重啟設(shè)備:
sudo reboot
orsudo init 6
- 重啟ssh:
-
使用新端口登錄
使用新端口的登錄方式如下:
ssh -p <your new port> <username>@<ip-address or domain>
如:ssh -p 2333 pi@ttdevs.com
無密碼登錄
無密碼登錄就是把我們從每次登錄 Raspberry Pi 都需要輸入密碼的繁瑣中解脫出來晚唇。配置完成后,我們只需要 ssh <your domain or ip>
即可登錄我們的設(shè)備而不需要輸入密碼哩陕。
這個(gè)配置很簡單赫舒,只需要將我們的public秘鑰傳到Raspberry Pi的 ~/.ssh/authorized_keys
文件中即可闽瓢。執(zhí)行下面的命令(假設(shè)你的本地已經(jīng)生成了相關(guān)的key):
cat ~/.ssh/id_rsa.pub | ssh <username>@<ip-address or domain> 'cat >> .ssh/authorized_keys'
其中id_rsa.pub
為你的公鑰接癌。如果沒有問題鸳粉,當(dāng)你再次嘗試使用ssh登錄的話就不需要密碼了扔涧。如果有問題届谈,請(qǐng)參考這里枯夜。
0x02 VNC
雖然ssh可以完成我們的絕大多說操作艰山。但是如果習(xí)慣了圖形界面的你,一時(shí)半會(huì)很難上手這種命令行方式曙搬,會(huì)想有個(gè)桌面操作環(huán)境,那接下來我們介紹下VNC纵装,因?yàn)樗梢詽M足你對(duì)GUI的要求。VNC的配置橡娄,我們可以在如下 Raspberry Pi 官方文檔中找到。當(dāng)然挽唉,你也可以到VNC的官方網(wǎng)站查看。
安裝VNC
-
安裝VNC
我們可以使用這個(gè)命令來安裝VNC服務(wù):
sudo apt-get install tightvncserver
-
設(shè)置密碼
在啟動(dòng)服務(wù)之前瓶籽,我們需要設(shè)置一個(gè)訪問密碼,命令為
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:密碼無回顯
-
運(yùn)行一個(gè)vnc display
vncserver :1 -geometry 1920x1080 -depth 24
這樣你就可以通過VNC客戶端(如:VNC Viewer)連接到我們的樹莓派了,客戶端的配置茬暇,你可以參考這里。下面是我的效果圖:
VNC ViewerVNC Viewer logined- VNC Viewer中我們需要指定連接哪個(gè)display糙俗,由于我們上面用的是 display 1勒奇,因此地址寫:
ttdevs.com:1
- 另外,上面的命令是在display 1位置啟動(dòng)巧骚,如果你考慮節(jié)省資源可以關(guān)閉display 0赊颠,執(zhí)行命令:
service lightdm stop
- VNC Viewer中我們需要指定連接哪個(gè)display糙俗,由于我們上面用的是 display 1勒奇,因此地址寫:
配置VNC自啟動(dòng)
通過上面的配置我們就可以使用VNC了,但是如果我們重新啟動(dòng)設(shè)備竣蹦,之前的配置失效,VNC就連不上了痘括。因此最好能把啟動(dòng)VNC的操作添加到系統(tǒng)的自啟動(dòng)項(xiàng)中。具體操作如下:
切換到root賬戶:
sudo su
進(jìn)到/etc/init.d/目錄:
cd /etc/init.d/
創(chuàng)建vncboot文件:
touch vncboot
-
編輯vncboot文件纲菌,輸入下面內(nèi)容:
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的權(quán)限:
chmod 755 vncboot
設(shè)置VNC為默認(rèn)啟動(dòng):
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的密碼管理比較簡單嚣潜,詳細(xì)描述可以參考這里椅贱,下面做簡單描述:
-
修改密碼
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:設(shè)置新的密碼懂算,好像并不會(huì)驗(yàn)證你的舊密碼
-
忘記密碼
VNC的密碼文件存儲(chǔ)在:
$HOME/.vnc/passwd
中庇麦,如果你忘記了VNC的密碼,可以直接刪除這個(gè)文件山橄,運(yùn)行tightvncserver
即可使用新的密碼。
其他說明
- VNC默認(rèn)端口號(hào):
5901
- VNC配置文件:
~/.vnc
- VNC密碼文件:
/.vnc/passwd
0x03 SCP
講過上面的配置之后我們就可以通過這兩種方式來遠(yuǎn)程操作我們的樹莓派了驾胆。但是贱呐,有時(shí)候我們需要在本地和 Raspberry Pi 之間進(jìn)行文件拷貝丧诺,這里我們可以有很多種選擇奄薇,比如常見的FTP,SFTP等馁蒂。但是由于FTP的配置比較麻煩,而且必須以服務(wù)的方式在系統(tǒng)常駐沫屡,因此給大家推薦 SCP。SCP 是secure copy的簡寫沮脖,用于在Linux下進(jìn)行遠(yuǎn)程拷貝文件芯急。我們比較常見的 cp
命令和 scp
類似,不過cp
只是在本機(jī)進(jìn)行拷貝娶耍,不能跨服務(wù)器¢啪疲考慮網(wǎng)絡(luò)傳輸?shù)陌踩裕?scp
傳輸是加密的。默認(rèn)情況想鹰,我們的Raspberry Pi 已經(jīng)安裝了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系統(tǒng),默認(rèn)情況也已經(jīng)安裝了SCP命令惩妇。如果你使用的是Windows系統(tǒng),我們可以到這里下載WinSCP歌殃。
-
本地文件拷貝到 Raspberry Pi
-
拷貝本地文件file.txt到Raspberry Pi的用戶目錄下
scp file.txt pi@ttdevs.com:
-
拷貝本地文件file.txt到Raspberry Pi的用戶目錄下的raspi文件下,路徑為
/home/pi/raspi/
scp file.txt pi@ttdevs.com:raspi
-
-
Raspberry Pi文件拷貝到本地
scp pi@ttdevs.com:file.txt .
拷貝遠(yuǎn)程Raspberry Pi用戶目錄下的file.txt到本地的當(dāng)前目錄
-
多文件拷貝
scp支持多文件拷貝氓皱,我們可以一次指定多個(gè)文件或者使用通配符來進(jìn)行操作
-
指定多個(gè)文件
scp file.txt file2.txt pi@ttdevs.com:
-
使用通配符
scp *.txt pi@ttdevs.com:
-
拷貝文件夾
scp -r pi@ttdevs.com:/Users/jobs jobs
-
0x04 HTTP
為什么會(huì)提到這個(gè)呢勃刨?原因很簡單波材,在接下來的學(xué)習(xí)中大部分的編碼操作都會(huì)使用python來完成身隐。所以我們會(huì)安裝python語言,而且贾铝,默認(rèn)情況我們的Raspberry Pi已經(jīng)安裝了python 2.7版本隙轻。python2 中默認(rèn)包含了SimpleHTTPServer這個(gè)庫垢揩。因此我們可以直接拿來使用。說了這么多你還不知道這個(gè)東東是干嘛的叁巨。其實(shí)從名字中我們就可以看出來,他是一個(gè)http server俘种。既然是http server绝淡,那么我們就可以用來作為下載文件服務(wù)來使用,間接完成文件的拷貝牢酵。我們可以通過如下的命令來啟動(dòng)一個(gè)http服務(wù):
~ $ python -m SimpleHTTPServer 8088
Serving HTTP on 0.0.0.0 port 8088 ...
...
如果你想使用80端口(請(qǐng)確保沒有被運(yùn)營商封掉),請(qǐng)將8088改成80馍乙,sudo python -m SimpleHTTPServer 80
。啟動(dòng)好之后我們就可以在瀏覽器中通過打開 http://<your ip or domain>:8088
這樣的方式來訪問啟動(dòng)服務(wù)時(shí)那個(gè)位置下的所有文件丝格。如果你想從Raspberry Pi中拷貝文件到本地,那就在 Raspberry Pi 中啟動(dòng)服務(wù)显蝌,如果你想把本地文件拷貝到Raspberry Pi中,在我們本地啟動(dòng)服務(wù)即可曼尊。
至此脏嚷,我們可以真正開始Raspberry Pi 操作了~~
[圖片上傳失敗...(image-8d743d-1542686249382)]