2020-03-10 Update: Terminal Emulator for Android这个Android 4时代的app看起来停止维护了。在今天想要体会本文所描述的东西,不妨安装Termux。Termux不仅预置busybox,还提供apt这个强大的包管理器,简直就像一个Linux发行版。


网络上关于介绍Linux命令在的资料颇多,本文并不打算太多重复这些;相应地,本文通过分享一些可能并不是太常见但却很有用的应用实例,帮助读者(同时也帮助我自己)加深对类Unix的理解。

本文事实上是在介绍安卓系统下的shell以及一些有用的工具,以期“抛砖引玉”。对于那些没有兴趣或者耐心读注解的读者,以井号“#”打头的行可以跳过不看。

1 引言

1.1 本文的目标读者

对“安卓终端模拟器怎么用”这个问题感兴趣的人。虽然说我设想的读者是“有了一点点Shell基础的小白”,但是高手读了也不会感到乏味吧。

1.2 终端模拟器是个啥?

要回答终端模拟器是什么,首先要回答“终端”是什么。在那个遥远的年代,计算机的数量十分有限,而且几乎都是大型机。如果想要多人共用一台计算机怎么办?就是使用“终端”(Terminal)。Terminal在Oxford Learner's Dictionary中有这样一个解释:

(computing) a piece of equipment, usually consisting of a keyboard and a screen that joins the user to a central computer system

大概意思是Terminal是用来连接到中央计算机的一套包含键盘和显示器的设备。据笔者所知,终端使用串行通信协议和中央计算机进行通信。没错,就是本科数电和单片机讲的那个串行通信。显然,终端可以是一个复杂的计算机系统,但更多情况下终端都是较为简易的计算机系统(甚至单片机系统)。如果你手头有树莓派(Raspberry Pi)的话,可以把树莓派当作“中央计算机”,把你的PC当作“终端”,利用树莓派的串行通信接口和USB转TTL的器件(比如PL2303或者CH340)体验一回真正的“终端”。终端和串行通信具体细节已经远远超出了本文的范围,这里不再描述。

所谓终端模拟器,模拟的并不是终端和中央计算机通信这件事本身,而是终端的用户界面。简单地说就是“一个黑框框里面有个光标你可以敲一些命令完成你想要做的事情”。如果你用过DOS或者命令提示符或者Linux的“虚拟终端”,你肯定已经知道是什么了。今后本文在不引起误解的情况下,“终端”均指“终端模拟器”这类软件。

1.3 本文需要用到的软件/程序

(1) Terminal Emulator for Android(安卓终端模拟器),包名为jackpal.androidterm
(2) busybox,到各大应用市场搜busybox即可找到各种各样的busybox安装工具。有的ROM(比如我的MIUI)自带了busybox,这时就不必重新安装了。
(3) 好用的键盘,笔者使用的是Keyboard for Excel(有tab键但是没有ctrl)。你也可以使用Hacker's Keyboard这样的tab键、ctrl键都有的键盘。

1.4 在手机上使用终端模拟器的一些特点

(1) 能懒则懒——命令序列均封装成脚本或函数或别名(alias);
(2) 很多在Linux中熟悉的工具需要通过调用busybox实现;
(3) 文件名包含非ASIIC字符(比如中文字符)不总是很好地被支持,尤其是调用busybox的时候。

2 编辑脚本文件的方法

2.1 使用安卓或者PC系统上的文本编辑器

大多数文件管理器都内置了文本编辑的功能,如Total Commander、ES文件管理器等。如果你特别喜欢语法高亮,可以考虑一下Quick Edit,这是一个安卓上的支持多种程序设计语言高亮的app。

比如,你编辑了一个文件名为hello.sh的脚本文件,你写入了如下内容

#!/system/bin/sh
# 显示“Hello Android terminal”,然后退出
echo "Hello Android terminal"

# 这个脚本的第一行指示要用什么程序运行这个脚本,也就是所谓的释伴行(Shebang)。一定要写释伴行。虽然有某些方式允许你没有释伴行也能够成功执行脚本,但是不写释伴行是一件非常不严谨的事情。关于释伴行的更多知识可以参阅维基百科(https://en.wikipedia.org/wiki/Shebang_(Unix))
# 这个脚本的地第二行是一个注释。Shell脚本中,井号“#”之后的到所在行末尾的内容都不会被当作语句执行。
# 脚本的第三行是一条很简单的显示文本的语句。

2.2 使用busybox中的vi

