Linux
VRPirates 开发的 Rookie Sideloader 免费提供了几乎所有 Meta Quest 商店的付费游戏,但客户端仅支持 Windows 系统,且目前没有开发 Linux 客户端的计划,这里提供一种在 Linux 下手动下载安装 VRPirates 资源的方法
图片来源:Easy Diffusion 生成(参数), Aseprite 编辑 系统是 ArchLinux , 无线网卡是 Intel Wi-Fi 6 AX200 原因 Windows 快速启动阻止了 Linux 访问本机无线网卡 解决方案 1. 启动 Windows 并关闭快速启动 2. 如果上述操作后还是不行,可以尝试拔掉主机电源线,长按电源键30秒,重新插上线再重启(来自linuxmint论坛,亲测有效)
图片来源:https://www.pixiv.net/artworks/65838500 term 表示信号终止进程,core 表示进程产生核心转储文件并退出,ignore 表示忽略该信号,stop 表示信号停止了进程,cont 表示信号恢复了一个已停止的进程 信号 信号值(x86) 默认行为 描述 触发场景 SIGABRT / SIGIOT 6 core 进程终止信号 进程调用 abort()函数时,系统向进程发送该信号 SIGALRM 14 term 实时定时器过期 调用 alarm()或 setitimer()而设置的实时定时器到期,内核将产生该信号 SIGBUS 7(不可移植) core 内存访问错误 使用由 mmap()所创建的内存映射时,如果试图访问的地址超出了底层内存映射文件的结尾,那么将产生该错误 SIGCHLD 17(不可移植) ignore 子进程终止、暂停、继续 子进程终止、子进程因收到信号而停止或恢复时向父进程发送该信号 SIGCONT 18(不可移植) cont 如果被暂停,重新继续执行 将该信号发送给已停止的进程,进程将会恢复运行。当接收信号的进程当前不处于停止状态时,默认情况下将忽略该信号 SIGEMT 未定义 term 硬件错误 UNIX 系统通常用该信号来标识一个依赖于实现的硬件错误。Linux 系统仅在 Sun SPARC 实现中使用了该信号 SIGFPE 8 core 算术异常 在 x86-32 架构中,整数除以 0 总是产生 SIGFPE 信号,但是对浮点数除以 0 的处理则取决于是否启用了 FE_DIVBYZERO 异常。如果启用了该异常(使用feenableexcept()),那么浮点数除以 0 也将产生 SIGFPE 信号,否则,将为操作数产生符合 IEEE 标准的结果(无穷大的浮点表示形式)。 SIGHUP 1 term 挂起 检测到控制终端挂起或者控制进程死亡时,进程会收到 SIGHUP。许多守护进程会在收到 SIGHUP 信号时重新进行初始化并重读配置文件。nohup 命令用于无视该信号 SIGILL 4 core 非法的指令 如果进程试图执行非法(即格式不正确)的机器语言指令,系统将向进程发送该信号 SIGINT 2 term 终端中断信号 当用户键入终端中断字符(通常为 Ctrl-C)时,终端驱动程序将发送该信号给前台进程组 SIGKILL 9 term 杀死 此信号为“必杀(sure kill)”信号,处理器程序无法将其阻塞、忽略或者捕获,故而“一击必杀”,总能终止进程 SIGIO / SIGPOLL 29(不可移植) term I/O 时可能产生 利用 fcntl()系统调用,即可于特定类型(诸如终端和套接字)的打开文件描述符发生 I/O 事件时产生该信号 SIGPIPE 13 term 管道断开 当某一进程试图向管道、FIFO 或套接字写入信息时,如果这些设备并无相应的阅读进程,那么系统将产生该信号 SIGPROF 27(不可移植) term […]
图片来源:https://www.pixiv.net/en/artworks/74361938 名称 解释 task_struct 中的对应变量(定义在 include/linux/sched.h 中,均为全局ID,内核版本 v2.6.24) 对应的系统调用 PID (Process ID) 字面上是虽然是 进程 ID,实际上就是线程 ID,内核中进程、线程都使用 task_struct 结构表示 task_struct->pid pid_t gettid(void); TGID (Thread Group ID) 线程组 ID,即线程组组长的 PID,真正的进程 ID,如果进程只有一个线程则他的 PID 和 TGID 相同 task_struct->tgid pid_t getpid(void); PGID (Process Group ID) 进程组 ID,多个进程可以组合为进程组,方便向所有成员发送信号,进程组组长的 PID 即为PGID task_struct->signal->__pgrp pid_t getpgrp(void); SID(Session ID) 会话 ID,多个进程组可以组合为会话,会话的组长PGID 即为 SID task_struct->signal->__session pid_t getsid(pid_t pid); PPID (Parent Process ID) 父进程 ID task_struct->parent->pid pid_t getppid(void); 参考:
图片来源:https://www.pixiv.net/en/artworks/74340900 这里的有线设备指带网线的物联网设备,正常情况下这些设备将网线插入家用路由器后即可正常使用 基本思路就是: 网络共享这一部分主流桌面环境和 NetworkManager 都有很好的支持,没有特殊需求的话,直接使用图形界面的网络设置即可 Ubuntu(GNOME) 硬件要求:带 RJ45 网口的 ubuntu PC、无线网卡 步骤 使用无线网卡连接互联网, 创建共享,将无线网络共享给有线网口 将物联网设备网线插入 Linux 机器网口,打开 wireshark 抓取有线网卡的数据包即可 SteamDeck 外接扩展坞(KDE) 硬件要求:SteamDeck、带 RJ45 网口的 TypeC 扩展坞 SteamDeck 是V社推出的游戏掌机,自带的系统 SteamOS 3.0 基于 Arch Linux,默认 KDE桌面环境,本质上就是一台X86架构的 Linux PC,但由于V社对系统魔改,配置上多少还是和其他 Linux 有区别 步骤 在游戏模式中开启开发者模式(Setting -> System -> Enable Developer Mode) 按 steam 键,选择电源,切换到桌面模式(Power -> Switch to Desktop) 使用无线网卡连接互联网 快捷键 Ctrl + Alt + T 打开 Konsole,执行以下命令: 创建共享,将无线网络共享给有线网口 将物联网设备网线插入扩展坞网口,打开 wireshark 抓取有线网卡的数据包即可 参考:
图片来源:https://www.pixiv.net/en/artworks/101574081 最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。 1940年,沃伦·麦卡洛克与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。 1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为「正则集合」的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,随后是Unix上的编辑器ed,并最终引入grep。自此以后,正則表达式被广泛地应用于各种Unix或类Unix系统的工具中。正则表达式的POSIX规范,分为基本型正则表达式(Basic Regular Expression,BRE)和扩展型正则表达式(Extended Regular Express,ERE)两大流派。在兼容POSIX的UNIX系统上,grep和egrep之类的工具都遵循POSIX规范,一些数据库系统中的正则表达式也符合POSIX规范。grep、vi、sed都属于BRE,是历史最早的正则表达式,因此元字符必须转譯之后才具有特殊含义。egrep、awk则属于ERE,元字符不用转譯 。 维基百科 BRE 和 ERE 是 POSIX 标准中定义的两种不同风格的正则表达式, 只支持一些比较基础功能,没有贪婪匹配( .* )和非贪婪匹配( .*? )的区别(具体效果要看具体的实现,GNU的实现中均表现为贪婪匹配,另外一些实现中 .*? 可能导致语法错误),也不支持正、逆向巡视等语法。 BRE语法 . :匹配单个任意字符, 匹配 . 本身使用 \. * :前面的字符或模式重复任意次,匹配 * 本身使用 \* \{m\} :前面的字符或模式重复m次 \{m,n\} :前面的字符或模式重复m到n次 \{m,\} :前面的字符或模式重复m次及以上 \(regexp\) :分组,将 \( 和 \) 之间的内容视为一个整体,有两个作用 ^ :放在正则表达式开头则匹配行首,其他位置匹配 ^ 本身 $ :放在正则表达式末尾则匹配行尾,其他位置匹配 $ 本身 [list] :自定义字符集,可以匹配 [ 和 ] 之间出现的任意字符,例如: a[bcd] 可以匹配”ab”,“ac”或“ad”。且支持使用char1-char2这种省略写法,例如: [0-9]* 可以匹配”1234567890“ , [a-c]* 可以匹配“cabba” [^list] :同上,但匹配所有没有出现在 [ 和 ] 之间的其他字符 另外其他风格的正则表达式中有诸如 \d \w \s 等速记符号(shorthand)表示一些常用字符集,BER和ERE均不支持这种写法,取而代之的是POSIX标准中定义的字符集: POSIX Description ASCII Shorthand [:alnum:] 数字和字母 [a-zA-Z0-9] [:alpha:] 字母 [a-zA-Z] [:ascii:] ASCII字符 [\x00-\x7F] [:blank:] 空格和 Tab [ \t] \h [:cntrl:] 控制字符 [\x00-\x1F\x7F] [:digit:] 数字 [0-9] \d [:graph:] 可视字符 [\x21-\x7E] [:lower:] 小写字母 [a-z] \l [:print:] 可打印字符 [\x20-\x7E] [:punct:] 标点符号 [!”#$%&'()*+, -./:;<=>?@[ […]
图片来源:https://www.pixiv.net/artworks/89845503 有如下三个表格,他们各自对应一个CSV格式文件 Fruit Qty Price Apple 13 1.1 Banana 24 2.3 Pear 7 1.5 Fruit Qty Price Apple 27 5.5 Pear 40 3.04 Watermelon 5 0.99 Fruit Qty Price Banana 12 0.55 Pear 15 2.98 Peach 8 6 使用awk合并上述3个表格,对于相同水果合并数量并求均价 用法: 输出: 合并后输出为CSV格式的单行版本 输出:
图片来源:https://www.pixiv.net/artworks/42320059 大多日志都会在行首添加时间信息,通过在awk脚本内调用date命令把时间信息转换为时间戳进行比较实现日志截取 以linux启动日志为例,以空格为分隔符的话,前三个字段为时间信息 下面的脚本截取 2022-11-11 12:51:44 ~ 2022-11-11 12:52:44 这一分钟内的日志(执行:./logfilter.awk boot.log) 或者略微修改一下,通过命令行传入起止时间 用法
图片来源:https://www.pixiv.net/artworks/81733152 使用sed处理类似下面这样的有独立的首尾特征的多行结构数据,实现增删改查 增 给梨添加一个产地字段(from = guangxi) 删 删除苹果的产地 改 修改香蕉的价格 查 打印所有打折的水果(on_sale = true) 单行版本 多行版本 参考:
图片来源:https://www.pixiv.net/artworks/81818784 PCAPdroid下载安装 PCAPdroid是一个Android端抓包软件,可以不使用root权限,通过VPN的方式捕获网络流量并保存为pcap文件。但以这种方式保存的报文没有Enternet数据,可以通过tcprewrite修改报文,添加Enternet报文头 安装包下载链接: 抓包 Linux上使用tcprewrite添加Enternet报文头 tcprewrite工具包含在tcpreplay包里,安装tcpreplay即可 安装 Arch Linux Ubuntu 重写报文数据 将手机上抓包保存的pcap文件传到PC上,使用下面的命令添加Enternet报文头 另外我在Arch Linux上使用安装的“tcpreplay-4.4.2”存在重写失败的情况,回退到“tcpreplay-4.3.1”后则没有问题
图片来源:https://www.pixiv.net/en/artworks/101040610 基本语法 getopts用来在shell脚本中解析命令行传入的选项 optstring optstring指定要解析哪些选项,哪些选项需要额外参数(如-f选项需要一个用户指定的文件名),需要额外参数的选项后面添加冒号 比如下面这条命令,使用tar创建一个tar包“test.tar” 其中, c选项表示“创建”,不需要参数;f选项指定生成的文件名,需要参数。所以解析这两个选项的optstring应该写成 特殊变量 解析错误 示例 下面编写一个简单的备份文件脚本,演示getopts的用法 脚本的基本功能和用法: 参考:
图片来源:《侦探已经死了》第一集截图 使用的Android设备为一加7Pro, 刷机和root流程:Linux下给一加7Pro刷入LineageOS、获取root权限 不需要root权限的抓包方法:Android手机4G网络抓包(no-root) 方案一(仅使用手机):安装配置Termux Termux下载地址:官方github仓库, GooglePlay(不推荐,版本较老), Fdroid, apkmirror 配置 打开Termux 获取存储权限,并且会在家目录下生成storage文件夹,里面包含downloads等手机共享目录的软连接方便使用 先更新一波,更新过程中可能会有多次提示配置文件覆盖需要你选择,直接回车默认是不覆盖,也可以输入“Y”选择覆盖,建议覆盖 添加root仓库 安装sudo工具 安装tcpdump 抓包 运行tcpdump开始抓包,然后切换到需要抓包的应用开始操作即可 “Ctrl+C”停止抓包,这样抓到的报文就会保存在系统下载目录的“xxx.pcap”文件中 这样抓的包以太网协议头会被替换成伪协议“Linux cooked capture”,需要的话可以进行转换,转换方法见文末 方案二:使用tcpdump和PC端wireshark抓包 注意:LineageOS支持下面的操作,但很多国内厂商的手机系统,即使root了也无法进行下面的操作,原因和解决方案请自行参看https://stackoverflow.com/questions/25271878/android-adbd-cannot-run-as-root-in-production-builds 安装adb Arch Linux Ubuntu 安装tcpdump到手机 访问https://www.androidtcpdump.com/android-tcpdump/downloads, 下载“tcpdump for ARM Android” 手机打开“USB调试”、“Root身份调试”,数据线连接手机和电脑,进入存放刚刚下载的tcpdump的目录,执行 抓包 确保adbd运行在root模式 电脑上打开wireshark,能看到很多“Android tcpdump”开头的网卡(Android tcpdump 后面跟的第一个单词才是真的网卡名字) 候选网卡比较多,可以一个个试,移动数据网络一般是“rmnet_dataN”(N是个数字,关闭“移动数据”再打开可能会变),我的是“rmnet_data3”,双击即可开始抓包 和方案一一样,这样抓的包以太网协议头会被替换成伪协议“Linux cooked capture”,需要的话可以进行转换,转换方法见文末 Linux cooked-mode capture (SLL)格式转换 使用“tcprewrite”重写数据即可,“tcprewrite”包含在“tcpreplay”包中 安装 Arch Linux Ubuntu 转换 另外我在Arch Linux上使用安装的“tcpreplay-4.4.2”存在转换失败的情况,回退到“tcpreplay-4.3.1”后则没有问题 参考:
图片来源:https://www.pixiv.net/artworks/86467376 安装 安装adb Arch Linux Ubuntu 安装gnirehtet Arch Linux可通过aur安装 Ubuntu 需要手动下载,访问https://github.com/Genymobile/gnirehtet/releases下载最新版,有java版和rust版,个人建议下载rust版的,rust版的解压后仅包含两个文件“gnirehtet”和“gnirehtet.apk”。 进入解压目录,手动安装(不是必须的,可以跳过) 手机进入开发者模式并打开USB调试 不同手机界面会有些区别,但都差不多,设置里找到系统版本号连点7下,会提示进入开发者模式,之后再找到“开发者选项”,打开USB调试即可(也有叫Android调试的) 连接电脑 插入数据线将手机连接到电脑,手机会有弹窗“允许USB调试吗?”,点击允许(有的手机不会弹窗,默认仅充电,可以在通知栏修改连接选项) 可通过命令查看是否已连接 运行 注意:如果你的手机有其他VPN软件并且该VPN设置了“始终开启的VPN”选项,请先关闭,否则即使连接了“Gnirehtet”也可能中途断开无法上网 执行以下命令,会自动检测、安装“gnirehtet.apk”到手机、添加VPN(手机会弹出提示,需要确认)并转发手机网络数据 要停止的话,电脑上直接“Ctrl + C”就行 抓包 wireshark找不到网卡无法抓包解决方法:linux下wireshark无法抓包问题 wireshark抓电脑有线网卡的包即可。由于这种共享网络的方式没有使用额外网口,只能抓电脑出口网卡的报文,手机产生的报文会和电脑本身发送/接收的报文混在一起,算是个缺点 可选:添加gnirehtet快捷启动方式(Desktop entries) 在“~/.local/share/applications/”添加一个desktop文件,让桌面环境菜单能够找到并添加该程序(当然这个desktop文件可以放到任何目录,比如桌面,双击即可运行) 更新数据库 参考:
图片来源:https://www.pixiv.net/artworks/96346431 配置了v2ray+cgproxy的透明代理,每次v2ray更新之后都会失效,需要手动添加抓包相关权限,通过添加hook的方式在更新后自动添加权限 备注:Type使用Path而不使用package是因为官方仓库、archlinuxcn以及aur中都有v2ray安装包,Path更通用一些;Target使用“usr/bin/v2ray”而不是“/usr/bin/v2ray”,否则匹配不上 参考:
图片来源:《空之境界-未来福音》截图 解锁bootloader、刷机部分基本照抄的LineageOS官方教程,有基本的英语阅读能力的话建议直接看官方教程 工具 刷机要用到adb和fastboot, Arch Linux下安装“android-tools”即可 其他Linux发行版可以参考Linux查询文件所属包和查看包所包含文件,来查找adb和fastboot命令属于哪个包 进入开发者模式 设置->关于手机,连点7次版本号,成功会有“您现在处于开发者模式”的提示 打开USB调试 设置->系统->开发者选项,开启“USB调试” 解锁bootloader 解锁OEM 设置->系统->开发者选项,开启“OEM解锁” 连接到电脑 插入数据线连接到电脑,手机会有弹窗“允许USB调试吗?”,点击允许。可通过命令查看是否已连接 进入fastboot模式 或者也可以通过在关机状态下按住“音量+”+ “音量-” + “电源按键”直接启动进入fastboot模式 确认手机正常连接到fastboot 解锁 执行命令后手机会显示相关警告,通过音量键选择“UNLOCK THE BOOTLOADER”解锁,解锁会导致手机重启,如果没重启可以手动重启一次,确保能正常进入系统 刷机 刷入Lineage Recovery 访问https://download.lineageos.org/guacamole下载一加7Pro对应的Recovery镜像(img后缀) 参考“解锁bootloader”时的步骤进入fastboot模式,并确保连接正常 刷入Recovery 执行成功后在手机上用音量键选择到“Recovery mode”并按电源键进入Recovery模式。或者也可以在关机状态下按住“音量-”+ “电源键”启动并进入Recovery模式 进入Recovery模式后,执行电脑上执行“adb devices”确认是否正常连接,如果没有的话Recovery主菜单选择 Advanced->Enable ADB Ensuring all firmware partitions are consistent 没有相关知识,这部分没看懂,总之是解决潜在问题 访问https://mirrorbits.lineageos.org/tools/copy-partitions-20220613-signed.zip下载相关文件 进入 Apply Update->Apply from ADB ,执行: 返回Recovery主菜单,Advanced->Reboot to recovery 重启进入Recovery模式 刷入LineageOS 访问https://download.lineageos.org/guacamole下载一加7Pro对应的LineageOS镜像(zip后缀) 进入Recovery模式,格式化以去除磁盘加密,Factory reset->Format data / factory reset->Format data 返回Recovery主菜单,进入 Apply Update->Apply from ADB ,执行: 执行可能会卡在“47%”的进度,最后报错,属正常现象,其实刷成功了 如果不需要安装下面的google相关应用和获取root权限的话,这里直接回到Recovery主菜单,选择“Reboot system now”就完成了 如果卡在开机界面无法启动(正常第一次启动不会超过15分钟,我的1分钟左右就进入使用引导了),很有可能是漏了上面某个步骤,可以长按“音量+”+“电源键”10秒强制关机,然后重新进入fastboot或者recovery重新进行上面的步骤 Google Apps(可选) 官方用的是https://wiki.lineageos.org/gapps里的安装包(MindTheGapps 和 OpenGapps),包含一些我不需要的应用,这里选择BiTGApps保证最小化安装( Google Play Store和运行必要的服务) 访问https://bitgapps.github.io/download.html获取安装包(arm64,android11),进入Recovery模式(如果刷了LineageOS没重启过,返回Recovery主菜单,Advanced->Reboot to recovery 重启进入Recovery模式),进入Apply Update->Apply from ADB,执行: 由于BiTGApps没有使用LineageOS 的密钥签名,手机会弹出警告,选择yes即可,安装完成后重启手机即可 获取Root权限 通过刷入magisk来获取和管理root权限 访问https://magiskapp.com/apk/下载最新版magisk安装包(页面加载完成后,需要等待15秒左右才会出现“Download Magisk App (Latest)”按钮) 访问https://github.com/topjohnwu/magisk/releases下载最新版magisk安装包 手机正常开机,然后电脑上使用 adb 安装 magick 应用(或者也可以自己传到手机上像正常应用一样安装) 安装完成后打开Magisk应用,会提示“需要修复环境”,点击确认,之后会自动重启。 进入Recovery模式,进入Apply Update->Apply from ADB,电脑上还是使用刚才下载的安装包,将文件后缀由apk改为zip,执行: 由于magisk没有使用LineageOS 的密钥签名,手机会弹出警告,选择yes即可,安装完成后重启手机即可 如何卸载Magisk 打开手机上的Magisk应用,点击 卸载 Magisk->完全卸载,之后会自动重启进入Recovery模式。 Recovery模式下, 进入 Apply […]