0%

termux 部署

Termux 实用教程

说明:(系统换源 自己百度 主要参考 :

Termux-Ubuntu22.0.4项目部署(手机服务器实操!!)_termux安装ubuntu-CSDN博客

PVE系列教程(二十)、ubuntu22.04安装gitlab服务器_勤奋的凯尔森同学的博客-CSDN博客

termux 进行 ssh 连接

手机端操作,打开 Termux , 当然你得去下载 Termux
1.调出出控制辅助按键

1
音量上 + q

这里推荐使用 Google 中文输入法,有些键盘英文不会直接上屏,所以无法成功

2.常规操作一波升级

输入命令

1
2
apt update
apt upgrade

3.安装 ssh 和用户管理模块

1
2
apt install openssh
pkg install termux-auth

4.获取用户名

1
whoami

输出结果如: u0_a333

5.设置密码

passwd
6.查看本机 ip

ifconfig

1
如 inet addr: 192.168.0.124

7.设置 ssh 端口 为 9000

1
sshd -p 9000

电脑端操作
打开 powershell 输入

1
2
ssh u0_a333@192.168.0.124 -p 9000
语法 ssh [用户名]@[IP 地址] -p [sshd 设置的端口]

然后回车输入刚才设置的密码就 OK 了

如果提示:
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

则清空电脑端 {user}/.ssh/known_hosts 文件的内容就行

后记

1
然后你就可以通过 ssh 利用 apt 或者 pkg 命令安装 node , git , Python , DB ,sftp 等软件或者协议,接下来你的手机就可以变成一台服务器了,而且是性能强劲的服务器!

如果想要通过电脑端管理手机存储内的文件:

1
ssh 连接后可以执行 termux-setup-storage 命令,把存储卡挂载到 /data/data/com.termux/files/home/storage/shared 目录下这样就可以用 cd <path>命令访问手机存储的目录了

前提是 Termux 拥有访问存储的权限,就一般软件的权限设置一样

你甚至可以通过 tsudo 命令来获取 root 权限来操控手机系统软件和文件(前提是手机得 root,并且 root 权限已经分配给给 Termux)

接下来你就可以使用一般的 linux 命令来操控你的手机了

ssh下载与上传

从服务器下载东西到本地windos

1
scp -r -P 9000  root@192.168.0.119:~/storage/pictures/1.jpg   D:/

image-20231107202542223

在本地windos上传东西到服务器

1
2
3
scp -r dist root@192.168.0.133:/usr/local/project/forward/web/

# dist 是windos的文件夹子 ,-r 递归上传 ,/usr/local/project/forward/web/ 服务器的地址

自动启动 ssh

具体操作:

  1. 添加或编辑文件 ~/.bashrc :

  2. 添加如下内容并且保存。
    好了 手机上重启termux,会发现ssh启动信息显示

电脑到链接如图:

——- 分割线 ——-

termux 默认是 bash,配置文件~/.bashrc

如果终端改为了zsh,就需要改动~/.zshrc

内网穿透

参考 :

https://blog.csdn.net/qq_58286439/article/details/131017803

使用Termux在Android手机上搭建公网远程Web服务器的详细教程_安卓手机成为外网服务器-CSDN博客

概述

Termux是一个Android终端仿真应用程序,用于在 Android 手机上搭建一个完整的Linux 环境,能够实现Linux下的许多基本操作,不需要root权限Termux就可以正常运行。

Apache是一个开源网页服务器软件,由于其跨平台和安全性,被广泛使用,是最流行的 Web 服务器软件之一。我们可以在Android手机上使用Termux来搭建Web服务器,同时做内网穿透,实现公网用户也可以访问,将Android变成小型的云服务器。

下面介绍在安卓Termux上搭建apache服务创建个人站点并且结合cpolar内网穿透工具实现公网访问。

搭建 apache

执行命令安装apache,安装相对简单,一键安装即可

1
2
pkg install apache2
1

然后启动apache

1
2
apachectl start
1

启动的时候如出现以下问题

image-20230510150038202

解决方法,修改配置文件,如果没有安装vim,执行命令安装一下

1
2
pkg install vim
1

编辑修改配置文件

1
2
vim $PREFIX/etc/apache2/httpd.conf
1

找到ServerName解开注释,www.example.com改为127.0.0.1:8080,端口号可以自己改成自己喜欢的

image-20230510151133736

修改后再次启动,即可

image-20230510151344686

打开浏览器,输入http://127.0.0.1:8080,即可看到apahe欢迎页面,

image-20230510151540948

停止apache

1
2
apachectl stop
1

重启apache

1
2
apachectl restart
1

安装cpolar内网穿透

cpolar官网:https://www.cpolar.com

成功创建了运行站点的一个apache容器后,我们接下来用cpolar做内网穿透来实现公网环境下的访问。

cpolar它是一个安全的内网穿透云服务,支持http/https/tcp协议,可以永久免费使用还不限制流量,支持映射80/443端口。它可以通过创建安全隧道,将本地服务暴露到公网上,让公网用户也可以正常访问内网服务,不需要公网IP,也不用设置路由器。

创建一个sources.list.d的文件夹:

1
2
mkdir -p $PREFIX/etc/apt/sources.list.d
1

添加cpolar下载源文件

1
2
echo "deb [trusted=yes] http://termux.cpolar.com termux extras" >> $PREFIX/etc/apt/sources.list.d/cpolar.list
1

更新仓库

1
2
pkg update
1

安装cpolar

1
2
pkg install cpolar
1

安装termux服务

注意:安装完成后记得关闭重启一下termux 才生效!!

1
2
pkg install termux-services
1

重启完termux后,然后启动cpolar

1
2
sv up cpolar
1

设置开机自启

1
2
sv-enable cpolar
1

这个是停止cpola服务

1
2
sv down cpolar
1

cpolar.yml主配置文件路径位置

1
2
$PREFIX/etc/cpolar/cpolar.yml
1

然后在手机浏览器我们输入http://localhost:9200即可看到cpolar管理界面,使用在cpolar官网注册的邮箱账号即可登陆

image-20230509155942139

公网访问配置

手机浏览器打开cpolar web ui管理界面,我们点击左侧仪表盘的隧道管理——创建隧道,由于apache上面我们修改配置文件是8080端口(文章是8080,具体端口号以自己的端口为准),因此我们要来创建一条http隧道,指向8080端口:

  • 隧道名称:可自定义,注意不要重复
  • 协议:http
  • 本地地址:8080
  • 域名类型:选择随机域名
  • 地区:选择China VIP

点击创建

image-20230510153916787

创建成功后打开在线隧道列表,可以看到公网访问的地址,有两种访问方式,一种是http,一种是https

image-20230510155122769

我们使用http方式,在浏览器输入公网地址,即可访问成功

image-20230510163512036

固定公网地址

由于上面创建的是免费随机隧道,所生成的公网地址会在24小时内随机变化,为了方便长久稳定连接,我们可以固定这个公网地址,配置一个cpolar固定的二级子域名【无需备案】,或者也可以配置使用你自己的域名来访问,这里我们以配置固定的二级子域名来举例。

需升级至基础套餐或以上才支持配置二级子域名

登录cpolar官网后台,点击左侧仪表盘的预留,找到保留二级子域名,为http隧道保留一个二级子域名。

  • 地区:选择服务器地区
  • 名称:填写您想要保留的二级子域名(可自定义)
  • 描述:即备注,可自定义填写

image-20230510171738839

本例保留一个名称为mywebsitetest的二级子域名。子域名保留成功后,我们将子域名复制下来,接下来需要将其配置到隧道中去。

image-20230510171806128

登录cpolar web ui管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到需要配置二级子域名的隧道,点击右侧的编辑

image-20230510171929758

修改隧道信息,将二级子域名配置到隧道中:

  • 域名类型:改为选择二级子域名
  • Sub Domain:填写我们刚刚所保留的二级子域名(本例为mywebsitetest

修改完成后,点击更新

image-20230510172124742

隧道更新成功后,点击左侧仪表盘的状态——在线隧道列表,可以看到隧道的公网地址,已经更新为二级子域名了.

image-20230510172216408

固定后我们使用固定的公网地址,在浏览器中打开,即可看到apache默认页面,这样一个固定的公网地址访问就设置好了

image-20230510172352811

添加站点

上面我们访问的页面是apache默认页面,不是我们希望的页面,我们可以把自己喜欢的页面放上去,进入apache htdocs文件夹

1
2
cd $PREFIX/share/apache2/default-site/htdocs
1

安装下载工具wget

1
2
pkg install wget
1

这里做演示,我们下载一个测试站点

1
2
wget https://www.cpolar.com/static/downloads/meditation-app-master.tar.gz
1

下载好后解压

1
2
tar xzf meditation-app-master.tar.gz
1

然后我们在浏览器上面输入上面我们的公网地址加上资源路径/meditation-app-master/index.html,就可看到我们的个人站点啦。

现在只要保持隧道为正常在线状态,公网用户就可以通过这个固定公网地址来访问到我们在termux上搭建的web站点。

3、 安装KodBox

安装基础工具

更换源之后来赶紧来下载安装一些基本工具吧,这些工具基本上是 Linux 系统自带的,因为 Termux 为了体积不过大,默认是没有带这些工具的,执行下面的命令来安装:

1
2
BASHpkg update
pkg install vim curl wget git tree -y

终端配色方案

脚本项目地址https://github.com/Cabbagec/termux-ohmyzsh/

执行下面这个命令确保已经安装好了 curl 命令

1
sh -c "$(curl -fsSL https://github.com/Cabbagec/termux-ohmyzsh/raw/master/install.sh)"   #安装配色命令

手机 App 默认只能访问自己的数据,如果要访问手机的存储,需要请求权限,如果你刚刚不小心点了拒绝的话,那么可以执行以下命令来重新获取访问权限:

1
termux-setup-storage

脚本允许后先后有如下两个选项:

1
2
BASHEnter a number, leave blank to not to change: 14
Enter a number, leave blank to not to change: 6

分别选择色彩样式字体样式,重启 Termux app 后生效配置。

设置色彩样式

输入 chcolor 命令更换色彩样式,或者执行 ~/.termux/colors.sh 命令

设置字体

运行 chfont 命令更换字体,或者执行 ~/.termux/fonts.sh 命令

安装Kodbox

参考

https://blog.csdn.net/YiBYiH/article/details/127503804

https://www.jianshu.com/p/c7d2cffa1998

基础环境配置

必须安装的依赖nginxphp
具体的配置在这:《Termux开发环境搭建》-Nginx,这里就简单叙述一下:

安装相应组件:

1
2
pkg install nginx php php-fpm -y
1

配置php:

1
2
vim $PREFIX/etc/php-fpm.d/www.conf
1

找到:listen = /data/data/com.termux/files/usr/var/run/php-fpm.sock修改为: listen = 127.0.0.1:9000

配置Nginx对PHP的代理:

1
2
vim $PREFIX/etc/nginx/nginx.conf
1

找到index index.html index.htm;修改为: index index.html index.htm index.php;
找到location ~ \.php$所在块,去掉注释修改为:

1
2
3
4
5
6
7
8
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/data/com.termux/files/usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
1234567

kodbox下载安装

官方下载地址:https://kodcloud.com/download/,复制最新版本下载链接,下载并安装:

1
2
3
4
5
6
cd $PREFIX/share/nginx/html
mkdir kod
cd kod
wget https://static.kodcloud.com/update/download/kodbox.1.35.zip
unzip kodbox.1.22.zip && chmod -Rf 777 ./*
12345

登录并配置

上述步骤完成,就可以通过http://手机IP:8080/kod访问了:
在这里插入图片描述
没有任何错误,点击下一步:
在这里插入图片描述
这里因为没有配置MySQL,就选自带的SQlite就行,文件类型选择缓存文件,点击确定:
在这里插入图片描述
管理员账户配置,账号名和密码都可自定义,完成之后就会跳转到登录页面了:
在这里插入图片描述

至此安装完成,尽情享用伪桌面系统的私人云盘吧! 【免费版支持创建10个用户,日常家庭的日常使用绰绰有余】

关于手机内部存储访问

首先确保Termux获取手机存储访问权限:

1
2
termux-setup-storage
1

termux挂载手机存储目录(创建软链接):

1
2
ln -s <本机文件夹> <termux内部目录>
1

比如将手机的Download映射到termux的home目录下:

1
2
ln -s /sdcard/Download /data/data/com.termux/files/home
1

之后在kodbox界面操作,登陆后依次点击系统设置->存储管理->新增
在这里插入图片描述在这里插入图片描述

目录填写软链接完整路径示例:/data/data/com.termux/files/home/Download
保存后刷新页面,就能在文件管理的网络挂载中看到了:
在这里插入图片描述

关于外网访问

首先,而kodbox默认不支持https的,这里我们需要设置一下:

1
2
vim $PREFIX/share/nginx/html/kod/config/config.php
1

大概第85行,将: if(!defined('HOST')){ define('HOST',(get_host());} 修改为:

1
2
if(!defined('HOST')){ define('HOST',rtrim('/',get_host()).'/');}
1

在这里插入图片描述
保存,继续修改setting.php文件:

1
2
vim $PREFIX/share/nginx/html/kod/config/setting.php
1

大概第295行,将: 'listType' => "icon", // list||icon||split 修改为:

1
2
'listType' => "list", // list||icon||split 
1

如果你有公网IP,那么接下来的部分就不需要看了,可以直接跳转到下一小节。

如果没有公网IP,这里提供两个解决方案。

ipv4内网穿透

能看到这的都应该对互联网有所了解,我就简单那花生壳的ddns举个例子吧。
首先去花生壳官网注册登录账号: https://console.hsk.oray.com,登陆后会弹出实名认证,避免后续有什么麻烦就认证一下。
注册成功后会免费赠送你一个二级域名,接下来我们就那这个免费域名操作:
在这里插入图片描述
添加一个映射:在这里插入图片描述在这里插入图片描述
之后使用同局域网设备下载花生壳软件,登录账号就可以使用了。脱离内网,用域名直接访问:在这里插入图片描述
其他品牌的ddns服务自行探索。

直接使用ipv6

随着ipv6的普及,现在家庭宽带基本上都已经支持ipv6了,通过ipv6可易直接进行公网访问而不需要进行内网穿透。
首先确保你的路由器关闭了ipv6防火墙,其次开启ipv6地址分配,路由器不同方法不同,根据自己路由器型号自行百度,实在不会的可以私信我。

① Nginx 开启ipv6访问

Termux的Nginx默认就是支持ipv6的,这里我们只要添加一个ipv6监听服务即可。

1
2
vim $PREFIX/etc/nginx/nginx.conf
1

找到server,在listen 8080;后添加一个ipv6端口: listen [::]:8081 ipv6only=on;
在这里插入图片描述
保存配置文件,重启Nginx服务使配置生效:

1
2
nginx -s reload
1

② 获取手机ipv6地址

使用ip命令可以在Termux内直接查询,先安装工具包:

1
2
pkg install iprroute2
1

使用:

1
2
ip -6 addr
1

在这里插入图片描述
这几个inet6代表的就是你的ipv6地址,其中只有后缀为<global>的才是公网地址,fe80开头的是内网地址。

在线查询工具也很多,这里推荐一个:http://www.test-ipv6.com/
在这里插入图片描述
③ 使用ipv6登录

复制ipv6地址,在其他设备访问,我这里用只开了数据流量的手机测试,访问地址格式http://[ipv6]:port_ipv6/kod在这里插入图片描述
然后去登录日志查看:在这里插入图片描述
也显示了是ipv6登录。

nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
server {
listen 8080;
server_name localhost;

location / {
root /data/data/com.termux/files/usr/share/nginx/html;
index index.html index.htm index.php;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /data/data/com.termux/files/usr/share/nginx/html;
}

location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9090;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/data/com.termux/files/usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}


}


server {
listen 8081;
server_name localhost;
location / {
root /data/data/com.termux/files/usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /data/data/com.termux/files/usr/share/nginx/html;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9090;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/data/com.termux/files/usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}

安装 Hexo

Hexo 是用 Nodejs 编写的,所以安装的话得使用 npm 命令来安装:

1
2
BASH
npm install hexo-cli -g

安装完成的话,顺便看一下 Hexo 相关的版本信息吧:

1
2
BASH
hexo -v

Hexo 基本部署

将md文件转化为网页!!!

我们建立一个目录,然后到这个目录下初始化 Hexo 环境:

1
2
3
4
5
6
7
8
9
10
# 手动创建一个目录
mkdir hexo

# 进入目录下并初始化Hexo环境
cd hexo
hexo init

#生成静态文件 启动Hexo
hexo g
hexo s

出现问题可以重新安装一下hexo。

出现图片显示问题:

在项目里下载模块

1
npm install https://github.com/CodeFalling/hexo-asset-image --save

安装alist

Alist 的安装较为简单。打开 termux,输入下面的指令直接安装:

1
pkg install alist -y

安装好之后,使用下面的指令查看 admin 的账户和密码:

1
alist admin

image-20231125185910009

然后输入下面的指令开启 alist:

1
alist server

image-20231125185809687

可以看到开启的端口号。

数据安全

安装IP-Tracer

《追踪ip地址信息》

apt update

apt install git

git clone https://github.com/rajkumardusad/IP-Tracer.git

进入安装的IP-Tracer工具里

将权限添加到安装文件中

1
chmod +x install  

然后键入

1
./install

键入如下命令查看ip信息

trace -m ip

2、安装Ddos-Ripper

可以参考github教程

1
2
3
4
5
6
pkg install git -y
pkg install python -y
pkg install python3 -y
git clone https://github.com/palahsu/DDoS-Ripper.git
cd DDoS-Ripper` `$ ls
$ python3 DRipper.py

安装linux系统

pkg install proot-distro

查看安装的linux系统

proot-distro list

安装Ubuntu linux系统

proot-distro install ubuntu

登录ubuntu系统

proot-distro login ubuntu

通过Proot安装ubuntu

参考(https://www.dnzp.com/m/jy/202307/190421.html)

输入

bash <(curl -L gitee.com/mo2/linux/raw/2/2)

一路 y

选择 中文简体——》 proot容器


VNC安装

VNC使用

第一步:停止VNC服务

在更改VNC密码之前,您需要确保VNC服务已停止。如果VNC仍在运行,则您不会能够更改密码。您可以使用以下命令停止VNC服务:

sudo systemctl stop vncserver@:1.service

第二步:更改VNC密码

打开终端并键入以下命令更改VNC密码:

vncpasswd

此命令将提示您输入新密码。请确保您输入一个安全的密码。

第三步:启动VNC服务

输入以下命令启动VNC服务:

sudo systemctl start vncserver@:1.service

这将启动VNC服务并使您的新密码生效。

安装 青龙面板

手机termux安装Linux发行版实现无root安装青龙面板

参考 https://segmentfault.com/a/1190000041976767?sort=newest

termux安装

【termux官网】
【ZeroTermux】
【ZeroTermux 安卓5】

ZeroTermux换源(可跳过)

1
sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' $PREFIX/etc/apt/sources.list && apt update && apt upgrade

安装 Linux 发行版 Alpine

安装

1
2
curl -LO https://raw.githubusercontents.com/Hax4us/TermuxAlpine/master/TermuxAlpine.sh
bash TermuxAlpine.sh

启动alpine

startalpine

Alpine安装青龙

这里安装develop分支测试,可以把下面的QL_BRANCH改为master分支来安装稳定版或改为版本号(如v2.11.1)来安装指定版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
set -x \
&& echo -e "\n\
export QL_DIR=/ql\n\
export QL_BRANCH=develop\n\
export LANG=zh_CN.UTF-8\n\
export TERMUX_APK_RELEASE=F-DROID\n\
export SHELL=/bin/bash\n\
export PNPM_HOME=~/.local/share/pnpm\n\
export PATH=$PATH:~/.local/share/pnpm:~/.local/share/pnpm/global/5/node_modules\n" \
>> /etc/profile.d/ql_env.sh \
&& source /etc/profile \
&& echo -e "nameserver 119.29.29.29\n\
nameserver 8.8.8.8" > /etc/resolv.conf \
&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
&& apk update -f \
&& apk upgrade \
&& apk --no-cache add -f bash make nodejs npm \
coreutils moreutils git curl wget tzdata perl \
openssl nginx jq openssh python3 py3-pip \
&& rm -rf /var/cache/apk/* \
&& apk update \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& npm config set registry https://registry.npmmirror.com \
&& npm install -g pnpm \
&& pnpm add -g pm2 ts-node typescript tslib \
&& mkdir -p $QL_DIR \
&& git clone -b $QL_BRANCH https://github.com/whyour/qinglong.git $QL_DIR \
&& cd $QL_DIR \
&& cp -f .env.example .env \
&& chmod 777 $QL_DIR/shell/*.sh \
&& chmod 777 $QL_DIR/docker/*.sh \
&& pnpm install --prod \
&& mkdir -p $QL_DIR/static \
&& git clone -b $QL_BRANCH https://github.com/whyour/qinglong-static.git $QL_DIR/static \
&& ln -s /ql/docker/docker-entrypoint.sh /usr/bin/qinglong \
&& qinglong

启动alpine

1
startalpine

启动青龙面板

1
qinglong

报错
alpine安装失败
清除termux数据(再重启手机更好),或者用zerotermux更方便,直接容器切换里新建一个容器就行了,再重新重新执行安装alpine命令
sqlite3安装失败
原因不清楚,之前查半天解决的,又忘记了,不过不是所有设备都会报错,一般重新安装就可以解决
重新执行安装命令,即pnpm install –prod,然后再执行之后的所有命令,也可以直接复制下面这段

1
2
3
4
5
pnpm install --prod \
&& mkdir -p $QL_DIR/static \
&& git clone -b $QL_BRANCH https://github.com/whyour/qinglong-static.git $QL_DIR/static \
&& ln -s /ql/docker/docker-entrypoint.sh /usr/bin/qinglong \
&& qinglong

手机重启后再次启动青龙面板失败
之前是因为环境变量失效,已经解决了,再有的话就不清楚了。
拉库报错
原因不明,最开始测试是正常的,后来更新之后就不能拉库了,没仔细研究更新了哪里,可能过段时间还能自动变好吧,有兴趣的自己看青龙作者的更新记录。
安装

在Termux中运行Docker

docker 参考

我们确实可以在Termux中体验 Termux开发环境 ,但是毕竟是在Android系统中运行一个并非完整的Linux系统。所以我们会有一个疑惑,是否可以在手机系统中,也就是在Termux之上再运行一个 Docker Atlas 呢?毕竟,只要能够运行Docker,也就意味着打开了一个全新的容器化环境,能够构建不同的应用程序运行环境,更能够把 移动开发:Pixel手机(Android)开发环境构建 实现得更完美。

  • 安装:

    1
    2
    pkg install root-repo
    pkg install docker

安装完成提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Setting up libaio (0.3.112-3) ...
Setting up libdevmapper (2.03.09-2) ...
Setting up libseccomp (2.5.4) ...
Setting up runc (1.0.0-rc92-0) ...

RunC requires support for devices cgroup support in kernel.

If CONFIG_CGROUP_DEVICE was enabled during compile time,
you need to run the following commands (as root) in order
to use the RunC:

mount -t tmpfs -o mode=755 tmpfs /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/devices
mount -t cgroup -o devices cgroup /sys/fs/cgroup/devices

If you got error when running commands listed above, this
usually means that your kernel lacks CONFIG_CGROUP_DEVICE.

Setting up containerd (1.4.13) ...
Setting up docker (20.10.14) ...
NOTE: Docker requires the kernel to support
device cgroups, namespace, VETH, among others.

To check a full list of features needed, run the script:
https://github.com/moby/moby/blob/master/contrib/check-config.sh

内核需要定制支持上述选项

Termux:api应用

Termux 趣味应用

figlet 、toilet命令

艺术字生成器,由ASCII字符组成,把文本显示成标题栏。此外还有banner这个命令

安装

$sudo apt-get install figlet

$sudo apt-get install toilet

运行

$figlet fuck you !

$toilet i love you

img

安装彩色的字体:lolcat

250 apt-get install ruby

251 ruby -v

253 cd /usr/games/

254 wget https://github.com/busyloop/lolcat/archive/master.zip

255 unzip master.zip

256 cd lolcat-master/bin

257 gem install lolcat

258 lolcat –version

259 lolcat -h

img

260 ps | lolcat

img

261 date | lolcat

img

262 man cmatrix | lolcat

img

图片转字符串

sudo apt-get install aview imagemagick
asciiview luffy.jiff

img

img

fortune 命令随机名言诗句

Cowsay

#apt install cowsay //安装这个包

如果显示

root@hsz:/usr/games# fortune | cowsay

/usr/bin/env: node: No such file or directory

Command ‘fortune’ is available in ‘/usr/games/fortune’

The command could not be located because ‘/usr/games’ is not included in the PATH environment variable.

fortune: command not found

img

那么是因为环境变量没有配置好:

root@hsz:/# vim /etc/profile //里面最后一行加入:export PATH=”/usr/games:$PATH”

root@hsz:/# source /etc/profile

这样就可以使用了。

如:#fortune | cowsay

img

root@hsz:/# cowthink today is nice!

root@hsz:/# cowsay srsly dude, why?

还有很多操作

cowsay -f tux “坑爹啊”

img

一些彩色的字

# figlet I Love Temint | lolcat

img

#toilet I Love Temint | lolcat

img

# cowsay -f gnu “Temint” is the best Linux Resource Available online | lolcat

img

8 *ASCII艺术框:box命令

1
2
3
4
5
6
7
8
sudo apt-get install boxes
echo "Tongji Univerisity" | boxes
echo "Tongji Univerisity" | boxes -d dog
fortune | boxes -d cat | lolcat

# fortune | boxes -d mouse | lolcat 等


image-20231205003117661

Termux:API 扩展用法详解

何方

何方

https://iamhefang.cn

15 人赞同了该文章

什么是Termux:API?

Termux:API是Termux的一个扩展包,安装Termux:API以后可以在Termux里面通过命令调用安卓原生的能力,比如调用摄像头拍照、获取定位信息等等。

本文原文来自何方的软件分享站

Termux:API用法详解 - 何方的软件分享soft.iamhefang.cn/content/termux-api-detail.html

Termux介绍请参考下面这个视频

如何在安卓中使用完整的Linux系统?6681 播放 · 15 赞同视频点击可播放视频

如何安装Termux:API

1、 安装一个“Termux:API”的apk包。
2、安装完“Termux:API”以后打开termux主程序,执行下面的命令再安装一个“Termux:API”的命令工具。

1
apt install termux-api

Termux:API用法

下面列出的Termux:API的所有api的用法、入参和出参。需要使用哪个api可以在目录中快速跳转。

获取设备电池信息

命令:termux-battery-status

出参

1
2
3
4
5
6
7
8
{
"health": "GOOD", // 电池健康状态
"percentage": 94, // 当前电量百分比
"plugged": "UNPLUGGED", // 是否已插入电源
"status": "DISCHARGING", // 是否正在充电
"temperature": 33.0, // 电池温度
"current": 252000 // 电池当前放电电流,电位微安,如果设备当前正在充电,则该值是负数
}

设置屏幕亮度。

命令

1
termux-brightness brightness

权限:android.permission.WRITE_SETTINGS

入参

参数 说明 默认值 可选
brightness 亮度值 - 0-255

获取通话记录列表

命令

1
termux-call-log -l limit -o offset

权限:android.permission.READ_CALL_LOG

入参

参数 说明 默认值 可选
-l limit 每次获取条数 10
-o offset 从第几条开始获取 0

出参

1
2
3
4
5
6
7
8
9
[
{
"name":"名称",
"phone_number":"号码",
"date":"通话时间",
"duration":"通话时长"
}
...
]

获取相机信息

命令:termux-camera-info

出参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[
{
"id": "0",
"facing": "back",
"jpeg_output_sizes": [
{
"width": 4080,
"height": 3072
},
...
],
"focal_lengths": [
7.590000152587891
],
"auto_exposure_modes": [
"CONTROL_AE_MODE_OFF",
"CONTROL_AE_MODE_ON",
"CONTROL_AE_MODE_ON_AUTO_FLASH",
"CONTROL_AE_MODE_ON_ALWAYS_FLASH"
],
"physical_size": {
"width": 11.423999786376953,
"height": 8.60159969329834
},
"capabilities": [
"backward_compatible",
"constrained_high_speed_video",
"raw",
"yuv_reprocessing",
"private_reprocessing",
"read_sensor_settings",
"manual_sensor",
"burst_capture",
"manual_post_processing"
]
},
...
]

调用摄像头拍照

命令

1
termux-camera-photo -c camera-id filename

权限:android.permission.CAMERA

入参

参数 说明 默认值 可选
-c camera-id ermux-camera-info输出的id 0
filename 文件保存的路径 -

获取粘贴板数据

命令:termux-clipboard-get

权限:读取粘贴板权限

出参:直接输出粘贴板内容

设置粘贴板数据

命令

1
termux-clipboard-set text

入参

参数 说明 默认值 可选
text 要复制到粘贴板的内容 -

获取联系人列表

命令:termux-contact-list

权限:anroid.permission.READ_CONTACTS

出参

1
2
3
4
5
6
7
[
{
"name":"名称",
"nuumber":"号码"
}
...
]

显示弹窗

命令

1
2
3
4
5
6
7
8
9
10
termux-dialog confirm -t title -i hint 
termux-dialog checkbox -t title -v ",,,"
termux-dialog counter -t title -r min,max,start
termux-dialog date -t title -d "dd-MM-yyyy k:m:s"
termux-dialog radio -t title -v ",,,"
termux-dialog sheet -t title -v ",,,"
termux-dialog spinner -t title -i hint
termux-dialog speech -t title -i hint
termux-dialog text -t title -i hint -m -n -p
termux-dialog time -t title

入参

参数 说明 默认值 可选
-t title 弹窗标题 -
-i hint 弹窗内容 -
-v “,,,” 以逗号分割的选项列表 -
-r min,max,start 时数弹窗的数值 min:最小值 max:最大值 start:初始值 -
-d “dd-MM-yyyy k:m:s” 日期弹窗的输出格式 -
-m 输入框弹窗多行输入,不能和-n共用 -
-n 输入框弹窗输入数字,不能和-m共用 -
-p 输入框弹窗输入密码 -

出参

1
2
3
4
5
{
"code":-1,
"text":"值",
"values":"格式化的值,不同类型的弹窗值不一样"
}

使用系统下载管理器下载资源。

命令

1
termux-download -d description -t title -p path url

权限:无

入参

参数 说明 默认值 可选
-d description 下载通知的描述 -
-t title 下载通知的标题 -
-p path 下载文件要保存的路径 -
url 要下载的url -

使用指纹传感器校验身份

命令:termux-fingerprint

出参

1
2
3
4
5
{
"errors":[],
"failed_attempts":0,
"auth_result":"AUTH_RESULT_SUCCESS"
}

查询红外发射器支持的载波频率。

命令:termux-infrared-frequencies

出参

1
2
3
4
5
6
7
[
{
"min": 30000,
"max": 30000
},
...
]

发送红外信号

命令

1
termux-infrared-transmit -f frequency

权限:无

入参

参数 说明 默认值 可选
frequency 以赫兹为单位的 IR 载波频率。 -

延迟或定时运行Termux脚本。

命令:termux-job-scheduler

权限:无

获取当前位置。

命令

1
termux-location -p gps/network/passive -r once/last/updates

入参

参数 说明 默认值 可选
-p gps/network/passive 获取位置的方式 gps
-r once/last/updates 获取时机 once:一次 last:上次 updates:更新 once

出参

1
2
3
4
5
6
7
8
9
10
11
{
"latitude": 33,
"longitude": 114,
"altitude": 102,
"accuracy": 90,
"vertical_accuracy": 961,
"bearing": 0.0,
"speed": 0.0,
"elapsedMs": 38,
"provider": "gps"
}

播放媒体文件

命令

1
2
3
4
5
termux-media-player info
termux-media-player play
termux-media-player play <file>
termux-media-player pause
termux-media-player stop

入参

参数 说明 默认值 可选
info 查看当前播放信息 - -
play 暂停后继续播放 - -
play 文件路径 播放指定的文件 - -
pause 暂停 - -
stop 停止 - -

媒体扫描

命令

1
termux-media-scan -r 目录 -v

入参

参数 说明 默认值 可选
-r 目录 要扫描的目录 -
-v 详细扫描 -

录音

命令

1
termux-microphone-record -d -f <file> -l <limit> -e <encoder> -b <bitrate> -r <rate> -c <count> -i -q

权限:android.permission.RECORD_AUDIO

入参

参数 说明 默认值 可选
-d 使用默认值录音 - -
-f 文件 录音保存文件 - -
-l 时长限制 录音时长限制,单位:秒,0表示不限制 0 -
-e 格式 指定录音格式 (aac, amr_wb, amr_nb) - -
-b 比特率 指定录音比特率 (单位 kbps) - -
-r 频率 指定录音频率 (单位 Hz) - -
-c 声道数 指定录音声道数 (1, 2, …) - -
-i 获取当前录音信息 - -
-q 退出录音 - -

出参

1
2
3
4
{
"isRecording":true,
"outputFile":"录音文件"
}

发送通知

命令

1
termux-notification

入参

参数 说明 默认值 可选
–action action 点击通知时执行的动作 - -
–alert-once 通知被编辑时不要再次提醒 - -
–button1 text 在通知的第一个按钮上显示的文本 - -
–button1-action action 点击第一个按钮要执行的动作 - -
–button2 text 在通知的第二个按钮上显示的文本 - -
–button2-action action 点击第二个按钮要执行的动作 - -
–button3 text 在通知的第三个按钮上显示的文本
–button3-action action 点击第三个按钮要执行的动作
-c/–content content 要在通知中显示的内容,优先级高于标准输入
–group group 通知分组
-h/–help 显示帮助信息
–help-actions 显示动作定义帮助信息
-i/–id id 通知id,同一id的通知两次发送时之前的将被替换
–image-path path 通知中要显示的图片绝对路径
–led-color rrggbb 呼吸灯颜色
–led-off milliseconds 呼吸灯呼吸时关闭时长 800
–led-on milliseconds 呼吸灯呼吸时打开时长 800
–on-delete action 通知被清理时执行的动作 - -
–ongoing 发送持久化通知 - -
–priority prio 通知优先级 - high/low/max/min/default
–sound 通知铃声 - -
-t/–title title 通知标题 - -
–vibrate pattern 通知振动,时长以逗号分割 ,500,800,500,900 - -
–type type 通知类型 default/media
–media-next 通知类型为media时,显示下一曲按钮
–media-pause 通知类型为media时,显示暂停按钮 - -
–media-play 通知类型为media时,显示播放按钮 - -
–media-previous 通知类型为media时,显示上一曲按钮 - -

移除通知

命令

1
termux-notification-remove id

入参

参数 说明 默认值 可选
id 要移除的通知id,使用termux-notification发送通知时定义的id -

获取传感器信息

命令

1
termux-sensor -h -a -l -s ",,," -d ms -n num

入参

参数 说明 默认值 可选
-h 显示帮助信息 - -
-a 显示全部传感器信息和实时数据(警告:可能对电池有影响)
-l 显示可用的传感器列表
-s “,,,” 要监听的传感器,以逗号分割
-d ms 接收传感器数据之前延迟,单位:ms
-n num 接收传感器数据次数,最小值为1。 continuous:续续接收 continuous
-c 释放被占用的传感器

出参

1
2
3
4
5
6
{
"sensors":[
"可用的传感器列表",
...
]
}

分享

命令

1
termux-share -a action -c content-type -d -t title file

入参

参数 说明 默认值 可选
-a action 分享内容要执行的动作类型 view edit/send/view
-c content-type 分享的数据类型 从文件后缀猜测,如果数据是从标准输入来的,默认为
-d 如果选择一个则分享到默认的接收器而不显示接收器列表 -
-t title 分享的标题 分享的文件名

获取短信列表

命令

1
termux-sms-list -d -l limit -n -o offset -t type

权限:android.permission.READ_CONTACTS

入参

参数 说明 默认值 可选
-d 显示创建短信的日期
-l limit 每页显示多少条数据 10
-n 显示号码 0
-o offset 从第几个后开始获取
-t type 要显示的短信类型 inbox all|inbox|sent|draft|outbox

出参

1
2
3
4
5
6
7
8
9
10
[
{
"threadid":186,
"type":"inbox",
"read":true,
"number":"号码",
"received":"接收时间",
"body":"短信内容"
}
]

发送短信

命令

1
termux-sms-send -n ",,," text

权限:android.permission.SEND_SMS

入参

参数 说明 默认值 可选
-n “,,,” 要接收短信的号码,以逗号分割
text 要发送的短信内容

选择文件

命令

1
termux-storage-get filename

入参

参数 说明 默认值 可选
filename 要写入的文件 -

拨打电话

命令

1
termux-telephony-call number

权限:andriod.permission.CALL_PHONE

入参

参数 说明 默认值 可选
number 要拨打的号码 -

获取区域信息

命令:termux-telephony-cellinfo

权限:定位权限

出参

1
2
3
4
5
6
7
8
9
10
11
12
{
"type":"类型",
"registered":true,
"asu":40,
"dbm":-97,
"level":2,
"ci":1936181100,
"pci":120,
"tac":61292,
"mcc":460,
"mnc":1
}

获取通讯设备信息

命令:termux-telephony-deviceinfo

出参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"data_enabled": "true",
"data_activity": "none",
"data_state": "connected",
"device_id": null,
"device_software_version": null,
"phone_count": 2,
"phone_type": "gsm",
"network_operator": "46001",
"network_operator_name": "中国联通",
"network_country_iso": "cn",
"network_type": "lte",
"network_roaming": false,
"sim_country_iso": "cn",
"sim_operator": "46001",
"sim_operator_name": "中国联通",
"sim_serial_number": null,
"sim_subscriber_id": null,
"sim_state": "ready"
}

显示一个Toast

命令

1
termux-toast -h -b -c -g -s text

入参

参数 说明 默认值 可选
-h 显示帮助信息 - -
-b 背景色 gray
-c 前景色 white
-g 位置 middle top, middle, bottom
-s 短时显示 -
text 要显示的内容 -

打开/关闭手电筒

命令

1
termux-torch status

入参

参数 说明 默认值 可选
status 状态 - on, off

获取语音引擎信息

命令:termux-tts-engines

出参

1
2
3
4
5
6
7
8
[
{
"name":"包名",
"label":"名称"
"default":true
},
...
]

朗读文本

命令

1
termux-tts-speak -e engine -l language -n region -v variant -r rate  -s stream text

入参

参数 说明 默认值 可选
-e engine 要使用的语音引擎 - termux-tts-engines输出的引擎
-l language 要朗读的语言 - -
-n region 要朗读语言所在区域 - -
-v variant 要朗读语言的变体 - -
-p pitch 朗读的声调 1.0 -
-r rate 朗读的语速 1.0 -
-s stream 音频流 NOTIFICATION ALARM, MUSIC, NOTIFICATION, RING, SYSTEM, VOICE_CALL
text 要朗读的文本 -

USB设备列表

命令

1
termux-usb -l -r -e command

依赖包

要正常使用该功能,需要安装libusbclang包,可使用apt install libusb clang安装

权限:USB权限

入参

参数 说明 默认值 可选
-l 列表所有可用的USB设备 - -
-r 如果没有权限弹出权限请求弹窗 - -
-e command 使用引用设备的文件描述符作为其参数执行指定的命令 - -

-l出参

1
2
3
[

]

振动

命令

1
termux-vibrate -d duration -f

入参

参数 说明 默认值 可选
-d duration 振动时长 1000
-f 在静音模式下强制振动 -

获取/设置音量

命令

1
termux-volume stream volume

入参

参数 说明 默认值 可选
stream 要改变的音量 - alarm, music, notification, ring, system, call
volume 音量 - -

不加参数出参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[
{
"stream": "call",
"volume": 11,
"max_volume": 11
},
{
"stream": "system",
"volume": 0,
"max_volume": 15
},
{
"stream": "ring",
"volume": 10,
"max_volume": 15
},
{
"stream": "music",
"volume": 50,
"max_volume": 150
},
{
"stream": "alarm",
"volume": 8,
"max_volume": 15
},
{
"stream": "notification",
"volume": 10,
"max_volume": 15
}
]

更改桌面壁纸

命令

1
termux-wallpaper -f file -u url -l

入参

参数 说明 默认值 可选
-f file 使用文件设置桌面壁纸
-u url 使用网络资源设置桌面壁纸
-l 设置锁屏壁纸

获取当前WiFi连接信息

命令:termux-wifi-connectioninfo

出参

1
2
3
4
5
6
7
8
9
10
11
12
{
"bssid": "02:00:00:00:00:00",
"frequency_mhz": 5745,
"ip": "192.168.31.251",
"link_speed_mbps": 260,
"mac_address": "02:00:00:00:00:00",
"network_id": -1,
"rssi": -68,
"ssid": "<unknown ssid>",
"ssid_hidden": true,
"supplicant_state": "COMPLETED"
}

打开/关闭WiFi

命令

1
termux-wifi-enable status

入参

参数 说明 默认值 可选
status 要更改的wifi状态 true, false

扫描可用WiFi

命令:termux-wifi-scaninfo

权限:定位权限

出参

1
2
3
4
5
6
7
8
9
10
11
[
{
"bssid": "68:8b:0f:f6:6f:96",
"frequency_mhz": 2412,
"rssi": -50,
"ssid": "CMCC-nJtm",
"timestamp": 584216631835,
"channel_bandwidth_mhz": "20"
},
...
]

常用操作

服务启动

启动 php-fpm

1
php-fpm

查看nginx当前进程

1
2
3
4
5
6
ps -ef | grep nginx
--------------------------------------------------------------------
[root sbin]# ps -ef | grep nginx
root 4807 1 0 Feb23 ? 00:00:00 nginx: master process ./nginx
nobody 4855 4807 0 Feb23 ? 00:00:00 nginx: worker process
root 29411 18450 0 11:31 pts/1 00:00:00 grep *--color=auto nginx*

Linux常用命令:

文件组管理:

cat /etc/group #查看文件系统的所有组信息

1
groups   + 组名   查看组中成员信息

创建一个组,monster

1
groupadd monster

创建一个用户 fox ,并放入到monster组中

1
useradd -g monster fox

image-20231107105956026

参考

linux 查看系统信息命令 - konglingbin - 博客园 (cnblogs.com)

Linux 查看系统版本

1、输入uname - a,可以看到操作系统的发行版号和操作系统版本。

img

2、输入uname -v可以查看版本号。

img

3、lsb_release -a,查看发行版本信息,并且方法可以适用于所有的Linux发行版本。

img

4、cat /etc/issue可以查看到当前是Linux什么版本系统。

img

5、cat /proc/version可以查看内核的版本号。

img

常见问题

ssh连接报错

image-20231130141455006

1
ssh-keygen -R 192.168.0.105

报错

image-20231130142356101

修改know_hosts为 know_hosts.bak 或者删除 know_hosts

image-20231130142606669

再进行连接

image-20231130142702886

二、常见报错

Oh My Zsh更新报错解决

报错内容:

1
2
3
4
5
6
7
8
9
[oh-my-zsh] Would you like to update? [Y/n] y
Updating Oh My Zsh
fatal: remote error:
The unauthenticated git protocol on port 9418 is no longer supported.
Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.
There was an error updating. Try again later?
The `osx` plugin is deprecated and has been renamed to `macos`.
Please update your .zshrc to use the `macos` plugin instead.
12345678

执行下面命令解决

1
git config --global url."https://github.com/".insteadOf git://github.com/

Shell 脚本语法

shell 概述

在这里插入图片描述
shell 是一种脚本语言
脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)
shell命令解析器:
系统提供 shell命令解析器: sh ash bash
查看自己linux系统的默认解析:echo $SHELL
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装shell命令解释器的环境下执行

调用形式

打开终端时系统自动调用:/etc/profile 或 ~/.bashrc

/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,系统的公共环境变量在这里设置
开机自启动的程序,一般也在这里设置
~/.bashrc
用户自己的家目录中的.bashrc
登录时会自动调用,打开任意终端时也会自动调用
这个文件一般设置与个人用户有关的环境变量,如交叉编译器的路径等等
用户手动调用:用户实现的脚本
在这里插入图片描述

shell语法初识

语法格式

定义以开头:#!/bin/bash

#!用来声明脚本由什么shell解释,否则使用默认shell
在这里插入图片描述

单个”#”号代表注释当前行

第一步:编写脚本文件

在这里插入图片描述

第二步:加上可执行权限

chmod +x xxxx.sh
在这里插入图片描述

第三步:运行

在这里插入图片描述

三种执行方式 (./xxx.sh bash xxx.sh . xxx.sh)

三种执行方式的不同点(./xxx.sh bash xxx.sh . xxx.sh)

./xxx.sh :先按照 文件中#!指定的解析器解析

如果#!指定指定的解析器不存在 才会使用系统默认的解析器

bash xxx.sh:指明先用bash解析器解析

如果bash不存在 才会使用默认解析器

. xxx.sh 直接使用默认解析器解析(不会执行第一行的#!指定的解析器)但是第一行还是要写的

三种执行情况:
打开终端就会有以后个解释器,我们称为当前解释器
我们指定解析器的时候(使用 ./xxx.sh 或 bash xxx.sh)时会创建一个子shell解析 脚本
在这里插入图片描述

注意:windows下 写脚本 在linux下执行 注意

在这里插入图片描述
执行结果:
在这里插入图片描述
将windows文件 转换成 unix文件
方法一:dos2unix 如果没有该插件 需要安装
sudo apt-get install dos2unix
dos2unix shell脚本
转换成功就可以执行运行
方法二:
需要用vi打开脚本,在最后一行模式下执行
:set ff=unix
在这里插入图片描述

变量

定义变量
变量名=变量值
如:num=10
引用变量
$变量名
unset :清除变量值
在这里插入图片描述
运行结果:
在这里插入图片描述
从键盘获取值read

在这里插入图片描述
运行结果:
在这里插入图片描述

案例:

在一行上显示和添加提示 需要加上-p
在这里插入图片描述
运行结果:
在这里插入图片描述

案例:读取多个值

在这里插入图片描述
运行结果:
在这里插入图片描述

案例只读变量:

在这里插入图片描述
运行结果:
在这里插入图片描述

查看环境变量:env

在这里插入图片描述
在这里插入图片描述

导出环境变量 作用:(让其他shell脚本识别该变量,设为全局变量)

source 脚本文件
source命令用法:
source FileName
作用:在当前bash环境下读取并执行FileName中的命令。
注:该命令通常用命令“.”来替代。
如:source .bash_rc 与 . .bash_rc 是等效的。
注意:source命令与shell scripts的区别是,
source在当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source 命令。

06_sh.sh

1
2
3
#!/bin/bash
expor DATA=250
12

用source 是文件生效
在这里插入图片描述
使用 env可以查看到环境变量中已经有 DATA
在这里插入图片描述
可以在终端直接中读取:
在这里插入图片描述
在其他sh脚本读取:
在这里插入图片描述
运行结果:
在这里插入图片描述

注意事项:

1、变量名只能包含英文字母下划线,不能以数字开头
1_num=10 错误
num_1=20 正确
2、等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来
3、双引号 单引号的区别
双引号:可以解析变量的值
单引号:不能解析变量的值
在这里插入图片描述
运行结果:
在这里插入图片描述
如果想在PATH变量中 追加一个路径写法如下:(重要!!!!)

1
2
export PATH=$PATH:/需要添加的路径
1

预设变量

shell直接提供无需定义的变量

在这里插入图片描述

案例:

在这里插入图片描述
运行结果:
在这里插入图片描述

脚本标量的特殊用法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
加-e转义 才起换行作用
在这里插入图片描述
()由子shell 完成
在这里插入图片描述
{}由当前的shell执行

在这里插入图片描述

变量的扩展

判断变量是否存在

在这里插入图片描述
在这里插入图片描述

字符串的操作

在这里插入图片描述

条件测试

test命令:用于测试字符串、文件状态和数字
test命令有两种格式:
test condition 或[ condition ]
使用方括号时,要注意在条件两边加上空格。

文件测试

在这里插入图片描述
在这里插入图片描述

字符串测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数值测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

符合语句测试

在这里插入图片描述
在这里插入图片描述

控制语句

在这里插入图片描述

if控制语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
格式一:
if [条件1]; then
执行第一段程序
else
执行第二段程序
fi
格式二:
if [条件1]; then
执行第一段程序
elif [条件2];then
执行第二段程序
else
执行第三段程序
fi
1234567891011121314

案例:

在这里插入图片描述

案例:判断当前路径下有没有文件夹 有就进入创建文件 没有 就创建文件夹 再进入创建文件

在这里插入图片描述
运行结果:
在这里插入图片描述

案例:

在这里插入图片描述
运行结果:
在这里插入图片描述

case

在这里插入图片描述
在这里插入图片描述

for循环语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

案例:

在这里插入图片描述

案例:扫描当前文件

在这里插入图片描述

while

在这里插入图片描述
在这里插入图片描述

until

在这里插入图片描述
在这里插入图片描述

break continue

在这里插入图片描述

函数

在这里插入图片描述
所有函数在使用前必须定义,必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用
在这里插入图片描述

案例:求最值

在这里插入图片描述

案例:函数分文件

在这里插入图片描述
fun.sh
在这里插入图片描述
24_sh.sh
在这里插入图片描述

Shell 脚本补充

Shell脚本 基础概念

什么是shell?

shell英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的shell命令就包括lscdpwd等等。

shell是站在内核的基础上编写的一个应用程序,它连接了用户和Linux内核,从而让用户能够更加便捷、高效、安全的使用linux内核,这其实就是shell的本质。

使用专业术语的说法来解释,Shell其实是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。

什么是shell脚本

shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

shell脚本的意义

我们在1.2中也解释道shell脚本其实就是shell命令组成的文件,shell脚本可以记录命令执行的过程和执行逻辑,以便以后重复执行,还可以批量、定时处理主机,方便管理员进行设置或者管理。

创建一个简单的Shell脚本

创建一个shell脚本文件

在创建shell脚本时,我们默认新建一个以.sh/.script结尾的文件,主要是为了让程序员更加快捷的辨认出该文件是一个shell脚本文件。

我们创建一个test.sh的shell脚本文件,其中具体内容为下:

1
2
3
#!/bin/bash
echo hello
12
  • “ # ”开头的就是注释,单行注释
  • <<EOF … EOF 或 :<<! … ! :多行注释
  • #!/bin/bash : 主要用于指定解释器
  • Linux中提供的shell解释器有:
  1. /bin/sh
  2. /bin/bash
  3. /usr/bin/sh
  4. /usr/bin/bash

运行一个Shell脚本

我们根据脚本文件是否具有可执行权限,将运行一个shell脚本的方法分为两大类。

脚本文件无执行权限

这种情况下我们有三种方式来运行脚本:

  1. 手动在环境中开启指定解释器:sh test.sh
    在这里插入图片描述
  2. 直接在当前环境中运行的shell中运行脚本:. test.sh
    在这里插入图片描述
  3. 直接在当前环境中运行的shell中运行脚本:source test.sh
    在这里插入图片描述

脚本文件有执行权限

在这一部分由于我们假设脚本文件有可执行器权限,所以我们使用chmod +x test.sh为我们的test.sh文件增加了可执行权限。

我们知道当一个文件具有可执行权限时我们可以使用该文件的路径名直接运行该文件,有两种方式可以运行脚本:

  1. 绝对路径名运行脚本文件
    绝对路径就是从根目录下开始记录文件路径名,是文件在计算机上真正存在的路径。(如果不知道你的文件路径名,可以在当前位置的shell中使用pwd查询当前所在位置)
    在这里插入图片描述
  2. ./相对路径名的格式运行脚本文件
    相对路径是指以当前的文件作为起点,相较于当前目录的位置而被指向并且加以引用的文件资源。
    比如我们知道test.sh文件的绝对路径为/home/westos/Desktop/textcpp/test.sh,那么当我们在testcpp文件夹中时,test.sh文件的相对路径为test.sh
    又因为.代表当前所在位置,故而为其实./test.sh其实就是该文件的绝对路径,只是表示的方式不同。
    在这里插入图片描述

基本语法

变量

变量名其实就是一片内存区域的地址或者可以说是寻址符号,有了变量我们就可以使用一串固定的字符来表示不固定的目标。

变量类型

在shell中会同时存在三种类型变量。

  1. 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

变量操作

  1. 创建普通变量:name=“test”,组要注意的是等号两边不能有空格。
  2. 创建局部变量:local name=“test”,使用local修饰的变量在函数体外无法访问,只能在函数体中使用。
  3. 创建只读变量:name=“only_read” -> readonly name,这种变量不可以被修改。
  4. 使用变量:echo $name或者echo ${name}
  5. 删除变量:unset name,删除之后的变量无法被访问,需要注意无法删除只读变量。

字符串变量

字符串变量的创建
  1. 使用单引号创建:var='test'
    这种方式创建的变量只能原样输出,变量无效,我们可以借用c中的“字符串常量”的定义理解这种特性。除此以外,单引号中不能出现单独的单引号,转义也是不可以的。
  2. 使用双引号创建:var="my name is ${name}",这种方式创建的字符串变量有效,也可以出现转义符。
拼接字符串
  1. 字面量拼接
    str01="1""2"或者str01="1"'2',这样就将12两个字符拼接在了一起。需要注意的是两个串之间不可以有空格。
  2. 变量拼接
    str03=${part01}${part02}str04=${part01}"end"str05="${part01} ${part02}"这三种方式都可以拼接字符串变量。
  3. 命令拼接
    str02= date“end”,这里的date是一个shell命令,需要使用引用,具体如下:
1
2
str02=`date`"end"
1
获取字符串长度
  1. 使用wc -L命令
    wc -L可以获取到当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l则是获取当前字符串内容的行数。
1
2
echo "abc" |wc -L
1
  1. 使用expr length可以获取string的长度
1
2
expr length ${str}
1
  1. awk获取域的个数
    但是如果大于10个字符的长度时是否存在问题需要后面确认
1
2
echo "abc" |awk -F "" '{print NF}'
1
  1. 通过awk+length的方式获取字符串长度
1
2
echo “Alex”|awk '{print length($0)}'
1
  1. 通过`echo $