关于vi以及vim的入门学习的资料请自行搜索,这里只介绍一些基本操作。
vi是一种有模式文本编辑器,分为编辑模式和命令模式。在命令模式中,通过hjkl四个键移动光标,键入:w写入(保存)文件,键入:q退出vi,键入:q!不保存直接退出vi。在命令模式下按下i(在光标位置插入)、o(在下一行插入)、a(在当前光标之后插入)都可以进入编辑模式。在编辑模式中按ESC返回命令模式。由于终端模拟器提供特殊按键映射,因此可以先按下音量+,再按下e来等效ESC。

键入

busybox vi hello.sh

编辑上述的hello.sh,并使用:w保存。

3. 运行脚本文件

3.1 "正常的方法"

假设你把这个hello.sh文件保存在了sd卡的根目录中,也就是说这个文件的位置是/sdcard/hello.sh中,你可以通过如下命令把它复制到终端模拟器的主目录中。
cp /sdcard/hello.sh ~/

# NOTE: 自动补全

# 如果你的终端支持自动补全的话,你可以试着只打出cp /sdcard/he,然后按tab键。如果支持自动补全,此时终端的输入缓冲区插入的不是制表位,而应该是补全了整个文件路径/sdcard/hello.sh

接着,赋予这个文件执行权限

cd ~ # 切回主目录

chmod 700 hello.sh # 给文件的所有者读取(r)、写入(w)和执行(x)权限

# NOTE: 安卓上的chmod和Linux的chmod的区别

# 你可能注意到了在Linux上通常采用的另一种写法

chmod u+x hello.sh

# 用不了,只能用八进制文件权限表示法。那么“700”这三个数字是什么意思呢?

# 在Linux文件权限中,文件权限的作用域有三个,分别是所有者(User)、所有者所在的组(Group)和其他人(Other)。每个作用域内可以管控的权限都是三种,即上文提到的读取(r)、写入(w)和执行(x)权限。把rwx看成一个三位二进制数(r表示最高位,w表示中间那一位,x表示最低位),那么便可以用每一个二进制位取0或者取1代表对应权限是“有”,还是“无”。
# 例如,如果要求只能读取,不能写入也不能执行,那么rwx=100,换算成八进制就是4。反过来说,八进制7对应二进制111,也就是说rwx=111。亦即允许所有权限。
# 由于文件权限作用域有三个,因此用于文件权限控制的二进制数实际上应该是rwxrwxrwx这样一个9位二进制数。高三位表示所有者权限(User),中间三位表示所在组(Group)的权限,低三位表示其他人的权限(Others)。也就是说,上面的700表示的是rwxrwxrwx=111000000。
# 对于一个脚本文件的执行,至少需要读(r)和执行(x)这两个权限。如果你的脚本想要被以root权限执行(如果你已经root了的话),那么这个文件的权限应该变成705或者755。

# 需要注意的是,作为一种安全机制,安卓系统为每一个安装的app都创建一个独立的用户和组。因此你在使用终端模拟器执行某个脚本的时候,实际上对应的用户是“终端模拟器”这个用户。

# NOTE: FAT文件系统不能保存文件权限!

# 这也就是为什么要复制到你的终端模拟器的主目录下的原因。SD卡通常是格式化成FAT格式的,这种格式不能保存文件权限标志位。如果你硬要在SD卡上chmod的话,会得到如下图的错误提示。

执行这个脚本

./hello.sh

成功的话应该能看到类似下图的输出。

3.2 简单粗暴的方法

这里的方法不需要复制到主目录,可以让脚本留在SD卡上,也不需要chmod
(1) 使用sh

直接执行

cd /sdcard/

sh hello.sh

(2) 使用source和.(一个半角句号)

cd /sdcard/
source hello.sh

# 或者
# . hello.sh
# NOTE: 有什么区别和联系呢?
# 首先,如果你使用简单粗暴的方法,那么你的脚本中可以没有释伴行(有也没关系),因为你在把hello.sh作为sh的参数执行的时候,已经明示了脚本解释程序为sh。在使用source的时候,你的脚本解释程序即为当前的shell(一般来说也是sh)。
# 区别是,如果你的脚本中包含变量声明、函数、别名,2.1节 “正常的方法”和使用sh的方法在脚本执行完成后会,这些变量不会保存在当前shell空间中,但是source相当于把脚本直接插入当前shell空间(这一点类似于C/C++中的#include)。source完了之后,脚本中的变量声明、函数、别名会保留在当前的shell空间中

# NOTE: 简单粗暴的方法只能由人类使用
# 如果你的脚本是http服务器的cgi脚本,那么你必须采用3.1节的方法——因为这时候调用脚本的是httpd,而不是某个shell!

