RTL8812BU驱动安装
已经有人做出了安装包放在了AUR仓库,他用到了但是却没有把 linux-headers 写在 PKGBUILD 里面,导致安装失败。使用需要先手动安装这个这个依赖,再安装驱动才能成功。
yay -S linux-headers rtl88x2bu-dkms-git
完成以后即可搜索到 WiFi,这个螃蟹卡在实验室的台式电脑上似乎无法进入监听模式,后续用笔记本再捣鼓一下。
已经有人做出了安装包放在了AUR仓库,他用到了但是却没有把 linux-headers 写在 PKGBUILD 里面,导致安装失败。使用需要先手动安装这个这个依赖,再安装驱动才能成功。
yay -S linux-headers rtl88x2bu-dkms-git
完成以后即可搜索到 WiFi,这个螃蟹卡在实验室的台式电脑上似乎无法进入监听模式,后续用笔记本再捣鼓一下。
本栏笔记参考TypeScript文档撰写,目前尚无中文翻译,看起来费劲,在这里对其中的要点进行提取,融入自己的理解和示例代码,以中文的笔记形式记录下来。
本文对 TypeScript 进行简要的概述,重点介绍它的类型系统。
在声明变量并给他赋值时,会把该值的类型作为该变量的类型。
当鼠标放在 words
上时,IDE会提示它是string类型。
let words = 'hello'
默认会推断类型,可以这样创建一个 user
对象,它的 name
属性为字符串类型,id
属性为数字类型。
const user = {
name: 'Lee',
id: 0
}
interface
事先定义好一个“形”,创建符合这个 形的对象 user
时,会把 user
和 User
定义的属性进行匹配,比较其类型是否相符。以下代码,若缺少定义的属性,会被警告;若类型不匹配,也会被警告。
interface User {
name: string;
id: number;
}
const user: User = {
name: '',
id: 1
}
可以将接口声明和类一起使用,
interface User {
name: string;
id: number;
}
class Teacher {
name: string;
id: number;
constructor(name: string, id: number) {
this.name = name;
this.id = id;
}
}
const user: User = new Teacher("Murphy", 1);
也可以用来注释参数,也可以用来注释返回值的类型
function getUserUser(): User {
return
}
function deleteUser(user: User) {
}
JavaScript 中的原始类型:boolean
、bigint
、null
、number
、string
、symbol
和 undefined
,你可以在接口中使用它们。TypeScript 对这些类型进行了扩展,例如any
、unknown
、never
和 void
。
定义类型有两种方式,你应该优先选择用 interface
,必要时再使用 type
。
可以通过组合简单类型来创建复杂类型。有两种流行的方法可以做到这一点:使用联合类型和泛型。
使用联合类型,你可以定义一个可能会是很多种类型其中之一的类型,例如你可以定义一个 MyBool 其值可能是 true
或 false
。
type MyBool = true | false
比较常用的联合类型用法:定义一个可能出现的值的集合,一个字符串集合或数值集合。
type WindowStates = 'open' | 'closed'
type LockStatus = 'locked' | 'unlocked'
type FanSpeed = 1 | 2 | 3 | 4 | 5 | 6
也可以用来定义多种类型的参数,传给函数。例如以下函数,可以接受一个字符串,也可以接受字符串数组
function handle(obj: string | string[]) { }
type
就像C语言里的 typedef
。第三行定义了一个类型:对象数组,对象必须有字符串类型的 name 属性
type StringArray = Array<string>;
type NumberArray = Array<number>;
type ObjectWithNameArray = Array<{ name: string }>;
定义自己的泛型类型,类比一下 Array<T>
interface Backpack<Type> {
add: (obj: Type) => void;
get: () => Type;
}
TypeScript的核心原则之一,就是类型检查,实际上是检查“形”里定义的值。在结构类型系统中,如果两个对象有相同的“形”,那么他俩就会被认定是同一类型。
interface Point {
x: number;
y: number;
}
function logPoint(p: Point) {
console.log(p.x, p.y);
}
const point = { x: 12, y: 26 };
const point1 = {x: 1, y: 2, z: new String('3'), n: 4}
logPoint(point); // 输出:12,26
logPoint(point1); // 输出:1,2
从上面的代码可以看到,point 是一个拥有 x
和 y
属性的对象,它从没声明过自己是 Point 类型,但是它通过了类型检查,因为他们有相同的“形”。这个机制用 shape-matching 描述起来更贴切。
shape-matching 匹配只需要是这个对象属性的子集,就匹配通过。即 {'{定义类型属性}'} ∈ {'{对象所有属性}'},在这个例子中就是参数 p 至少包含 x 和 y ,如果有其他属性 z 或者更多也不影响。此规则在类对象上也不例外。
一些基本的使用举例:
opkg update # 更新可用软件包列表
opkg upgrade dnsmasq # 升级dnsmasq软件包
opkg install dnsmasq # 通过软件源安装dnsmasq软件包
opkg install http://xxxx/packages/dnsmasq.ipk # 下载安装dnsmasq软件包
opkg install /tmp/dnsmasq.ipk # 本地安装dnsmasq软件包
opkg remove dnsmasq # 卸载dnsmasq软件包
opkg list # 列出可用软件包
opkg list-installed # 列出已安装软件包
opkg list-upgradable # 列出可升级的已安装软件包
一般不改,可在自行编译固件时加入所需软件包。如需升级,就构建新固件。
默认的源配置文件:/etc/opkg/distfeeds.conf
。
# 类比如下格式修改
src/gz immortalwrt_base https://mirrors.vsean.net/openwrt/releases/23.05.4/packages/aarch64_cortex-a53/base
src/gz immortalwrt_luci https://mirrors.vsean.net/openwrt/releases/23.05.4/packages/aarch64_cortex-a53/luci
src/gz immortalwrt_packages https://mirrors.vsean.net/openwrt/releases/23.05.4/packages/aarch64_cortex-a53/packages
src/gz immortalwrt_routing https://mirrors.vsean.net/openwrt/releases/23.05.4/packages/aarch64_cortex-a53/routing
src/gz immortalwrt_telephony https://mirrors.vsean.net/openwrt/releases/23.05.4/packages/aarch64_cortex-a53/telephony
自定义源配置文件:/etc/opkg/customfeeds.conf
# 添加自定义源
# src/gz example_feed_name http://www.example.com/path/to/files
src/gz kenzo https://op.dllkids.xyz/packages/aarch64_cortex-a53
如果添加自定义的源时,不添加密钥就需要关闭签名检查,在 /etc/opkg.conf
修改。
将 option check_signature
行使用 #
注释掉。
对软件源配置文件进行完修改后,更新软件列表 opkg update
。
Turbo ACC 模块本身是一个插件合集,使用它能够对网络进 行优化和加速。
它提供的功能有:
下载编译好的 luci-app-flowoffload 插件,运行 opkg install luci-app-flowoffload.ipk
进行安装。
安装完成后可在 luci 后台 Network->Turbo ACC Center 中进行管理,视路由器情况而开启加速功能。Flow Offloading 在 Network->Firewall 中进行管理。
DNS 解析就不开了,别处已经用到了🤐
小米路由器4A千兆版 是一款基于联发科 MT7621 SoC 的室内无线路由器,具有三个以太网端口(2xLAN + 1xWAN)、双频 802.11bgn + AC 无线 WiFi,有两种版本 China/Global 固件。
之前在老电脑上安装了 x86 的 Openwrt,这次给路由器安装一下。
访问 192.168.31.1,输入密码进入后台首页,将看到网址中有一个参数 stok=xxxxxx
,复制 stock 参数,后续会用的到。
该项目可利用远程命令执行漏洞开启路由器的 telnet、ftp 和 ssh 服务:
git clone https://github.com/acecilia/OpenWRTInvasion
进入项目目录后,安装依赖:
pip3 install -r requirements.txt
依赖安装后,需要修改一下 script.sh
文件,脚本中有 两处 curl 下载命令,执行过程中绝大多数情况下会下载失败,所以先下载下来,再利用 http-server 类似的工具开启一个本地服务器,使得那两个文件可以在局域网设备间都能访问。再用局域网内它们对应的下载地址替换原来 GitHub 上的地址,保存。
运行下列命令,中途需要 输入 stok 和 路由器管理地址:
python3 remote_command_execution_vulnerability.py
若执行成功,执行以下命令连接路由器,并输入用户名(root) 和 密码(root)。如果没有启用 telnet ,去 启用或关闭Windows功能
里开启一下。
telnet 192.168.31.1
telnet 连接到路由器后,另开一个终端,把下载好的固件用 ftp 传进去。
ftp 192.168.31.1
cd /tmp
put ./Downloads/firmware.bin
传输完成后关闭。
在 telnet 终端中继续,开始刷入固件:
cd /tmp
mtd -e OS1 -r write firmware.bin OS1
刷入成功将提示路由器重启,连接中断。
访问 192.168.1.1 即可进入 Openwrt 管理页面,默认用户名密码均为 root。