请稍侯

使用 ssh 和 vnc 访问树莓派

19 July 2015

拿到树莓派并安装系统以后,得想办法访问它。如果有显示器或者电视,可以通过 HDMI 线或 AV 线连接,然后插上鼠标和键盘直接操作,可是我没有任何显示设备,我只有一部笔记本,所以只能远程访问了。我一般使用 ssh 远程登录,以后的几乎所有的操作都是在 ssh 下进行的,偶尔会通过 vnc 连接图形界面。由于 vnc 没有内置,所以得先通过 ssh 登录,安装 vnc server,然后才可以通过 vnc 访问。

一、ssh 远程登录

将树莓派通过网线连接到路由器,使笔记本和树莓派在一个局域网里面。在笔记本上登录路由器后台,一般是 192.168.1.1,查看连接到路由器的设备。以我的渣斐讯路由为例,在『运行状态』『 DHCP 客户端』页面可以看到树莓派的 ip 地址是 192.168.1.106:

路由器后台管理页面

然后我们就可以通过 ssh 登录树莓派了。windows 下可以通过 PuTTY 连接,mac 和 linux 下直接在终端用 ssh 登录:

ssh pi@192.168.1.106

pi 用户的默认密码为 raspberry。

为了以后登录方便,不用输入密码,可以使用私钥登录。生成密钥对(公钥和私钥):

ssh-keygen -t rsa

保存位置直接选默认,这样生成的私钥为 ~/.ssh/id_rsa。

然后,将公钥 ~/.ssh/id_rsa.pub 拷贝到树莓派的 ~/.ssh/authorized_keys:

ssh-copy-id pi@192.168.1.106

或者用 sftp 传上去也可以,可能需要修改权限。

通过 ssh 登录以后,最好做一些基本的配置,比如修改一下软件源,运行 raspi-config 修改 locale 等,可参考 debian 的一些入门教程,此处略过。

二、安装并配置 vnc server

安装 tightvncserver:

sudo apt-get install tightvncserver

写一个简单的启动脚本 /etc/init.d/tightvncserver:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          tightvncserver
# Required-Start:    $syslog
# Required-Stop:     $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: vnc server
# Description:
#
### END INIT INFO

# Check the state of the command – this'll either be start or stop
case "$1" in
  start)
    # if it's start, then start vncserver using the details below
    sudo -u pi /usr/bin/vncserver :1 -geometry 1024x720 >/dev/null 2>&1 &
    echo "vncserver started"
    ;;
  stop)
    # if it's stop, then just kill the process
    pkill Xtightvnc
    echo "vncserver stopped"
    ;;
  *)
    echo "Usage: /etc/init.d/vncserver {start|stop}"
    exit 1
    ;;
esac
exit 0

可以在启动参数里设置分辨率、位深、像素格式等,此处设置分辨率为 1024x720。

然后,启动 vncserver 并设置成开机启动:

sudo chmod +x /etc/init.d/tightvncserver
sudo service tightvncserver start
sudo update-rc.d tightvncserver defaults

vncserver 启动以后,就可以在笔记本上通过 vnc viewer 一类的客户端去连接树莓派的桌面了。

事实上,连上了桌面也没有什么可以做的,而且有明显的闪烁,体验很差,所以我一般只有在用 wireshark 之类的工具时才用 vnc 连接。

由于 tightvncserver 是基于 X Window 系统的,所以像 kodi (xbmc) 这种没有使用 X Window 系统的应用启动了之后是看不到窗口的。如果想通过 vnc 查看 kodi 窗口(看视频就不要想了),可以使用 dispmanx vnc。dispmanx vnc 使用 video core 里面 dispmanx 相关的 api 获取屏幕快照,然后通过 libvncserver 实现 vnc 的 rfb 协议。具体编译安装过程请参照 README.md。