4 实例

4.1 告诉我这周是这学期的第几周?

我经常想不起来这学期的这一周是这学期的第几周。这可不是什么好事,要是临近考试周,就要抓紧时间复习了才行。

busybox vi ~/weekofterm.sh

#!/system/bin/shstart=$(busybox date -d "2017-01-01 00:00" +%U)    # 为了演示假设有个从1月1日开始的学期
now=$(date +%U)
let count=now-start+1
length=19# 我校一学期只有可怜的19周
if [ $count -gt 0 ] && [ $count -le 19 ] ; then
let mod=count%10
case $mod in1)if [ $count -ne 11 ] ; thensuffix="st"elsesuffix="th"fi;;2)if [ $count -ne 12 ] ; then suffix="nd"elsesuffix="th"fi;;3)if [ $count -ne 13 ] ; thensuffix="rd"elsesuffix="th"fi;;*)suffix="th";;
esac
echo "Calendar: This is the ${count}${suffix} week of this term."
#echo
fi

chmod 700 ~/weekofterm.sh

执行
~/weekofterm.sh

4.2 探索所在局域网中有哪些主机在线

我的脚本中假设子网掩码是255.255.255.0

busybox vi ~/scan_online.sh

#!/system/bin/shif [ $# -ne 1 ] ; then
echo "Please supply a prefix, i.e. 192.168.1"
exit 1
fi
cat /dev/null > tmp
for i in $(busybox seq 1 254) ; do
ping -c 1 $1.$i >> tmp &
doneecho "Output stored in file tmp"
echo "run"
echo "    grep -i5 '1 received' tmp"
echo "to view"

chmod 700 ~/scan_online.sh

执行这个脚本

~/scan_online.sh 192.168.1

运行

grep -i5 '1 received' tmp

查看输出

标记有“1 received”的IP地址是在线的。

4.3 删除相册目录中总是在不断长大的.thumbnails (以及MIUI的最近任务缩略图 [需要root])

busybox vi ~/clean_thumbnails.sh

#!/system/bin/shif [ -d /sdcard/DCIM/.thumbnails/ ] ; then
(
cd /sdcard/DCIM/.thumbnails/
t=$(busybox ls -1a | busybox wc -l)
if [ $t -gt 2 ] ; thenecho "Cleaning cache..."rm -v .*rm -v *# 如果你使用了alias rm='rm -i',你可能想要执行如下的语句# busybox env rm -v .*# busybox env rm -v *echo    # 输出一个空行
fi
)
fi# 下面删除的是MIUI缓存的“近期任务”缩略图,非MIUI系统及未获取root权限的
# MIUI请注释掉或删除
if [ -d /data/system/app_screenshot ] ; thenecho "Cleaning cache..."su -c "rm -v /data/system/app_screenshot/*"    # 需要root权限
fi  

chmod 755 ~/clean_thumbnails.sh

4.4 下载bbcnewssummary

下载这个功能可以用curl、wget和aria2实现,笔者发现curl、wget并不是所有ROM都有。为了方便起见可以使用强大的下载工具aria2。
aria2的主页是https://aria2.github.io/,从那里你可以找到安卓版aria2的下载地址。

假设你已经把aria2的可执行程序aria2c下载下来,放到了/sdcard/aria2c这个位置。

cp /sdcard/aria2c ~/ # 复制到“终端模拟器”的主目录

cd ~

chmod 700 aria2c # 使其可执行

mkdir -p "/sdcard/Download/bbcnewssummary/"

busybox vi download_bbcnewsummary.sh

#!/system/bin/sharia2c -x10 \-d "/sdcard/Download/bbcnewssummary/"  \-o "$(date +%F_%H)hrs_bbcnewssummary.mp3" \http://wsdownload.bbc.co.uk/worldservice/css/96mp3/latest/bbcnewssummary.mp3

BBC news summary每小时更新一次,长度在5分钟以内。是非常好的练习英语听力的材料。

4.5 手机上的http服务器

这个功能实际上使用的是busybox的httpd组件。busybox httpd需要配置文件httpd.conf。配置文件可以参看下面的两个链接
https://wiki.openwrt.org/doc/howto/http.httpd
https://git.busybox.net/busybox/tree/networking/httpd.c

先做一些准备工作

cd ~

mkdir www

cd www

mkdir www-data # 用于存放网页等

busybox vi httpd.conf # httpd配置文件

busybox vi www-data/index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><title>演示</title>
</head>
<body><h1>演示标题</h1>
<div>这是一个演示的页面</div></body></html>

然后编写用于启动httpd服务器的脚本

