文章更新

20170525 初次成文

问题提出

在实际网络环境中,树莓派常常处于内网环境下,由于内外网相互隔离的原因,我们无法在外网访问处于内网中的树莓派。为了解决这个问题,"内网穿透"技术应运而生。

FRP是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https协议。在这篇文章中,小苏将为大家介绍FRP服务端和客户端的配置,通过FRP,让树莓派穿透内网,使大家在外网环境下也能轻松访问处于内网中的树莓派~

本篇文章只做抛砖引玉目的 ,请大家在看完文章之后再仔细阅读一下FRP官方文档以了解详情~

解决方案

FRP是一个免费开源的项目,其代码托管在Github上:

FRP项目:
https://github.com/fatedier/frp/
FRP官方中文说明文档:
https://github.com/fatedier/frp/blob/master/README_zh.md
Release页面:
https://github.com/fatedier/frp/releases

FRP分为客户端程序和服务端程序两部分,其中,我们需要一台拥有公网IP的机器作为服务端。在Release页面,我们可以下载到已经编译好的适用于不同架构/平台的程序压缩包,每个程序压缩包中包含此架构/平台下的客户端和服务端。

截至本文发稿前,FRP的最近版本为0.10.0,这是一个包含了很多改动的版本,如果你使用的是旧版的frp程序,需要将客户端和服务端同时升级并重新配置。

由于树莓派的CPU是arm架构,所以我们需要下载frp_0.10.0_linux_arm.tar.gz,解压此文件后将得到:

frp_0.10.0_linux_arm
 ├─ LICENSE#版权许可
 ├─ frpc#arm架构的frp客户端程序
 ├─ frpc.ini#frp客户端配置说明文件
 ├─ frpc_min.ini#frp客户端最小化配置文件
 ├─ frps#arm架构的frp服务端程序
 ├─ frps.ini#frp服务端配置说明文件
 └─ frps_min.ini#frp客户端最小化配置文件

由于我们只需要arm架构的客户端程序,所以我们只需要其中的frpc这个文件,至于客户端配置文件,之后小苏会提供。

相似的,我们还需要获取FRP服务端程序,在此次配置过程中,小苏使用一台Debian系统,64位CPU的vps作为服务端载体,所以小苏需要在Release页面下载frp_0.10.0_linux_amd64.tar.gz,解压文件后得到:

frp_0.10.0_linux_amd64
 ├─ LICENSE#版权许可
 ├─ frpc#amd64架构的frp客户端程序
 ├─ frpc.ini#frp客户端配置说明文件
 ├─ frpc_min.ini#frp客户端最小化配置文件
 ├─ frps#amd64架构的frp服务端程序
 ├─ frps.ini#frp服务端配置说明文件
 └─ frps_min.ini#frp客户端最小化配置文件

相应的,frps这个文件是我们所需要的,其配置文件小苏之后会提供。

客户端(frpc)配置

得到所需文件后,我们开始配置frp的客户端程序:

使用SFTP连接到树莓派,将frpc传到树莓派的/bin目录,并且登入SSH,执行以下命令:

sudo chmod +x /bin/frpc
sudo touch /bin/frpc.ini
sudo vim /bin/frpc.ini

将以下内容粘贴进frpc.ini中,依实际情况修改后并保存(文末也提供单独的ini配置文件供大家使用):

[common]
server_addr = 123.123.123.123    #服务器公网IP
server_port = 7000    #frp服务端口,需与frps.ini相同
privilege_token = 123456      #特权模式密钥,需与frps.ini相同

log_file = /bin/frpc.log    #日志文件存储路径
log_level = info    #日志记录级别
log_max_days = 3    #日志最大存储天数
pool_count = 5
tcp_mux = true

[ssh]    #服务名称,可自定义
type = tcp    #协议类型(tcp)
local_ip = 127.0.0.1
local_port = 22    #本地SSH服务端口
remote_port = 2200    #穿透后SSH服务访问端口

[web]    #服务名称,可自定义
type = http    #协议类型(http)
local_ip = 127.0.0.1
local_port = 80    #本地web服务端口
use_encryption = false
use_compression = true
subdomain = web    #二级域名,建议与此项的服务名称"web"设置为相同
custom_domains = web.frp.com    #自定义域名

服务端(frps)配置

相似的,将frps文件上传到服务器的/bin目录下,登陆SSH,执行以下命令(命令基本相同,只不过上面是frpc这里是frps):

sudo chmod +x /bin/frpc
sudo touch /bin/frps.ini
sudo vim /bin/frps.ini

将以下内容粘贴到frps.ini中,依实际情况修改后保存(文末提供单独的ini配置文件供大家使用):

[common]
bind_addr = 0.0.0.0
bind_port = 7000    #frp服务端口,需与frpc.ini相同
vhost_http_port = 80    #http服务端口
vhost_https_port = 443    #https服务端口
dashboard_port = 7500    #控制台端口
privilege_token = 123456    #特权模式密钥,需与frpc.ini相同

log_file = /bin/frps.log    #日志文件存储路径
log_level = info    #日志记录级别
log_max_days = 3    #日志最大存储天数
max_pool_count = 5
authentication_timeout = 900

subdomain_host = frp.com    #服务端绑定域名
tcp_mux = true

值得说明的是,frps.ini中subdomain_host的域名需要泛解析到服务器的公网IP(比如*.frp.com),这个时候,如果客户端frpc.ini文件中的subdomain属性有定义(如web),则此服务绑定的域名为web.frp.com。

