Linux sed 命令添加多行文本 写在一行命令里

TL;DR sed ' /要搜索的内容/   a  第1行 \\n 第2行 \\n 第3行' kejilion的脚本, 考虑使用者有可能在墙内, 或者是纯ipv6的网络环境,  1) 在Docker包管理器时会使用国内的源,  2) 在获取 github 资源时, 会加上 ghproxy. 脚本会根据一些条件来帮助使用者进行判断, 是否应该使用这些特殊处理. 但是, 使用者的环境千奇百怪, 脚本的判断并不一定是最优的处理. 那么群里就会冒一条消息. 唉呀, 脚本卡住啦, 脚本出错啦, 求求大神快来解救我呀. 如果我们不想等"大神"来救, 那么我们可以自己决定是否要做这些特殊处理. 思路和 以前类似 , 也是用sed修改文本流的内容, 再灌到bash里面去执行. 我们要在文本中找到 quanju_canshu() { 然后在下面添加3行 zhushi=0 gh_proxy="https://gh.kejilion.pro/" return 当然了, 根据你的需求, 这2个参数的值是可以修改的. 比如, zhushi=1, 或者 gh_proxy="" 到此为止, 和以前都差不多, 写一篇文出来太水了. 我想写文的原因是, 如何使用sed添加多行文本, 写在一行命令里. 要用sed添加多行文本, 我找到的资料都是写成多行命令的, 我的意思是这样的: https://www.runoob.com/linux/linux-comm-sed.html man sed 查出来的官方帮助文档 a \ - append - 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用\续行 但是, 如果我要基于 bash <(...) 的模式修改, 我想还是保持一行命令的形式, 应该怎么写呢? 又经过一些搜索和尝试, 在 sed v4.9 版本下, 我实践成功的写法是这样的 sed ' /要搜索的内容/ a 第1行 \\n 第2行 \\n 第3行' 其中 /***/ 就是 搜索并定位 的功能, a 就是在下1行添加文本  的功能, \\n 实现了换行符. 回到我们的原始问题. bash <( curl -L "https://gh.kejilion.pro/h...

v2rayN-3.29-VLESS 生成配置文件 Xray链式代理 多http代理inbound 多落地节点outbound 一对一 隧道节点方便切换

之前 做了一个Xray 加载多个 链式代理 配置文件 多inbound 多outbound 一对一方案 , 要一个一个导出客户端配置文件, 还要修改 inbound 和 outbound 的 tag. 最终把多个配置文件放在同一个目录, 启动xray内核, 会合并所有配置文件的 inbound 和 outbound, 以及路由规则, 这样保证 inbound 和 outbound 一一对应. 整个过程还是有点麻烦的. 最近给 v2rayN-VLESS 开发 HY2 支持, 在处理  Reality 协议与 Hysteria2 协议节点并存 时, 走读代码的逻辑. 发现 如果多选了节点, 再用测速功能, 会先生成配置数据. 这个配置数据包含以下内容: 1. 在生成配置的时候, 会生成多个 http 代理的inbound. 2. 将你选择的那些节点也生成 outbound. 3. 生成很多个 路由规则  把这些http代理的inbound和要测试的节点的outbound 一一对应起来. 然后启动一个内核, 加载这个配置, 也就是包括了 上述这些 inbound, outbound, 路由规则. 然后再用这些inbound的http代理, 一个一个去访问测试URL, 也就一一测试了 outbound表示的节点. 那么我多想一步, 如果我们把这个配置数据用json文件保存出来. 自己另外用个裸内核加载跑起来, 不就是我们之前想达到的功能吗? 而且本来设置的下一跳socks5设置也保存, 方便你将一批落地节点套上隧道 加速. 在 GenerateClientSpeedtestConfigString 函数, 把生成的配置文本保存出来就行了. 那么, 实现原来这篇文  一个Xray 加载多个 链式代理 配置文件 多inbound 多outbound 一对一方案  的目的, 工作流程更新为: 在v2rayN (1)中添加隧道节点 在v2rayN (2)中添加全部落地节点 在v2rayN (2)中设置下一跳Socks5 为 v2rayN (1) 的监听Socks端口 在v2rayN (2)中 全选节点, Ctrl + R 测试真连接延迟. 此时, 会生成 testconfig.json 配置文件 在v2rayN (2)目录中, 命令...

Xshell 中 Ctrl + 鼠标左键 快速移动光标

今天孤陋寡闻了. 才知道 Xshell 中 Ctrl + 鼠标左键 快速移动光标 这个功能. 使用终端命令行的时候, 如果网络不是那么快, 操作按个键, 要过段时间才会有反应. 我已经养成了 用 home 移动到行首, end 移动到行尾,  Ctrl + 方向键按单词移动的习惯, 移动起来会快一点了. 但是遇到要移动到一个很长的单词中间, 或者上下移动的行数比较多的时候, 连按了几个方向键后, 总是要等一下光标的反应, 看到底移动到哪一行了. 这时候, Ctrl + 鼠标左键 快速移动光标 的功能就方便了. Xshell 的功能开关在 菜单 工具 - 选项 - 键盘和鼠标, 勾选 用 Ctrl + 鼠标左键单击 移动终端光标 实际操作演示

v2rayN-3.29-VLESS 支持 Reality 协议与 Hysteria2 协议节点并存

需求 v2ranN-VLESS 支持了 reality, 基于 xray 内核 v2ranN-HY2 支持了 hy2, 基于 v2ray 内核 reality和hy2都好用, 都需要.  我是在VPS上同时部署了多个协议的(只要用不同的端口, 不冲突就可以了).  在客户端, 我可不想为了换个协议用用, 就要关个软件再开个软件. 那么, 就要在 v2rayn.exe 的目录下同时放 xray.exe 和 v2ray.exe 然后要根据不同的协议来调用不同的内核. 分析 我们先来看看目前的代码逻辑是怎样的. 根据 之前的开发经验 , 我们知道, 启动内核是在 V2rayHandler 模块的 V2rayStart 函数 里的 p.Start () 倒着走读代码, 发现 V2rayFindexe 函数是用来判断启动哪个内核程序的. 逻辑是, 在 lstV2ray 这个列表中取字符串出来, 再拼上 .exe 的后缀, 然后看当前目录有没有这样的文件存在. 而这个 lstV2ray 列表呢. 存着这些. 也就是说, v2rayN 3.29 的原始逻辑是, 当前目录下, 这3个内核的文件, 找到哪个就启动哪个. 那么, 我们要做的是: 建一个"全局"变量, 用于保存 指定的内核程序名称. 在启动内核之前, 要先根据使用的协议来判断是否需要指定内核程序名称. 实践 添加 模板内"全局"的变量 "设为活动服务器" 的功能, 最后启动内核之前, 加个判断内核的函数调用 测速功能. 最后启动内核之前, 加个判断内核的函数调用. 把v2rayN软件设置里面的 outbound 也就是节点信息传进去. 而这个新增的 SetCoreExeByConfig 函数的实现呢. 就是根据节点信息里的特定属性, 判断是否reality协议, 是否hy2协议. 最后一个修改, 在查找内核程序的函数 V2rayFindexe 中, 原来的逻辑是遍历 { "xray", "wv2ray", "v2ray"} 这个列表. 现在修改为, 先构造一个列表. 规则是: 如果指定了内核, 那么列表中只有这个内核程序. 如果没有指定内核, 那么列表和原来的逻辑保持一致, 就是 { "xra...

v2rayN-HY2 测试真连接延迟

总功能列表在 这篇分析 里. 我们现在实现第 9 项 Ctrl+R 测速 打开主窗口 .cs 文件的设计器 找到菜单项, 双击,  打开菜单项 "测试真连接延迟" 的响应函数 走读代码, 跳转到 RunRealPing 函数. 继续走读代码, 一路跳转到 V2rayStartNew 函数 我们用 上一篇 一样的方法, 在 p.Start() 上设置断点. 再检查设置的启动参数. 可以看到, 实际上相当于在命令行执行 D:\_work\v2rayN-3.29-VLESS\v2rayN\bin\Debug\v2ray.exe -config stdin: 同样的, 这是 v2ray v4版本的启动语法. 我们要参考 v5 版本的启动语法了. 官方文档 https://www.v2fly.org/guide/start.html#运行 要注意, 测速的启动过程, 并不要指定配置文件. 而是, 先把程序启动起来, 再往 stdin (标准输入流) 输入json格式的配置文本. 而 v2ray v5版本, 要从stdin (标准输入流) 获取json格式的文本, 就要以 不指定配置文件的方式启动, 而且在同目录下不能有 config.json 文件. 所以, 我们把 生成配置文件的文件名, 修改为 不是config.json  比如, runconfig.json 进一步的, 我们使用的是 v4格式的json配置文本, 所以参数还要加上 -format json 最终, 修改启动参数为 run -format json 跑起来测试一下.   记得把以前生成的 config.json 文件删掉哦. 功能正常. ======== 开了一个分支, 本文的修改内容已提交. https://github.com/crazypeace/v2rayN-3.29-VLESS/tree/hy2 如果你有兴趣, 可以看到整个的开发过程. 本次修改记录 https://github.com/crazypeace/v2rayN-3.29-VLESS/commit/3129b5e ======== 如果只是使用 hy2 的话, 应该是可用的状态了. 所以发布了一个 pre release https://github.com...

v2rayN-HY2 导出分享链接至剪贴板 显示分享二维码

总功能列表在 这篇分析 里. 我们现在实现第 8 项 导出分享链接至剪贴板 打开主窗口 .cs 文件的设计器 找到菜单项, 双击,  打开菜单项 "导出分享URL至剪贴板" 的响应函数 走读代码, 一路 F12 跳进去, 直到 GetVmessQRCode 函数. 这里就是生成分享URL的地方. 很明显, 函数名称没有及时更新, 还叫 Vmess  Hy2 分享链接的格式有官方定义. https://v2.hysteria.network/zh/docs/developers/URI-Scheme/ 示例: hysteria2://密码@服务器IP域名:端口?insecure=跳过证书验证#备注 我们照着 VLESS 的逻辑抄一遍. 没有encryption参数, 所以去掉. 继续跳进 GetStdTransport 函数. 这里面是处理 streamSettings 结构中的数据. 我们添加 hy2 的处理. 跑起来测试一下. 能复制出分享URL了. 但是里面多了一些参数. hysteria2://7c6c918f-6e80-3283-9cf0-a8d34e80f86e@104.168.128.251:2053?security=tls&type=hysteria2&insecure=1#HY2-104.168.128.251 security 和 type 参数在 hy2 的官方定义中是不应该出现的. 所以我们改一下, 不要调用 GetStdTransport 函数了, 直接在 GetVmessQRCode 函数中, 把 insecure 参数填充了就算了. 测试一下, 分享的URL正常. 生成的二维码用 Shadowrocket 扫一下, 也能正常使用. ======== 开了一个分支, 本文的修改内容已提交. https://github.com/crazypeace/v2rayN-3.29-VLESS/tree/hy2 如果你有兴趣, 可以看到整个的开发过程. 本次修改记录 https://github.com/crazypeace/v2rayN-3.29-VLESS/commit/16dd2f6

v2rayN-HY2 能正常使用

总功能列表在 这篇分析 里. 我们现在实现第 7 项 能正常使用 首先要在 v2rayN.exe 同目录下放一个支持 hy2 的 v2ray 内核. 写本文时, 最新版本 v5.21.0  https://github.com/v2fly/v2ray-core/releases/tag/v5.21.0 下面, 开始处理代码. 打开主窗口 .cs 文件的设计器 找到菜单项, 双击,  打开菜单项 "设定为活动服务器" 的响应函数 一路走读代码, 遇到函数就 F12 跳进去.  最终看到 V2rayConfigHandler 模块的 GenerateClientConfig 函数. 然后我们需要在 outbound 函数里面 添加 生成 hy2 内容的逻辑. 抄一下原来的 Trojan 的流程框架, 把 hy2 相关的数据处理一下. 从配置文件上看, hy2 的参数, 要写在 streamSettings 里面. 所以我们还要继续修改 boundStreamSettings 函数. 跳进去一看, 对不同的 network, 相应地生成不同的 streamSettings. 也是照着其它的逻辑框架, 实现 hy2 的处理. 为了照样子抄呢, 还要新增一个结构 Hy2Settings 看一下其它的 Settings 定义在哪里, 鼠标点在 QuicSettings 上, F12 跳转到定义. 原来在 V2rayClientConfig 模块里. 我们也照样子抄一个结构. 这个结构是和配置文件的json结构相对应的. 对比观察一下. 进一步的, 在配置文件的json结构中, hy2Settings 是 streamSettings 的子元素. 那么在 C# 的数据结构定义中, 也要给 StreamSettings 类(结构) 添加一个 Hy2Settings 数据成员(子元素). 进一步的, 请你注意到, C# 中数据成员的命名, 要和 json 结构中的 key 名称完全一致. 这是和 C# 中将 数据结构 序列化为 Json 结构的规则有关. 跑起来看看. 报了一堆错. 似乎是启动命令有问题. 继续走读代码, 找到了...