busybox vi ~/www/android_startup.sh

#!/system/bin/shbusybox httpd -f -p 8080 -c ~/www/httpd.conf -h ~/www/www-data/
# 其中-f表示前台运行,方便使用Ctrl C关闭

chmod 700 ~/www/android_startup.sh

启动

~/www/android_startup.sh

停止
直接按ctrl c(也可以先按音量减再按c)

效果如图:

当然也可以做得更美观一点,不过网站设计与编程不在本文的讨论之列。

4.6 重启到recovery [需要root]

这个很简单……只有一行

su -c "reboot recovery"

4.7 禁用、启用手机上的app [需要root]

停止Google Play服务

su -c "pm disable com.google.android.gms"

启用Google Play服务

su -c "pm enable com.google.android.gms"

3.8 查看CPU温度【可能需要root】

cat /sys/devices/virtual/thermal/thermal_zone0/temp
如果permission denied,就只能以root身份执行了

su -c "/sys/devices/virtual/thermal/thermal_zone0/temp"

5 使用初始化文件

5.1 初始化文件简介

如同bash等shell一样,终端模拟器使用的默认shell也有初始化文件。这个初始化文件在shell启动时自动插入当前shell空间。
初始化文件主要用来设置PATH、别名、用户自定义函数、环境变量等。

5.2 默认的初始化文件/system/etc/mkshrc

这是我的MIUI系统的初始化文件。修改需要root权限,且系统升级后修改会丢失,因此不建议修改这个文件。

5.3 Terminal Emulator for Android的初始化命令

在终端模拟器的首选项中,找到Shell栏目的初始命令

这里如果填入source(或者一个点),使初始化命令插入一段脚本,即可达到目的。

5.4 使用.shrc

一个例子.shrc如下

# 设置自定义的PATH
export PATH=$PATH:/data/data/jackpal.androidterm/app_HOME/bin:/system/bin
# 增加一个LANG变量
export LANG=zh_CN.UTF-8
# 修改PS1变量,使得命令提示符不再只有一个“$”那么死板
export PS1='$?|[$USER@$HOSTNAME:$(busybox basename ${PWD:-?})] $ '
# 系统信息
function sysinfo()
{echo Machine type: `busybox uname -m`echo Hostname: `busybox uname -n`echo OS name: `busybox uname -s`echo OS release: `busybox uname -r`echo OS version: `busybox uname -v`echo Host processor type: `busybox uname -p`
}
# 挂载/system分区
function mount_system
{su -c "mount -o remount,rw /system"
}
# CPU温度
function cputemp
{su -c "cat /sys/devices/virtual/thermal/thermal_zone0/temp"
}
# 抓取当前activity
function current_activity
{echo "I will grasp current window focus in 3 seconds..."su -c "sleep 3 ; dumpsys window windows | grep -E mCurrentFocus"
}
# 设置别名
alias gping='ping -c 5 www.google.com'
alias which='busybox which'
alias grep='grep --color=auto'
alias rm='rm -i'
alias ifconfig='busybox ifconfig'
alias vi='busybox vi'
alias nc='busybox nc'
alias mkfifo='busybox mkfifo'#清屏
clear# 删除相册目录中的缓存
~/clean_thumbnails.sh
#显示日期和时间
echo "User logged in at `date`"
# 显示日历
busybox cal `date +%m` `date +%Y`
# 显示当前周次
~/weekofterm.sh
# 显示一个空行
echo
# 切到主目录
cd ~

6 小结

安卓系统上的Shell与Linux上的Shell有区别,但也有联系。有句话说“Where is a shell, there is a way.”,诚然本文所述远远不能表现Shell的强大,更不能完全展现安卓机上Shell的强大。本文文笔并不出众,内容也恐有疏漏,唯希望本文能成为一个启发读者的引子,希望读者读了之后能有恍然大悟,或者感到惊奇的感觉。