如果frpc.ini中定义了custom_domains属性,那么可以将custom_domains中提到的自定义域名解析到服务器所在的公网IP,方可正常使用该自定义域名访问此项服务。

在frps.ini中,vhost_http_port的值一旦被指定(如80),那么所有客户端中web服务映射到服务器中的端口都相同(都为80,比如http://web.frp.com:80),vhost_https_port同理。

dashboard_port属性指定了服务器的控制台端口(以7500为例),访问服务器ip:该端口(如http://123.123.123.123:7500),即可进入控制面板来查看frp服务的状态信息(默认用户名和密码都为admin)。

frpc.ini和frps.ini中注释未提到的内容可以在官方文档或压缩包中自带的配置说明文件frpc.ini/frps.ini中找到,未提到的内容大多为官方推荐配置,可直接应用。为节省篇幅,这里不再赘述。

测试frps服务(服务端)

配置文件配置完毕后,我们可以尝试在服务器端执行以下命令以启动frps服务:

(sudo) /bin/frps -c /bin/frps.ini

执行完毕后,frps服务将会在前台启动,且终端应该不会有输出(若终端有输出,可能在启动过程中出现了某些错误)。这时候我们使用Ctrl+C终止程序,执行cat命令查看日志文件:

(sudo) cat /bin/frps.log

如果日志文件中没有错误信息,那么说明frps服务端配置且启动正常。
Screenshot_20170525-215330~01.png

测试frpc服务(客户端)

类似的,在客户端(树莓派)中我们需要执行以下命令启动frpc服务:

sudo /bin/frpc -c /bin/frpc.ini

同理,执行完毕后,终端应该不会有输出,使用Ctrl+C终止程序,执行cat命令查看日志文件:

sudo cat /bin/frpc.log

若未出现错误信息,则说明frpc客户端配置且启动正常。
Screenshot_20170525-215015~01.png

启动FRP服务

将启动脚本(文末提供)startfrpc.sh传到客户端(树莓派)的/bin中,将启动脚本startfrps.sh传到服务端的/bin中,并且使用以下命令赋予这两个脚本可执行权限。

值得注意的是,在启动脚本中需要用到curl程序,## 若客户端/服务端中未安装curl,则应先安装curl## 。

sudo chmod +x /bin/startfrpc.sh #在客户端中执行
sudo chmod +x /bin/startfrps.sh #在服务端中执行

赋予可执行权限之后,在终端执行以下命令即可启动FRP:

sudo startfrpc.sh #客户端启动脚本
(sudo) startfrps.sh #服务端启动脚本

  

开机自启FRP服务

接下来,我们将让frps/frpc服务开机启动:

编辑客户端(树莓派)/etc/rc.local文件,在exit 0之前添加以下代码行:

# Start Frpc
/bin/startfrpc.sh >> /dev/null 2>&1

编辑服务端/etc/rc.local,在文件末尾添加以下代码行(如果文件末行为exit 0,则应该将以下内容添加到exit 0之前):

# Start Frps
/bin/startfrps.sh >> /dev/null 2>&1

这时,关机并重新启动客户端和服务端,待开机后,在客户端或者服务端中执行以下命令:

ps -A | grep frp

若返回类似结果则证明frps/frpc服务启动成功:

客户端:

1920 ?        00:00:00 startfrpc.sh
1925 ?        00:00:15 frpc

服务端:

1920 ?        00:00:00 startfrps.sh
1925 ?        00:00:15 frps

停止FRP服务

我们可以使用相同的命令查看FRP服务的PID,比如在服务端中执行:

ps -A | grep frp

例如终端返回:

1920 ?        00:00:00 startfrps.sh
1925 ?        00:00:15 frps

可以得到这两个进程的PID为1920和1925,我们可以使用kill命令杀掉这两个进程来停止FRP服务:

(sudo) kill 1920 1925

  
客户端停止流程同理。

资源下载

FRP.zip

解压此压缩包将会得到以下文件,对文件按需修改后按文章内容操作即可:

FRP
├─ frpc
│ ├── frpc.ini#未添加注释的示例frpc.ini
│ ├── frpc_note.ini#添加注释的示例frpc.ini
│ └── startfrpc.sh#frpc启动脚本
└─ frps
├── frps.ini#未添加注释的示例frps.ini
├── frps_note.ini#添加注释的示例frps.ini
└── startfrps.sh#frps启动脚本

文章更新

20170410 初次成文

问题提出

其实这篇文章构思很久了,拖到现在才写...原因就在于在Linux Deploy上部署图形环境是一件坑多活累的工作:一来是因为兼容性原因,部署好的图形界面环境存在数量可观的Bug,并且小苏也无力解决这些Bug。二来是因为基础的Linux环境才是图形界面环境部署的前提,而最近由于各种原因,使用原始的部署方法已经越来越难部署成功基础的Linux环境了。

但这样看来,第一点倒不是什么大问题:毕竟手机不是为运行专业的Linux发行版而生,所以存在Bug是难免的,只要图形界面能部署成功并且大家可以正常进入图形界面,小苏的任务就完成了。问题就在于第二点:由于国内网络运营商的DNS污染与镜像源站的同步原因,基础的Linux环境能否正常部署成功都是个问题,更别说图形界面的部署了。

解决方案

所以在这篇文章中,小苏将直接使用上一篇文章中提到的的方法,在此基础上部署图形环境:

Linux Deploy:使用Repository部署Linux系统

因为作者的Repository中包含了基础的Linux环境组件,我们可以将作者的Repository导入镜像来直接部署好Linux基础环境,再在此环境之上部署图形界面。这么一来,基础的Linux环境是否部署成功就不是我们担心的问题了。

所以在这里,小苏默认你已经阅读完上一篇文章的内容,并且根据上一篇文章的方法成功部署了基础的Linux环境。

进入Linux Deploy,点击右下角的"下载"图标进入配置界面,保持其他选项不变,修改以下配置项:

INIT:
打勾:启用自定义脚本执行
(INIT的其他配置保持不变)

图形界面:
打勾:允许图形界面启动
图形子系统:VNC
图形化界面设定:保持默认配置
桌面环境:按需选择,小苏这里选择的是Xfce
(实际上小苏也推荐大家选择Xfce,原因在于XTerm太过简陋,LXDE桌面环境倒是好一些,但是"ubuntu-lxde_arm"这个Repository是免费的,可以直接导入作者为我们部署好的ubuntu+ssh+lxde+vnc环境,而Mate桌面环境需要下载更多的软件包和依赖组件,且Bug数量更为可观)

2017-04-10_5_12_10_下午.jpg

2017-04-10_5_12_23_下午.jpg

2017-04-10_5_12_29_下午.jpg

配置完毕后,回到主界面,按下"菜单键",选择"配置"让我们刚才的的设置生效:

2017-04-10_5_21_25_下午.jpg

2017-04-10_5_21_31_下午.jpg

配置完毕后,点击底部的"停止"按钮停止Linux系统,再点击"启动"按钮启动Linux系统,接着我们登入SSH,在终端中执行:

sudo apt-get install ttf-wqy-zenhei #安装中文字库

中文字库安装完毕后,执行以下命令启动VNC:

vncserver

终端会返回以下结果:

New 'X' desktop is localhost:1

Starting applications specified in /home/android/.vnc/xstartup
Log file is /home/android/.vnc/localhost:1.log

证明vncserver已启动成功。

(注意,在某些时候,第一次执行vncserver命令时系统将要求你设定一个小于8位数的VNC密码,你需要输入两次密码之后提交,VNC密码设定完成之后还会有一个提示,不用理会,键入n提交即可)

进入图形界面

接着我们使用VncViewer来连接到我们刚刚部署好的的图形界面:

打开VncViewer,点击右下角的"+"按钮添加VNC会话:

Address:
127.0.0.1:5901
Name:
Localhost - Ubuntu@Xfce

其中,"Address"项为VNC服务器所在的地址。由于我们需要连接本机的VNC服务器,所以填写127.0.0.1即可,此外我们还需要在地址后指定VNC端口,因为刚刚终端返回的信息:New 'X' desktop is localhost:1指定了此次桌面会话号为1,所以端口就为5900+1=5901。如果我们开启了多个虚拟桌面,它们的会话号为2,3,4...,那么各自的端口即为5902,5903,5904...依次类推。并且,服务器地址与端口之间需要用英文冒号隔开。"Name"项为用户为此VNC会话指定的地址,我们为了区别其他会话,填写的是Localhost - Ubuntu@Xfce,实际上随便填写什么都可以。

这些信息填写完毕后,点击"CREATE"按钮提交:

2017-04-10_7_03_42_下午.jpg

2017-04-10_7_03_47_下午.jpg

确认信息无误后,点击下面绿色的"CONNECT"按钮开始连接VNC会话(如果你之前没有设定过VNC密码,但在连接VNC连接过程中仍然需要你输入密码时,那么你可以输入android用户的密码试试):

2017-04-10_7_08_13_下午.jpg

2017-04-10_7_08_19_下午.jpg

好了...图形界面的部署过程到此为止,剩下的你们自己折腾吧(/doge脸)~

可能遇到的问题

  1. 当你开启了一个VNC会话,停止Linux系统再启动Linux系统后,再次执行vncserver命令,系统可能会报出以下错误:

2017-04-10_9_03_44_下午.jpg

这时候,你可以执行以下两条命令:

rm -rf /tmp/.X[1-9]-lock
rm -rf /tmp/.X11-unix/X[1-9]

执行完毕后,再执行vncserver,会话号就会被重置为1了。为了防止每次停止再启动Linux系统后带来的这个问题,我们可以编辑/etc/rc.local文件,在此文件的exit 0之前插入这两条命令:

sudo vim /etc/rc.local #编辑/etc/rc.local

2017-04-10_9_13_26_下午.jpg

编辑完成后,保存即可,进行这步操作后,在启动Linux系统后和停止Linux系统之前,Linux Deploy都会替我们执行这两条命令,这样一来之后就不会再报错了~

  1. vncserver默认的分辨率是1024×768,但市面上的大部分手机屏幕的分辨率都是720P(1280×720),1080P(1920×1080),甚至2K(2560×1440),vncserver默认的1024×768分辨率可能会造成VNC画面不能填充满屏幕的情况,这时候,我们有必要修改VNC分辨率以适应屏幕,经过测试,拿小苏的1080P屏幕来说,将分辨率设为为720P可使VNC图像充满屏幕且不影响显示效果。调节方法就是在每次执行vncserver命令时在后面加上-geometry参数,例如我需要把VNC分辨率调为720P(1280×720),那么在启动vncserver时,执行:

vncserver -geometry 1280x720

即可将新开启的VNC虚拟会话屏幕分辨率设为1280×720。值得注意的是,命令中的1280x720里的x是小写字母x,而不是数学中的乘号×

下面是1280×720分辨率和1024×768分辨率的对比(将VNC Viewer画面缩小到最小):

2017-04-10_9_41_37_下午.jpg

2017-04-10_9_41_42_下午.jpg

很明显,在小苏的1080P屏幕上,将VNC分辨率设为1280×720可使图像填充满屏幕且视觉效果更佳。

如果你觉得每次启动vncserver时输这么一长串命令有点儿麻烦,那么可以编辑~/.bashrc文件,在下图所示的位置增加一行alias定义:

vim ~/.bashrc #编辑~/.bashrc

alias vncserver='vncserver -geometry 1280x720' 

2017-04-10_9_50_55_下午.jpg

之后,每次执行vncserver命令后,新开启的VNC会话的分辨率都会被设为1280×720。

资源下载(VNC Viewer)

酷市场:

http://www.coolapk.com/apk/com.realvnc.viewer.android

Google Play:

https://play.google.com/store/apps/details?id=com.realvnc.viewer.android

文章更新
20170408 初次成文

问题提出:
在之前的文章中,小苏为大家介绍过使用常规方式和使用镜像方式部署Linux系统的方法,但是这两种方法各有利弊:

使用常规方式部署时,镜像大小可以灵活调节,但这种方法需要设备在连接网络的情况下下载大量数据,由于运营商的DNS污染或者由于镜像源站同步的原因,即使更换软件源为国内镜像源,部署时也总会出现部署失败的提示。使用镜像方式部署Linux系统时,虽然可以免去部署时下载大量数据的麻烦,但是使用别人部署好的镜像,初始实现的功能依别人部署好的镜像而定,不能个性化定制系统,也不能调整镜像大小。

所以,有没有一种部署成功率比较高,又不需要从软件源站下载大量数据,且可以灵活调整镜像大小的部署方式呢?

答案当然是肯定的。那就是先在Linux Deploy中部署和安装所需要的环境和软件包,然后使用Linux Deploy的导出功能,将Rootfs打包为tar.gz文件,之后,我们只需要将此tar.gz文件导入Linux Deploy,就可以完整还原打包时的Linux系统了。

解决方案:
贴心的作者为我们做好了一些基础的Rootfs以方便我们部署Linux系统,这些Rootfs放置在Linux Deploy的"Repository"中,有些遗憾的是,这些Repository大多是需要到Play商店购买后才能被导入进Linux Deploy中的,但是小苏注意到,有一些Repository似乎可以无需购买,直接导入,比如debian_arm这个Repository:

2017-04-08_4_36_14_下午.jpg

导入此Repository后,回到Linux Deploy主界面,点击右下角的"下载"图标进入配置界面,我们可以看到"源地址"已经被配置为一个远程服务器上的tgz(tar.gz)文件:

2017-04-08_4_37_54_下午.jpg

我们观察这项配置:

http://hub.meefik.ru/rootfs/debian_arm.tgz

似乎就是http://hub.meefik.ru/rootfs/加上Linux Deploy中各"Repository"的名称。

我们拿一个需要付费的的Repository试一下:

http://hub.meefik.ru/rootfs/archlinux_arm.tgz

2017-04-08_4_48_17_下午.jpg

2017-04-08_4_50_19_下午.jpg

似乎还真的是可用的...
所以...看起来这是个彩蛋(喵喵脸)...

于是,在Linux Deploy中,各Repository的真实地址如下:

开始配置:
我们可以根据这些Repository下的提示,修改配置文件,由于各Repository的发行版,架构和版本都已经在说明中指定了,比如ubuntu_arm这个Repository:

ubuntu_arm
Ubuntu 16.04 LTS (Xenial Xerus) ARM base system.)

在描述中指定了此Repository对应的发行版是Ubuntu,版本是Xenial,架构为ARM(armhf)。这也意味着,我们必须在配置界面填写与选择的Repository相同的信息。比如我们选定ubuntu_arm这个Repository来部署Linux系统,那么我们只需要进行以下几步操作:

1.下载此tar.gz文件:

http://hub.meefik.ru/rootfs/ubuntu_arm.tgz

并且记好此文件的路径,下面以下路径为例:
/storage/emulated/0/Download/ubuntu_arm.tgz

2.新建一个配置文件,进入配置界面,做以下配置(未提到的项请保持默认设置):

Containerization method:chroot
发行版:Ubuntu
架构:armhf
发行版版本:xenial
源地址:/storage/emulated/0/Download/ubuntu_arm.tgz
(即刚刚下载的tgz文件存放的路径)
安装类型:文件
(即使用"镜像"方式部署Linux系统)
安装路径:自定
(安装路径代表镜像文件存放的路径,下图以/storage/emulated/0/Linux/ubuntu_arm.img为例)
镜像大小:自定
(即部署完成后,Linux系统的"本地磁盘"大小,下图以1024m为例,不建议超过4096m)
用户名:android
(即部署完成后,系统默认的普通用户)
密码:自定
(此普通用户的密码,下图以sun12345为例)
Privileged user:root messagebus
(这一项照着填就好)
本地化:zh_CN.UTF8
(即部署完成后,Linux系统的语言环境,zh_CN.UTF8指语言环境为中文,如果喜欢英文语言环境,选择en_US.UTF8即可)
SSH:
打勾:允许SSH服务器启动("SSH"的其他项保持默认设置)

2017-04-08_7_10_07_下午.jpg

3.配置完成后,我们就可以开始部署Linux系统了。在部署之前,小苏强烈建议大家挂国外梯子进行部署。因为在Repository中,作者使用各发行版的官方软件源作为软件源,这样一来,一是服务器节点远离中国,软件包下载速度一般都很慢,二是在我国ipv6还未普及,使用官方软件源在部署过程中有一定几率解析到ipv6地址,出现无法连接到服务器的情况并造成部署失败的情况。

挂好梯子后,我们回到Linux Deploy的主界面,按下菜单键,选择"安装"开始部署:

2017-04-08_7_20_02_下午.jpg

2017-04-08_7_20_53_下午.jpg

我们可以看到,从开始部署(19:15:19)到完成部署(19:17:05),仅仅用了1分44秒的时间就可部署完毕。并且整个过程中只需要下载附加组件(本次部署只启用了SSH连接,所以在部署过程中只下载了SSH有关的软件包,如果你启用了图形界面,在这个过程中还会下载图形环境和VNC等组件)。

如果你想部署图形界面,请看这篇文章:

Linux Deploy:部署图形界面环境

资源下载:
如果上面的官方Repository下载太慢或者无法下载的话,可以试试小苏离线到PCloud中的Repository:

PCloud:
https://my.pcloud.com/publink/show?code=kZVAOIZuQvQ3cdywbVO1WUMpW135Rfy1MjV
(但在网络通畅的情况下小苏还是首推官方的Repository,毕竟PCloud免费账户每月只有50G的下载流量/doge脸)

文章更新

20170328 初次成文
20170417 更正了有关Autojump的内容

问题提出

今天小苏要为大家介绍的是如何在树莓派上安装和配置zsh,zsh和系统默认的bash一样,都是Linux系统的一种Shell。相对于默认的bash来说,zsh的长处在于自定义与可扩展程度强,人性化程度高。在写这篇文章之前,小苏拿"树莓派 zsh"做关键词在Google上搜索了一下,搜索结果中似乎没有文章能比较系统地介绍如何在树莓派上安装和配置树莓派,所以干脆自己写一篇喽~

正文开始(以下内容默认针对于树莓派的默认用户pi):

安装zsh

首先我们执行以下命令查看一下系统对各Shell的支持情况:

cat /etc/shells

在终端返回的结果中,可能会看到/bin/zsh/usr/bin/zsh的字样,如果没有看到也没关系,我们可以接着进行下一步:

sudo apt-get update #更新软件源索引
sudo apt-get install zsh #安装zsh

zsh安装完成后,再次执行:

cat /etc/shells

不出意外的话,终端应该会返回包含/bin/zsh`0或/usr/bin/zsh字样的结果了。

基础配置

下面我们使用oh-my-zsh来配置zsh,oh-my-zsh是一个快速&自动化配置zsh的项目,项目地址:https://github.com/robbyrussell/oh-my-zsh

cd ~
wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh #下载并执行oh-my-zsh自动配置脚本

执行此命令后,脚本将会下载zsh所需的资源和配置文件至~/oh-my-zsh/目录,并将根据你的系统环境变量完成对zsh的配置。

接着,我们可以执行以下命令将zsh切换为此用户的默认Shell(可能需要pi用户的密码):

chsh -s /bin/zsh #无需加sudo

退出终端并再次登录终端,这时命令指示符应该有变化了,说明zsh的基础配置完成。

进阶配置

接着我们对zsh进行"进阶配置"(这里先说配置,之后会对这些配置进行解释):

我们通过更改~/.zshrc文件来对zsh进行进一步的配置:

cd ~
vim .zshrc #编辑zsh配置文件

根据小苏的习惯,对此文件的更改如下(以下内容已包含在原文件中,我们仅需要对其进行修改即可):

ZSH_THEME="blinks"    #将zsh的主题更改为blinks
ENABLE_CORRECTION="true"    #(去掉ENABLE前的"#")打开zsh的自动纠错功能
plugins=(git sudo)    #为zsh添加git和sudo插件

将以下内容添加到文件的末尾以重定向默认命令或添加自定义命令:

# Alias Settings
alias ll='ls -all'
alias vi='vim'
alias ps='ps -A'
alias ifconfig='sudo ifconfig'

其中,alias ifconfig='sudo ifconfig'这一句比较重要,如果不加此内容,在pi用户下可能会出现无法执行ifconfig命令的情况。

我们还可以安装Autojump插件,以实现快捷定位常用目录(需要在安装之前配置Python环境):

cd ~
git clone git://github.com/joelthelion/autojump.git #从Github克隆Autojump项目
cd autojump
sudo chmod 755 install.py
./install.py #执行安装脚本,安装Autojump

在脚本执行结果的末尾,你将会看到类似这样的内容(实际内容可能不一样):

[[ -s /home/pi/.autojump/etc/profile.d/autojump.sh ]] && source /home/pi/.autojump/etc/profile.d/autojump.sh
autoload -U compinit && compinit -u

复制终端中这段内容,添加到~/.zshrc文件末尾即可启用Autojump。接着,我们可以执行以下命令重载.zshrc文件以更新zsh配置:

source .zshrc #重载zsh配置文件

关于"进阶配置"的解释

1.开启自动纠错:

当纠错功能开启后,当你键入的命令被zsh判定为"可能错误的命令"时,将会提示你是否将此命令重定向为"zsh认为可能正确的命令",比如键入iconfig命令时,zsh将会返回以下提示:

zsh: correct 'iconfig' to 'ifconfig' [nyae]?

键入 y 即可将刚刚输入的iconfig命令重定向到ifconfig命令:

2017-03-28_6_21_49_下午.jpg

2.开启sudo插件:

开启sudo插件后,如果遇到上一条命令因为未在命令头部添加sudo命令而保存的情况时,只需要双击"Esc"键,即可自动为刚才键入的最后一条命令补全sudo。

3.重定向默认命令或添加自定义命令:

在.zshrc文件中添加alias字段即可重定向默认命令或添加自定义命令,如在终端中执行ll命令,相当于执行ls -all文件,执行ps命令则相当于执行ps -A命令:

2017-03-28_6_22_11_下午.jpg

4.添加并启用Autojump插件:

启用Autojump插件后,插件将记录你经常定位的目录,存储到数据库中,当之后想要访问此目录时,只需要键入:

j <目录简称>

即可快速定位。比如/var/www/html是我经常定位的目录。如果我想快捷访问此目录,只需要键入:

j html

即可快速定位。

Screenshot_20170417-101520.png

参考资料

oh-my-zsh配置你的zsh提高shell逼格终极选择:
http://yijiebuyi.com/blog/b9b5e1ebb719f22475c38c4819ab8151.html

高效Linux之autojump的安装、配置与使用:
http://www.linuxdiyf.com/linux/13711.html

2017-03-28_9_32_44_上午.jpg

文章更新

20170328 初次成文

  • 应用名称:Island
  • 应用包名:com.oasisfeng.island
  • 备注说明:仅支持5.0及以上ROM

  说到应用双开,在如今已经算不上是什么"黑科技"了,就连一些ROM厂商(如MIUI等)也想分一杯羹。今天呢,小苏要为大家介绍一款"不一样"的双开应用,虽然截至发文前该应用还处于"测试阶段",但是其功能可是不可小视的,可以说,Island是真正的"新黑科技"。

Island是"绿色守护"这款鼎鼎大名应用的开发者oasisfeng的新作品,主打"隔离"和"控制"这两项特性。Island通过为用户创建"工作资料"的方式,将"用户资料(岛外)"和"工作资料(岛内)"相隔离。并且用户可以对岛内的应用的启动和行为进行严格控制,而这一切,都不需要申请Root权限。

下载安装打开Island,你会看到一个"欢迎界面",点击"下一步",会进入"设置工作资料"界面,在这里,再次点击"下一步"授予Island"工作资料访问权限":

2017-03-27_11_58_36_下午.jpg

授予Island权限后,系统将会为Island设置"工作资料",所谓的"工作资料",相当于在系统中新建一个用户,这个新用户拥有和主用户平行的应用数据存放空间和文件存储空间。工作资料的建立可能需要一至两分钟的时间,工作资料建立完毕后,Island将会自动重启,看到这个界面,说明"工作资料"已经建立完毕,Island已经成功开辟了,值得一提的是,"用户资料(岛外)"称为"Mainland",将"工作资料(岛内)"称为"Island",在Island中,应用的数据,文件和权限与Mainland完全隔离。

2017-03-28_12_04_55_上午.jpg

点击左上角的下拉框我们可以在Island和Mainland间切换,点击Mainland中的应用,再点击弹窗上方的"+"按钮,我们可以将应用从Mainland添加到Island,在添加过程中,Island将会引导我们对选中应用为Island用户进行"二次安装","二次安装"只设计应用数据目录的创建,所以在此过程中,应用几乎是瞬间被安装完成的。安装完成后,我们可以在Island中看到我们刚刚安装好的应用:

2017-03-28_12_17_24_上午.jpg

点击此应用后,你可以点击右方的"启动"图标直接启动岛内的应用,也可以点击下方弹窗右上方的"菜单"按钮,选择"Create launch shortcut"将此应用的快捷方式发送到桌面,以便之后快速打开岛内应用。在使用岛内应用的过程中,我们可以发现,岛内应用的数据,权限都和岛外应用完全隔离,并且岛内岛外应用可以同时平行运行:

2017-03-28_12_24_23_上午.jpg

2017-03-28_1_14_44_上午.jpg

2017-03-28_9_20_45_上午.jpg

在Island界面,点击岛内应用,再点击弹框上方的"锁形按钮",可以"冻结"岛内应用,再次点击"锁形按钮",岛内应用将会被解锁。岛内应用一旦被冻结,应用的后台和前台行为都会受到禁止(和普通应用被冻结的效果相同),但应用的数据可以得到保留。应用解冻后,可以恢复正常使用。点击"绿叶"图标后,可以将岛内应用加入"绿色守护"(若已安装)的绿色化列表中,由绿色守护管理此岛内应用的后台行为。

2017-03-28_12_33_58_上午.jpg

当"工作资料"设置完成后,系统会将一些核心系统应用(如Google Play商店,Google Play服务,下载管理器,文件管理器等)自动放入岛内,这些应用在Island中可能是可见的,也可能是不可见的(不可见的应用在"设置 - 应用"中可以看到),目前小苏只建议在Island中冻结(即通过控制"锁形图标")或采用系统方式冻结被添加到岛内并且在Island中可见的应用,不建议对添加到岛内且默认在Island中不可见的应用进行任何操作,以免对系统的稳定性造成影响。

2017-03-28_9_00_55_上午.jpg

由于岛内岛外只共享应用本体,而其数据却互相分离,所以我们可以正常安装一个应用,将此应用添加到岛内后,将岛外的应用卸载,这样岛内的应用本体及数据可以得到保留,并且可以通过点击Island中"锁形图标"对控制岛内应用的"冻结"和"解冻"。这一点对于Root用户可能用处不大,但是对于未Root用户而言,可以实现在不获取Root权限的条件下对应用进行"冻结"和"解冻"的操作。这对于控制应用自启动,节省设备资源都是很有好处的。

同样,如果你想在岛内使用具有功能依赖关系的应用,必须同时在岛内安装一份这些应用的依赖应用才可实现依赖功能。比如"欢乐斗地主"需要用到QQ或者微信登陆,那么就需要将欢乐斗地主和QQ,微信一起安装在岛内,这样它们的功能依赖关系才可正常被实现。

另外,一些需要申请Root权限的应用,如R.E.管理器等,如果需要在岛内正常申请Root权限,需要使用SuperSU作为授权管理应用,并且在岛外的SuperSU中开启"启用多用户授权"特性,除此之外还需要在岛内也安装SuperSU才可正确对岛内应用进行Root授权操作。

值得注意的是,如果你的桌面支持应用抽屉,那么当一个应用被放入岛中后,会另外在应用抽屉中直接生成一个指向岛内应用的右下方带有"橙色公文包"图标,如果你的桌面没有应用抽屉,将会直接在桌面上生成这个图标,点击带有"橙色公文包"的应用图标即可快捷进入岛内应用。如果你想卸载岛内应用,可以在Island中,点击想要卸载的岛内应用,再点击右上方的菜单按钮,选择"Uninstall"即可卸载岛内应用。

如果你想卸载Island并且想清除所有岛内应用数据(包括在Island中不可见的系统应用),可以进行"设置 - 帐号 - 移除工作资料"操作。这一操作将清除所有岛内应用的数据,移除所有的岛内应用并且清除应用Island的数据。注意,这一操作是不可逆的,"移除工作资料"后,岛外应用的应用本体,数据及其文件不受影响。如果你不慎卸载了Island,你也可以使用这种方法清空岛内的资料。

2017-03-28_8_57_38_上午.jpg

注意

  1. 本应用处于测试阶段,仅可在安卓5.0及以上ROM上使用,并且也不保证在任何ROM上都可用作者不对使用该应用产生的任何问题负责
  2. 请尽量使用原生类ROM运行此应用,一些深度定制的ROM(如Flyme)可能不支持"工作资料"特性导致Island无法正常管理工作资料。
  3. 对于部分启动器,Island可能提示"此启动器应用不支持工作资料,您需要改用兼容的启动器",这种情况,需要换用支持的启动器(如Nova Launcher)才可正常使用Island。
  4. 岛内应用具有和岛外应用平行的数据/文件存储空间,其路径分别为:

数据存储空间:/data/user/10/
文件存储空间:/storage/emulated/10/

如果卸载重装过Island,或是清除过Island的工作资料后又重新设置了工作资料,存储/文件空间路径中的"10"可能为"11","12"或逐个递增。

参考资料

Island官方介绍页:
https://oasisfeng.github.io/island/

应用下载

酷市场:

http://www.coolapk.com/apk/com.oasisfeng.island

Google Play:

https://play.google.com/store/apps/details?id=com.oasisfeng.island

IMG_20170324_153933.png

文章更新

20170324 初次成文
20170417 更新了Gapps的说明

  • 应用名称:Button Mapper
  • 应用包名:flar2.homebutton
  • 备注说明:专业版

  在大多数屏幕下方带有实体按键的设备上,屏幕下方至少应该有3个实体按键(魅族等机型例外)。有时候我们因为习惯,喜好或者是其他原因,需要调换或者修改实体按键映射行为,在厂商附带的ROM中往往是受限制的(所谓的"按键映射",指的就是用户在按下按键后,系统所要执行的动作)。如果我们确实需要修改按键映射,往往需要将设备取得Root权限来修改系统键值配置文件,或者需要安装Xposed框架和对应模块(如Xposed Additions,GravityBox等)。这些对于非资深安卓用户而言,是非常不友好的,即使是对于资深用户而言,Root后修改系统文件或是安装Xposed框架,也是有一定风险的。那么有没有一种方法,能在无需Root的前提下做到修改按键映射呢?答案是肯定的,它就是小苏今天要介绍的主角:Button Mapper(七扯八扯终于扯回正题了)。

Button Mapper是一款利用"无障碍"服务来实现修改,添加甚至屏蔽按键映射功能的应用。可以在无需申请Root权限的情况下,对设备实体按键的按键映射进行修改。

Button Mapper支持识别按键的"单击/双击/长按"动作,支持修改"屏幕下方"的实体按键和机身侧面的"音量按键",支持自定义按键动作,支持自定义按键双击延迟及长按延迟等。

2017-03-24_3_32_06_下午.jpg

2017-03-24_3_33_01_下午.jpg

Button Mapper支持自定义以下按键映射:

  1. 自定义动作:
    此选项从上到下依次为:无动作,默认,主页,返回,最近任务,菜单,上一个应用,杀死前台应用,关闭屏幕,打开手电筒,电源菜单,截图,拆分屏幕,Tasker任务,勿扰模式,静音模式,音量增加,音量减少,上一曲,下一曲,播放/暂停,打开快速设置面板,打开通知面板,亮度增加,亮度减少,WIFI开关,自动旋转开关,搜索,Google Assistant,Google Now on Tap(部分特性需要7.0及以上系统版本或需要Gapps支持);
  2. 自定义应用;
  3. 自定义快捷方式。

2017-03-24_3_33_15_下午.jpg

Button Mapper还支持以下特性:

  1. Lockscreen Peek:在系统锁屏界面点击Home键来关闭屏幕;
  2. Swap back and recents:交换"返回键"与"最近任务键";
  3. Swap volume orientation:当屏幕处于横向状态时交换"音量+"和"音量-"键;
  4. Default to media volume:强制音量键控制媒体音量;
  5. Bypass SystemUI:当系统界面在屏幕上绘图时(比如下拉通知栏时),临时屏蔽Button Mapper;
  6. Bypass Camera/Phone:当摄像头正在工作或当设备处于通话状态时,临时屏蔽Button Mapper。
  7. Bypass apps:当用户指定的应用在前台工作时,临时屏蔽Button Mapper。

2017-03-24_3_33_41_下午.jpg

注意事项

  1. 如果应用安装后仍然提示"需要购买"(可能会在少数设备上出现),你可能需要为设备刷入Gapps套件。
  2. 因应用依赖"无障碍"服务,故应用需要始终运行在后台并且"无障碍"服务处于"开启"状态时,应用才能提供正常服务;
  3. 若ROM带有自定义按键映射功能,请在系统设置中将欲修改按键的按键映射设定为"无"后,再在此应用中设置(以防冲突);
  4. 部分机型在按键映射被修改为"菜单"时,可能会有短暂延迟;
  5. 在屏幕熄灭状态下,本应用无效。

应用下载

专业版(推荐/可能需要Gapps):

[Button Mapper- Remap your keys v0.36 [Pro].apk][6]

酷市场(原版):

http://www.coolapk.com/apk/flar2.homebutton

Google Play(原版):

https://play.google.com/store/apps/details?id=flar2.homebutton

2017-03-20_6_41_05_下午.jpg

文章更新

20170320 初次成文

  • 应用名称:批量文件命名助手
  • 应用包名:com.klangappdev.bulkrenamewizard
  • 备注说明:去广告版

  如果你经常折腾和整理各种文件,一定会有这样的体验:相比复制,剪切和目录归类来说,重命名往往是最累人的,尤其是当待整理的文件数量特别大的情况下。如果碰到一些情况必须要用手机重命名大量文件时,重命名可以说是"灾难"。但是小苏今天给大家推荐的这款应用却可以化解这场"灾难"。一起来看看吧~

"批量文件命名助手"是一款可以自定义重命名规则,并可以按照定义好的规则给文件和文件夹进行批量重命名操作的工具。重命名规则非常周到且灵活,并且支持正则表达式(Regular Expression)。你还可以将众多重命名规则按照一定的顺序排列起来,组成一个"重命名任务"以供之后多次使用,并且支持创建/读取/编辑/导入/导出任务。

听起来好像挺复杂,那么用起来如何呢?下面小苏举一个简单的例子:

比如我想重命名/storage/emulated/0/DCIM/100_CFV5(即Camera FV-5 用来存储照片的文件夹)下的照片文件,下载安装打开"批量文件命名助手",依次点击"重命名 - 重命名文件 - 添加文件",进入"/storage/emulated/0/DCIM/100_CFV5"这个目录,选择你想要命名的文件,点击"添加按钮"将文件添加到"待处理"文件列表中:

2017-03-20_5_38_53_下午.jpg

点击"继续",会进入"规则建造器"界面,在这个界面,你可以为待处理的文件自定义重命名规则。在"规则建造器"中,支持添加并排序多个重命名规则,重命名时将会按照设定好的规则,依次按照规则的先后排列顺序来执行重命名操作:

2017-03-20_6_05_37_下午.jpg

2017-03-20_6_05_47_下午.jpg

这里小苏将文件名称中的"DSC"改成了"Photo",并且使用正则表达式将文件名称中的"Counter"(就是文件名称后的照片计数)移除,在文件名称后加入了照片EXIF标签中的时间和日期,并且将文件后缀从大写的"JPG"改成了小写的"jpg",在"预览标签中可以预览重命名后的结果:

2017-03-20_6_05_56_下午.jpg

如果"预览"标签中的结果和预期效果一致的话,点击"继续"可以进入"命名选项",在这个界面中,你可以设定"是否将此次命名规则保存为任务","命名后文件的保存位置"和"文件名称出现冲突时的操作":

2017-03-20_6_15_32_下午.jpg

根据需要设定完成后,点击"完成"按钮开始命名,命名完成后,会通过通知栏和Toast发送通知,点击通知栏中的通知可以进入操作结果:

2017-03-20_6_18_38_下午.jpg

然后我们在文件管理器里面看一下此次重命名是否确实成功:

2017-03-20_6_20_23_下午.jpg

注意事项

  1. 由于重命名文件属于敏感操作,所以在使用此应用进行文件重命名操作时,请先将原文件复制一份副本,在文件副本上进行操作
  2. 此应用无法对存放于外置存储(如SD卡,OTG设备)及系统分区(如/data,/system分区)的文件进行重命名操作,因此在对外置存储或系统分区中的文件进行批量命名操作时,请先将文件复制到内部存储中再进行操作

应用下载

去广告版(推荐下载此版本):

com.klangappdev.bulkrenamewizard.apk

酷市场:

http://www.coolapk.com/apk/com.klangappdev.bulkrenamewizard

Google Play:

https://play.google.com/store/apps/details?id=com.klangappdev.bulkrenamewizard

如果你想了解正则表达式,请看这里:

正则表达式参考文档 - Regular Expression Syntax Reference