上周出差,机器还在牙科候诊室的时候,运维群里连续三条告警,线上服务的健康检查没通过。当时手边只有一部手机,既不是开发机,也没有装什么“XX终端”App。情急之下我打开了Termux,敲了几条命令,登录跳板机,看一下负载和日志,十分钟内定位到是磁盘快满了,清了一批日志,服务自动恢复。
那次之后我就坚定了一个观点:在Android手机上值得安装一个真正的终端,而Termux是目前我把这个位置留得最久的选择。它不是浏览器里套一个WebShell,也不是某个云厂商App里的单点复制粘贴框,而是一个可以在本地跑着Linux用户态软件、自带包管理、能跑SSH客户端和服务端的完整终端环境。这篇内容就是记录我最近大半年用Termux做手机端SSH工作的实际操作,从安装配置、密钥管理、服务端开启,到路上排障和使用习惯,全部按我实际用下来觉得值得写的东西来聊。
1. 为什么手机上需要的是真正的终端而不是App或Web控制台
1.1 等飞机时真正会发生的场景
很多人的手机里其实已经装了云厂商的手机App,打开之后能看到监控大盘、能重启机器,看起来很方便。但真实运维场景往往是这样的:某台机器上有个进程还活着,但端口没监听;某条cron跑错了,要看日志;甚至只是需要进单用户模式修一下内核参数。这些事情,手机上那个App要么做不到,要么给你封装成了一个“点按钮执行脚本”的黑盒,你根本看不到中间输出,也没法按键盘上下翻历史命令。
这时候一个能直接ssh到服务器、跑普通Linux命令的工具,价值就体现出来了。手机上的终端,需要做到的并不是“能敲命令”这么简单,而是要能处理好密钥、多主机配置、断线重连、复制粘贴、特殊字符这些细节。Termux在这几条上做得都不错,最关键的是它是本地终端模拟器,不需要依赖某个网页中转页面,也不存在网页控制台掉线就什么都没了的情况。
1.2 和浏览器WebSSH、厂商App、其他终端模拟器的差异
我曾经认真对比过几条可用路径,包括手机浏览器打开WebSSH、厂商App内置终端、以及狂装好几个第三方终端模拟器。这里不点名,按实际感受说结论:
- 浏览器WebSSH:跨平台方便,但移动端浏览器在Ctrl组合键、右击、粘贴上有大量别扭的地方。经常是长按菜单弹出来,然后快捷键全废了。
- 厂商App:适合看监控和点按钮,不适合做连续操作。我经历过在某个App里粘贴一个长公钥,被界面吃掉换行符的事,最终放弃了。
- 普通终端模拟器:有些只是Shell,不带包管理,连ssh客户端都要自己想办法装,装完还可能在Android文件系统权限上卡住。
- Termux:本地终端、包管理完整、可以装openssh、rsync、git、python、甚至数据库客户端,而且不要求root。它解决的是“手机作为开发/运维终端”这件事的本体问题。
从本质上看,Termux跑的是Linux用户态工具链,通过pkg命令从软件源安装软件包。因为Android底层是Linux内核,Termux提供了一个隔离的用户环境,不需要root也能跑绝大多数命令行工具。这对运维和开发来说,等于手机里随身带了一台低频但完整的Linux小主机。
2. 第一次启动Termux时,先把这三件事做好
2.1 换源、更新、装包,别用默认源硬扛
Termux安装后第一件事,不是急着ssh,而是先把软件源调整到能顺畅访问的位置。默认源在国内访问速度不稳定,装软件包很容易卡在下载阶段。我自己是把源切换成交大镜像或者清华镜像,这一步做完之后,pkg install的速度才算正常。
具体操作很简单,打开Termux后先执行:
pkg update pkg upgrade -y如果update速度太慢,就需要手动改源。Termux源配置文件路径是$PREFIX/etc/apt/sources.list,新版本里一般会存放成sources.list.d下面的文件。修改方式就是编辑镜像地址,形如:
deb https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main stable main保存后重新执行pkg update,然后装我后续会用到的几个基础包:
pkg install openssh git rsync vim-python tmux htop2.2 存储权限要主动开,否则文件交互会一头雾水
Termux默认只能访问自己的私有目录,也就是~/下的Termux专属空间。你想读取手机下载目录里的一个压缩包,或者把服务器上下载的文件保存到手机相册文件夹,必须先在Termux里执行一次存储目录的绑定。
这个操作是用一条命令完成的:
termux-setup-storage执行之后系统会弹出一个文件访问权限请求,必须允许。之后Termux会在~/storage下生成几个软链接,其中~/storage/downloads对应系统下载目录,~/storage/dcim对应相册目录,~/storage/shared对应整个共享存储。实际运维中,我最常用到的是把日志文件拉到~/storage/downloads,然后用手机文件管理器转发给别人。
很多人在这一步会踩坑:没有执行termux-setup-storage,然后rsync或者scp下载文件时提示“Permission denied”,实际不是服务器权限问题,而是本地没有绑定存储路径。
2.3 保持后台运行的关键一锤子:wakelock
手机系统和Linux服务器有个巨大差异:Android会杀后台进程。如果你正在ssh到服务器处理到一半,屏幕一锁,Termux进程被回收,你的会话就直接断了。这个问题几乎每个人都会遇到。
配合Termux解决的办法是加唤醒锁,命令很简单:
termux-wake-lock执行后只要Termux进程还在,系统会尽量保持它不被挂起。我在长时间跑rsync同步或者等待某个服务启动时,都会先执行这条。如果配合termux-battery-status这类API能看电量状态,不过日常主用其实wakelock就够了。
还需要注意的是,部分国产ROM有更激进的清理策略,光靠wakelock可能不够。我的做法是把Termux加入后台运行白名单,并允许自启动。不同厂商的设置路径不一样,但思路是同一个:把Termux当作“需要常驻后台的工具”来对待。
3. SSH客户端模式下,把连接体验调到舒服的状态
3.1 用一行配置搞定多个服务器
Termux装了openssh后,直接使用ssh命令就能连服务器,例如:
ssh -p 22 root@192.168.1.10但每次输入账号、IP、端口很烦。更舒服的做法是写SSH配置文件。在Termux里执行:
mkdir -p ~/.ssh vim ~/.ssh/config然后在里面按主机别名来写配置,例如:
Host work HostName 203.0.113.10 User admin Port 22 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 30 ServerAliveCountMax 3配置完成后,连接时就只需:
ssh work我自己的习惯是把线上服务器、家里的Linux机器、还有偶尔用的某个实验室网关都写进config,然后用最简短的两个字母别名访问。ServerAliveInterval这个参数我想单独说一句:手机网络很不稳定,网络切换时SSH连接经常进入假死状态,设置30秒一个心跳包,能快速发现断线并自动重连,而不是卡在黑屏等你手动回车。
3.2 密钥登录配置时容易出错的三个细节
现在基本不会用密码登录服务器,全是密钥登录。在Termux上生成密钥和电脑上没什么区别:
ssh-keygen -t ed25519 -C "phone-key"生成之后,需要把公钥传到服务器。可以用ssh-copy-id:
ssh-copy-id -p 22 -i ~/.ssh/id_ed25519.pub admin@203.0.113.10如果服务器默认禁用了密码登录,就要手动把公钥追加到服务器的~/.ssh/authorized_keys里。这里容易出错的地方有几个:
第一,公钥文件名路径不要写错。Termux里的~是/data/data/com.termux/files/home,这是一个实际存在的Linux路径,但不等于Android的/sdcard路径。你在手机文件管理器里看的是/storage/emulated/0,在Termux里看到的~/是另一个隔离空间,两者不要混。
第二,上传公钥后要检查服务器端.ssh目录权限。服务器端~/.ssh应该是700,authorized_keys应该是600。权限不对时,密钥登录会被直接拒绝,而且服务器日志里不一定给出明显提示。
第三,如果密钥文件在手机上被其他App看到过,建议重新生成一次。手机环境没有服务器那么可控,尤其不要把私钥发到聊天工具里。
3.3 手机上SSH连接日常操作的一些手感优化
手机屏幕小,没有实体键盘的Ctrl键,一开始用会很不适应。Termux提供了一套屏幕上的额外按键配置,让Ctrl和Esc这类高频键能方便使用。我的做法是编辑:
vim ~/.termux/termux.properties把下面两项打开:
extra-keys-text-scale=1.6 extra-keys-style=top然后重启Termux,屏幕上就会出现一排自定义快捷键,我把ESC、CTRL、TAB、|、>放到了这一排。具体按键列表可以按个人习惯调整,我的体验是“有没有ESC”直接决定了在手机上用vim的舒适度。
另一个手感优化是使用tmux。手机屏幕不大,但tmux的多窗口和会话保持能力在弱网环境下特别有价值。我一般连上服务器后先执行:
tmux new -s work这样就算Termux退到了后台,或者网络闪断了一次,重新ssh进去之后执行tmux attach,还能回到之前的会话现场,不用重新敲一堆环境变量和命令。手机上跑tmux还有一个好处:在不太稳定的通勤网络里,命令输出都能留在原会话里,不怕屏幕清空。
4. 把手机变成应急服务端:在Termux上开启SSH Server
4.1 开启sshd的正确方式以及默认端口
Termux不仅能当客户端连别人,自己也能作为SSH服务端,让其他设备连过来。这个场景我实际用到过:家里有一台Android旧手机,装了Termux然后一直在后台跑几个小脚本,偶尔笔记本上需要一个文件,直接ssh到这台手机上取,比用数据线方便得多。
开启服务端的步骤不复杂:
sshdTermux的sshd有个默认端口,不是通用的22,而是8022。原因很简单:Android系统里普通应用没有权限监听1024以下的端口,所以Termux约定使用8022作为SSH端口。启动后可以用:
whoami查看当前用户名。默认情况下,Termux的SSH登录用户名是类似u0_a123这样的Android应用沙箱用户名,需要在连接时指定。
还要注意,用于登录的账号必须已经设置过密码或密钥。如果第一次用密码登录,需要先用passwd给当前Termux用户设置密码,否则sshd会把所有密码登录请求都拒绝掉。
连接方式就是从同一Wi-Fi的另一台设备执行:
ssh u0_a123@手机IP -p 80224.2 手机当服务器时不能省掉的安全措施
把手机开成一个SSH服务端,等于把你的一部分文件空间暴露在网络里,安全策略参考我的这三条:
一是尽量禁用密码登录,只保留密钥登录。在Termux的sshd配置里,修改$PREFIX/etc/ssh/sshd_config:
PasswordAuthentication no PermitRootLogin noTermux默认不允许root登录,保持no即可。
二是不要让sshd监听所有网络接口,改成只监听局域网地址。例如:
ListenAddress 192.168.1.100不过需要注意,手机通过Wi-Fi拿到的IP是DHCP动态分配的,这个IP变了之后监听地址也要调整。所以更省事的方法是先查看当前IP,再让它只监听Wi-Fi网段。如果只是临时使用,也可以直接用回默认监听再配合防火墙规则,但Termux上没有系统级iptables权限,所以最稳妥的办法还是仅监听可信网段。
三是私钥文件的权限一定要控制好。手机上多App并存,一个权限过宽的私钥文件被其他App扫描到,后果很严重。我在Termux里生成密钥后立刻执行:
chmod 600 ~/.ssh/id_ed25519 chmod 700 ~/.ssh4.3 运营商网络下的连接策略
手机直接开启SSH服务端,还有一个绕不开的现实问题:手机在运营商网络下通常没有公网IP,处在多层NAT后面。如果你的SSH服务端只想在局域网内用,那没问题,直接连内网IP就行。但如果你出差时想从外部连回家里那台手机,就会涉及NAT穿透。
在这个问题上,我的实践原则是:不推荐把端口直接映射到公网,因为风险太大。更好的做法是使用隧道类的连接工具,把手机的8022端口暴露到你自己的云服务器上。但这类方案涉及具体工具选型和安全配置,我建议普通用户还是保持“仅在家庭局域网内使用”这个边界最安全。我自己这样用了一段时间,既满足了远程拿文件的需求,又没有把Android设备的网络暴露范围扩大。
5. 高频故障排查:把手机上修连接的方式按链路拆开看
5.1 连接不上服务器时,先按链路查
手机SSH连不上服务器,原因往往不在手机上,但手机上排查链路更麻烦。我的排查顺序一般是:
ping 目标IP port 目标端口很多手机端没有直接测试TCP端口的工具,但我可以用一段短命令测:
timeout 3 bash -c 'echo > /dev/tcp/203.0.113.10/22' && echo open || echo closed这一步能确认TCP层通不通。如果TCP不通,问题大概率在防火墙或者网络层面,不是SSH配置问题。如果TCP是通的,再执行ssh -v来看具体卡在哪个阶段:
ssh -v -p 22 admin@203.0.113.10观察输出是“Connection refused”“Connection timed out”还是“Permission denied”。三者分别对应端口未监听、防火墙丢包、认证失败,处理方式完全不同。手机网络频繁切换的时候,我最常遇到的是TCP超时,因为Wi-Fi和4G切换的瞬间,原连接已经失效但客户端没感知,这时候打开ServerAliveInterval能明显改善。
5.2 复制粘贴和特殊字符:手机上SSH最影响效率的细节
我这个人的使用习惯里,手机上SSH最大的痛点不是网络,也不是速度,而是复制粘贴。服务器返回的一个长错误码,在手机上用鼠标选中很难受,Termux的解决方案其实很好用:长按屏幕就能进入选择模式,拖动选择后点复制,然后长按输入框粘贴。关键技巧是,选中之后不要松手直接拖动,否则容易误触退出选择模式。
粘贴还有一个坑:在vim里粘贴代码时,如果开了自动缩进,可能每粘贴一行就缩进一次,导致代码错乱。正确做法是在vim里先切换到粘贴模式:
:set paste粘贴完成后再:
:set nopaste或者在使用vim前通过vim -c 'set paste'直接进入。手机上操作本来就比电脑慢,这类细节能省下不少来回。
5.3 私有存储与Android系统文件之间的数据搬运方法
Termux里跑命令生成的日志,想导出给朋友看,前面提到过用~/storage/downloads可以解决。反过来,想把手机下载目录里的文件传到服务器,同样利用这个绑定路径:
scp ~/storage/downloads/files.zip admin@203.0.113.10:/tmp/这里再说一个常见需求:想在Android文件管理器的“文档”目录里直接看到Termux下载的内容,就需要先按2.2节的方法执行termux-setup-storage。有些版本里还需要在系统设置里重新允许Termux读写媒体文件。如果你发现执行scp到~/storage目录时提示只读文件系统,大概率是系统对这种绑定目录有限制,把目标目录换成~/storage/downloads或者~/storage/shared/Documents/这类常见目录试试。
6. 实测心得:最值得长期保留的几条Termux使用习惯
6.1 用Alisa把常用命令压成两三个字符
手机上敲长命令比电脑费劲,所以我把高频操作都做了别名。编辑~/.bashrc,加入如下配置:
alias c='clear' alias s='ssh work' alias lg='ssh work -t "tail -f /var/log/app/app.log"' alias deploy='ssh work -t "sudo systemctl restart app && sudo journalctl -f -u app"'实际使用效果是,出差路上出了问题,我打开Termux,输入lg直接看日志,输入deploy直接重启服务并跟踪日志,比自己一条条敲节省大量时间。
这里我建议别把所有任务都放到一个别名里面,尤其是重启服务这种有风险的操作,最好确认服务器端状态之后再执行。手机终端误触发的概率比电脑高,我现在给危险操作别名都会加一个确认步骤,例如先执行一条查询状态再手动执行重启。
6.2 Termux+Git:手机上的版本应急工作流
除了SSH,Termux另一个高频用途是Git。我在上面安装了git,并生成了专用的部署密钥。实际用过的场景有两个:
第一个是实现“服务器上改配置,先把diff发出来再决定是否提交”。手机上敲完git diff后,会用/storage/downloads保存一份diff文件,然后转发到群里讨论,比直接让所有人看手机屏幕方便。
第二个是利用git log的缩写格式快速确认线上代码版本:
git log --oneline -10手机上屏幕窄,完整hash根本显示不全,用--oneline看一行就够了。如果你要在手机上做代码回滚,建议先git stash保护好现场,再执行后续操作。
6.3 关于Termux使用边界的一些体会(给新手的建议)
最后一个想聊聊Termux的使用边界。很多刚接触的人会以为安卓手机装了Termux就是一台Linux服务器,于是把各种服务都塞进手机。但实际上Android系统的进程调度、文件权限、网络栈都和真正的Linux服务器有很大区别。Termux能处理的日常运维、轻量开发、远程连接、文件同步都没问题,别指望在手机上长期跑高负载服务。
我在使用中给自己画了一条清晰的线:手机上的Termux只做“连接、查看、短时操作、应急恢复”,不做“长时间挂机运行”。凡是需要每天7x24小时运行的任务,还是放到真正的云主机或者家里固定机器上。这个边界明确之后,Termux使用起来非常可靠,再也没有出现过把手机电量耗光、存储写满这些尴尬情况。
顺手分享一个小技巧:Termux里可以设置开机自动执行某些命令,比如把sshd加入启动脚本,这样重启手机后不用手动打开Termux就能保持SSH服务可用。方法是在~/.bashrc末尾加上一行:
if [ -z "$(pgrep sshd)" ]; then sshd; fi但这个做法只建议在你需要长期开放手机SSH服务并且做好了安全措施的情况下开启,不然默认还是手动管理服务更安心。