Terminal Emulator for Android(安卓终端模拟器)的使用相关推荐

  1. 安卓模拟器安装教程_安卓终端模拟器-安卓命令行入门教程系列(新手的福利)

    1,概述 终端模拟器类似于linux中的shell,是系统中的命令行模式.在桌面上能做的事情在命令行下也能做.比如 基本功能: A,打电话,发短信,打开网页 B,运行程序,安装卸载程序,改变程序安装位 ...

  2. 终端模拟器运行php,ROOT用户福利:安卓终端模拟器简述及命令行入门!

    本帖最后由 axmsn 于 2018-4-4 09:53 编辑 1,概述 终端模拟器类似于linux中的shell,是系统中的命令行模式.在桌面上能做的事情在命令行下也能做.比如 基本功能: A,打电 ...

  3. 蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载

    NES Emulator TV精选了上千款经典的红白机小游戏,我们小时候玩过的经典游戏都能够在这里找到,每一款游戏在这里都能够分别存档,没有太多时间的上班族可以尝试一下,给玩家带来最好的游戏体验. 软 ...

  4. 小鸡模拟器 android,安卓小鸡模拟器运行总结~

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用手机运行小鸡模拟器也下了不少游戏~测试10余天~种种错误~以下几点~ 1~FC模拟器~画面卡~时快时慢~爆音~各种调试~没有缓解~果断放弃~更换独立的F ...

  5. android模拟器背景色,安卓开发者必备的 5 款 App:终端模拟器、颜色萃取、移动 IDE 等...

    原标题:安卓开发者必备的 5 款 App:终端模拟器.颜色萃取.移动 IDE 等 编者按:Antonis Tsagaris是一名Android开发者,最近,他在博文中推荐了5款Android App, ...

  6. android模拟器背景色,安卓开发者必备的5款App:终端模拟器、颜色萃取、移动IDE等...

    安卓开发者必备的5款App:终端模拟器.颜色萃取.移动IDE等 摘要:原标题:安卓开发者必备的5款App:终端模拟器.颜色萃取.移动IDE等编者按:AntonisTsagaris是一名Android开 ...

  7. Win10安卓模拟器Visual Studio Emulator for Android使用简介(转)

    Visual Studio Emulator for Android是微软官方发布的独立版本的安卓模拟器,这款软件可以让安卓应用开发者更加轻松的用Visual Studio编写Android应用,据说 ...

  8. 终端模拟器编译c语言,编写你自己的Terminal emulator

    安装开发依赖环境 在apt包管理器系中,使用以下命令安装 apt install libvte-2.91-dev 介绍 VTE是一个使用GTK构建的一个终端模拟器库, 能够处理DPI的更改.很多终端模 ...

  9. Android下常见终端模拟器和SSH客户端感受及几个Tips

    之前用Linux Deploy 部署了Kali Linux .让我这阵子拿到平板有一半的时间是在用终端模拟器(Terminal Emulator)连接. 安卓的终端模拟器,对我来说有3个比较重要的用途 ...

  10. Android Studio 启动模拟器出现“Timed out after 300seconds waiting for emulator to come online“解决方案

    Android Studio 启动模拟器出现"Timed out after 300seconds waiting for emulator to come online"解决方案 ...

最新文章

  1. JAVA版连连看算法研究
  2. 《TCP/IP详解》之二:流式数据交互
  3. 让vs2008支持jQuery的智能提示!
  4. 一套 SQL 搞定数据仓库?Flink有了新尝试
  5. Python | 多种编码文件(中文)乱码问题解决
  6. php new static,PHP 的 new static 和 new self
  7. linux下批量下载站点内容初稿
  8. 蓝桥杯---2012--比酒量(暴力)
  9. 测试-分辨率兼容测试
  10. IntelliJ IDEA 如何设置黑色主题,界面字体大小以及内容字体大小
  11. 查看计算机桌面隐藏文件夹,怎么查看隐藏文件?2种方法教你查看电脑中的隐藏文件...
  12. 2级c语言题库及答案,2019-C语言二级考试题库(含答案)
  13. 关于AutoCAD软件的PDF打印机的问题
  14. 倾斜摄影与三维实景建模技术设计书.PDF(文档可下载)
  15. luogu4234 最小差值生成树
  16. Power BI_柱状图中间空一列_横坐标显示
  17. 目标检测使用的数据增强方法汇总
  18. Java SE 005 运算符 续
  19. 大商创小程序源码_小程序直播系统有哪些基本功能
  20. 国内公募REITs火了 5月31号3多亿亿明天开抢!怎么买?买哪只?10问10答解读来了

热门文章

  1. 什么是RF、IF信号
  2. [rust学习笔记]错误处理
  3. Vue.js---关闭语法检查
  4. FPGA,关于安装使用libero IDE V9.2 及其gold floating license配置
  5. DBC文件解析,基于致远电子DBC_demo
  6. DAEMON tools lite “至少SPTD ..与 Windows 2000或更高版本” 报错的解决
  7. git pull失败解决 git下“The following untracked working tree files would be overwritten by checkout
  8. 5G核心网技术基础自学系列 | 用户面处理
  9. Jsrpc学习——Cookie变化的网站破解教程
  10. as3种常见的弹性效果公式以及波形运动等as3动画效果公式代码整理