跳到主要内容

RTL8812BU驱动安装

· 阅读需 1 分钟

已经有人做出了安装包放在了AUR仓库,他用到了但是却没有把 linux-headers 写在 PKGBUILD 里面,导致安装失败。使用需要先手动安装这个这个依赖,再安装驱动才能成功。

yay -S linux-headers rtl88x2bu-dkms-git

完成以后即可搜索到 WiFi,这个螃蟹卡在实验室的台式电脑上似乎无法进入监听模式,后续用笔记本再捣鼓一下。

从 JavaScript 到 TypeScript

· 阅读需 6 分钟
信息

本栏笔记参考TypeScript文档撰写,目前尚无中文翻译,看起来费劲,在这里对其中的要点进行提取,融入自己的理解和示例代码,以中文的笔记形式记录下来。

本文对 TypeScript 进行简要的概述,重点介绍它的类型系统。

类型推断

在声明变量并给他赋值时,会把该值的类型作为该变量的类型。 当鼠标放在 words 上时,IDE会提示它是string类型。

let words = 'hello'

定义类型

默认会推断类型,可以这样创建一个 user 对象,它的 name 属性为字符串类型,id 属性为数字类型。

const user = {
name: 'Lee',
id: 0
}

显式描述类型

interface 事先定义好一个“形”,创建符合这个形的对象 user 时,会把 userUser 定义的属性进行匹配,比较其类型是否相符。以下代码,若缺少定义的属性,会被警告;若类型不匹配,也会被警告。

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 中的原始类型:booleanbigintnullnumberstringsymbolundefined,你可以在接口中使用它们。TypeScript 对这些类型进行了扩展,例如anyunknownnevervoid

定义类型有两种方式,你应该优先选择用 interface,必要时再使用 type

组合类型

可以通过组合简单类型来创建复杂类型。有两种流行的方法可以做到这一点:使用联合类型和泛型。

联合类型

使用联合类型,你可以定义一个可能会是很多种类型其中之一的类型,例如你可以定义一个 MyBool 其值可能是 truefalse

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 是一个拥有 xy 属性的对象,它从没声明过自己是 Point 类型,但是它通过了类型检查,因为他们有相同的“形”。这个机制用 shape-matching 描述起来更贴切。

shape-matching 匹配只需要是这个对象属性的子集,就匹配通过。即 {'{定义类型属性}'} ∈ {'{对象所有属性}'},在这个例子中就是参数 p 至少包含 x 和 y ,如果有其他属性 z 或者更多也不影响。此规则在类对象上也不例外。

标签:

Openwrt 第三方软件源与 opkg 的使用

· 阅读需 2 分钟
来自网络的第三方软件库

opkg 的基本使用

一些基本的使用举例:

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 网络加速模块

· 阅读需 2 分钟

Turbo ACC 模块本身是一个插件合集,使用它能够对网络进行优化和加速。

它提供的功能有:

  1. Flow Offloading 转发加速,来自高通开源的 Shortcut FE 转发加速引擎 (Fast Path),一种纯软件算法上的优化。可以针对openwrt所有型号的路由器。
  2. HWNAT加速。一般只针对 MT762x 芯片型号的路由器可以开启。
  3. BBR加速。谷歌弄出来的一个内核级别的 TCP 协议的优化,可以提高网络连接的能力(争抢带宽能力),这是linux内核 4.9 以后都可以用的一个东西,内核大于 4.9 的所有型号Openwrt路由器都能用。
  4. DNS 加速。主要是利用 pdnsd 做本地缓存,提高DNS解析速度,所有型号路由器都能用。

使用

下载编译好的 luci-app-flowoffload 插件,运行 opkg install luci-app-flowoffload.ipk 进行安装。

安装完成后可在 luci 后台 Network->Turbo ACC Center 中进行管理,视路由器情况而开启加速功能。Flow Offloading 在 Network->Firewall 中进行管理。

DNS 解析就不开了,别处已经用到了🤐

R4A Gigabit 刷入 Openwrt

· 阅读需 3 分钟

小米路由器4A千兆版 是一款基于联发科 MT7621 SoC 的室内无线路由器,具有三个以太网端口(2xLAN + 1xWAN)、双频 802.11bgn + AC 无线 WiFi,有两种版本 China/Global 固件。

之前在老电脑上安装了 x86 的 Openwrt,这次给路由器安装一下。

获取stok

访问 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 上的地址,保存。

2022-01-11-1

连接路由器

运行下列命令,中途需要输入 stok 和 路由器管理地址:

python3 remote_command_execution_vulnerability.py

若执行成功,执行以下命令连接路由器,并输入用户名(root) 和 密码(root)。如果没有启用 telnet ,去 启用或关闭Windows功能 里开启一下。

telnet 192.168.31.1

2022-01-11-2

刷入固件

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。

2022-01-11-3