实用 shell

文本处理 清除每行头&尾部的空白符 awk '{$1=$1;print}' ref: https://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file 在一个文本随机选取若干行 // macos 则先 brew install coreutils,然后用 gshuf shuf foo.txt | head -n 100 cat foo.txt | awk 'BEGIN{srand();}{print rand()"\t"$0}' | sort -k1 -n | cut -f2- | head -n 100 ref: https://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file 截取每行的前几个字符 cut -c 1-3 file // 前三个字符 ref: https://stackoverflow.com/questions/19869511/how-to-restrict-length-of-string-present-in-a-line-using-linux

2021-12-20 · 1 分钟 · 48 字

用七牛云作图床并配置 SSL

背景 一年前我写过《使用 CloudFlare/百度云加速做免费SSL》,里面提到了:因为 Chrome 的最新安全限制, https 站点无法正常加载 http 的图片和其他静态资源,这使得我不得不给我的图床加上 SSL。 前几天发现我的博客里的图片无法被正常加载,观察控制台后发现 图床的 SSL 证书出问题了。到百度云加速控制台看,才发现上次申请的一年 SSL 证书已经到期了,并且需要付费才能继续申请证书。好吧,白嫖的快乐没有了。 那就不用百度云加速了,SSL CDN 也用七牛云的吧。 七牛云 前提:你需要有一个已备案的域名,否则只能使用七牛的临时测试域名,是有有效期的 免费套餐 从 2016 年白嫖七牛云存储至今,本文就当做给七牛打回广告吧。 先说结论: 如果你只用 http 访问文件,每个月不超过 10G 流量的话,那么用七牛云相当于白嫖,一分钱都不用花 如果需要使用 https 则需要花费一些费用(0.28 元/GB),一般博客小站,每个月最多不超过 1 块钱吧。等过段时间,我有了一定数据再回来更新这个数值。 对于个人用户来说,有 10G 的免费存储,每个月 10G 的流量已经非常足够了。具体的资费可以参看 官网价格 。PS. 从价格表会看到 外网流出流量 会被收费,这点不用担心,我专门查了下官方说明: 如果使用了七牛测试域名或者融合 CDN 域名访问资源,是不会计算外网流出流量的 也就是说,你绑定一个域名回源到七牛云的对象存储,每个月不超过 10G 则不收费。 创建一个 bucket 在七牛云对象存储 管理后台,创建一个bucket: 存储区域选国内的都行;访问控制设置为公开,毕竟我们要将其用作图床 绑定域名 创建成功后,会提示你绑定一个域名。该域名将作为 CDN 域名,通过该域名访问你的文件时,会尝试在 CDN 节点找缓存;缓存未命中再回源到你上边创建的 bucket。 我们添加一个域名,该域名必须是经过备案的。 通信协议:如果你不需要 HTTPS,那么选择 HTTP 就足够了 ...

2021-11-14 · 1 分钟 · 152 字

使用CloudFlare/百度云加速做免费SSL

2021-11-14更新:百度云加速过期了,CDN 也直接用七牛云的吧。有兴趣的朋友可以看这篇文章《用七牛云作图床并配置 SSL》 2020-11-03更新:已将cdn部署到百度云加速服务。国内使用Cloudflare确实不行,最近看到百度云加速有免费套餐,个人博客来说完全够用了。步骤不复杂,就不详细描述了。步骤大概为: 需要域名备案 在百度云加速实名认证 添加网站时,选择CNAME接入方式。(官方推荐的是NS方式,这样可以全称托管,但我目前只希望托管我的cdn域名) 证书管理-证书申请可以免费申请ssl证书 安全功能-HTTPS,选择半程加密。这样源站可以不支持SSL 以下为原文: 注意一下,由于众所周知的原因,在国内访问CloudFlare会很慢,我只是用于个人博客的部分图片使用,所以容忍度会比较高。有高要求的同学,不建议在国内使用。 对于经常科学上网,尤其是自己搭建科学上网的同学来说,CloudFlare一定再熟悉不过了。经常有同学将它套在国外机子上,用来加速流量。因为CF本身就是一个CDN服务,可以用于加速各种服务。 今天我选择用它做我图床的cdn服务。 背景 起因是这样的,这两天发现我博客的背景图加载不出来了,查看网络请求后发现我的图床域名https://cdn.foamzou.com/legacy被强制使用https发起请求了。这是因为我的html页面是https的,chrome很不喜欢https页面包含了http请求,认为这很不安全。所以它强制在发起请求的时候在http header加了upgrade-insecure-requests: 1。该头部会告知服务端,客户端支持将http升级为https。在接下来的http请求中,浏览器会将其替换为https再发起请求。(但我将upgrade-insecure-requests: 1改为0,还是会替换为https,不确定是不是该头部的原因,也可能是chrome最近自升级加的特性。其它浏览器例如Safari就正常访问) Ok,已经确定是chrome新版本的特性,将混合内容(mixed content)的http改写为https了。在2019年10月份,google就通过博客发布了chrome关于内容安全的更新时间表: - v79 [2019年12月发布到稳定渠道]:将mixed的脚本文件、iframe升级到https - v80 [2020年1月发布到试用渠道]:将mixed的音视频文件升级到https。虽然允许mixed的图片文件加载,但该站点会在地址栏被标记不安全 - v81 [2020年2月发布到试用渠道]:将mixed的图片文件升级到https 按计划是2月份发布到early release渠道,估计也是前段时间才被更新到稳定渠道,然后自更新导致我的图片挂掉 问题来了,我的图床域名并不支持https,导致ssl握手失败,我的图裂开了!如果要支持的话,我需要在七牛支付一定的费用(https流量没有免费额度),而且需要配置一个ssl证书,可以购买(几千块一年,好贵),也可以上传自定义证书(也略麻烦)。 突然想起我可以把CF套在域名上,CF有免费套餐,一般的需求足够了,ssl证书还不用自己配置。 开干 说干就干,打开官网,没有账号的话注册一个。 添加站点 注意,这里只能填写根域,不支持单独加速子域名。但我只想加速某个子域名怎么办?没事,后面步骤可以配置。 添加站点 选择套餐 选择免费的就可以啦 选择套餐 修改代理状态 选择完套餐后,CF会将你域名的解析记录带出来,如下图 dns记录 在代理状态那列点击小图标可以切换状态。现在有两个状态可以切换,已代理和仅限DNS。注意,对于你不希望走CF的域名,请设置为仅限DNS,这样CF只会帮你将域名解析到你的源ip,而代理则解析到CDN节点,再帮你回源。 由于CF在国内的网络情况并没有阿里云这些本地的厂商好,所以博客域名我没有走CF,只是代理了file.zoufeng.net 好,点击继续。 修改域名的DNS服务器 这一步需要到你的域名管理台(在哪买的域名就去哪),将原来的DNS服务器删除,换成CF自己的。完成之后点击蓝色按钮。 设置ssl 点击SSL/TLS按钮,将选项修改为灵活,这样CF节点支持ssl,而源服务器不需要ssl。完全的话,源服务器就需要支持ssl了。我的七牛图床域名不支持ssl,所以选择了灵活。这也是本篇文章的最开始的目的。 等待生效 等吧。修改DNS服务器那一步耗费的时间可能会长一些。你可以通过ping命令检查是否已经解析到CF的ip了。 其它 你可能看到上一张图有很多菜单:缓存、防火墙、worker等。CF挺多功能的,有兴趣的话,注册一个玩玩吧。worker就是serverless那东西,类似AWS CloudFront的lambda@edge

2020-09-30 · 1 分钟 · 56 字

使用Telegram Bot发通知消息

用途 定点提醒你做事。例如到点发现你还没写日记就提醒你 配合手机tasker、workflow做消息提醒 触发各种你关心的webhook等 准备工作 可以科学上网的机器 一个手机号 注册TG账号 在网络下载一个tg客户端,并注册账号,现在貌似都要用手机注册。 注册完成后,记得在设置 -> Privacy and Security -> Phone Number 设置为Nobody,网上冲浪还是要把自己保护好。 有时候可能会遇到无法发消息给别人的情况,有可能是系统误杀。可以跟在搜索框添加官方账号 @SpamBot ,反馈问题。用 /start 开启和它的对话,然后点击用它返回的菜单或者直接和它沟通。不出意外,一段时间后会帮你清理掉你账号的异常情况。 创建机器人 搜索框添加官方机器人管理员@BotFather 。键入 /start 开启和它的对话,点击它返回的 /newbot。管理员提示给它取个爱称,输入后,管理员提示给它取个昵称,ok,这俩名字取一样的应该没啥问题。 然后管理员会回你一段话,其中1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx 就是你机器人的token,请妥善保存,后面会用到。 Use this token to access the HTTP API: 1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx Keep your token secure and store it safely, it can be used by anyone to control your bot. 到这里就已经创建了一个机器人,你可以多创建几个,如果有需要的话。 获取你与机器人的聊天会话id 机器人发信息的api需要指定聊天会话id(chat_id),所以我们要获取到它。 首先你需要找到机器人跟它说句话,然后访问链接(浏览器打开或者curl都行):https://api.telegram.org/bot1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx/getUpdates 。将链接的token换成你机器人的,bot<你的token>/getUpdates。会正常响应机器人最近的聊天记录,找到message.chat节点下的id,这就是chat_id,记录下来。 { "ok": true, "result": [{ "update_id": 345541000, "message": { ..... "chat": { "id": 703240000, "first_name": "foam", "last_name": "zou", "username": "foamzou", "type": "private" }.... 当然,你也可以把机器人拉到群里,在群里说几句话,然后也是像上面操作,拿到chat_id。ps.如果是私密群,id是负数。 ...

2020-08-15 · 1 分钟 · 106 字

fish shell切换到zsh

fish shell 想来用了也3年多了,大部分时间并不是在用fish shell的语法特性,而是觉得自带的主题好看,以及自动补全功能。当时挑选 xx shell时还网上做了功课,也在zsh和fish之间徘徊,后面看了阮一峰老师的推荐文章后就入坑了fish-shell 😂 今天装了一个软件,要用到alias别名,翻了翻~/.bash_profile,~/.config/fish/config.fish,发现按我之前的习惯,需要将别名配置在这两个文件(后者是fish shell启动时会读取的配置文件,相当于bash shell 的 bash_rc/profile)。为什么不统一放到bash_profile,然后在fish的config文件里source呢?因为fish shell不支持bash语法,而我的bash_profile有一些bash。 今天看了看我的bash_profile,看到了之前配置的autojump,因为fish不支持source该配置,导致换了fish后没用过了(不过貌似fish也有autojump插件?)。总之这算是一个契机吧,把fish换成支持bash语法的zsh,以后配置alias、exports就只配置在bash_profile就好了。 mac安装zsh mac出厂就自带了zsh,zsh --version 看到版本号应该蛮旧的,毕竟没更新过。重新装一个吧 安装zsh: brew install zsh zsh-completions 切换默认shell为zsh: chsh -s /bin/zsh 安装oh my zsh: sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" ps. 如果之前存在~/.zshrc文件,这次安装oh-my-zsh会将原来的文件备份为.zshrc.pre-oh-my-zsh,我将这个备份文件的配置追加到新的.zshrc里了。 主题 主题很重要,影响日常工作的心情和效率呢。 主题列表:https://github.com/ohmyzsh/ohmyzsh/wiki/themes 可以在上面列表挑选个你喜欢的,在 ~/.zshrc 配置ZSH_THEME="主题名"。当然,如果你是一个随心主义者,也可以将其设置为random,每次启动zsh都会随机一个主题。 安装自动建议插件 fish shell有个很好用的功能: 输入命令时,会用灰颜色提示你最近的命令,使用方向键↑可以翻看相同前缀的历史命令。 zsh也有类似的插件 git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions # 编辑 ~/.zshrc,若有其他插件,则括号里面用空格隔开 plugins=(zsh-autosuggestions) 移除不必要的别名 oh-my-zsh添加了很多git的别名,例如git -> g, git fetch -> gf,恰好我有其它命令和这些别名冲突。所以我在bash_profile将这俩别名干掉了 unalias g unalias gf 其他 zsh 默认支持一个叫 magic function 的功能,但这会给我带来困扰,粘贴url时会帮我自动转义,很烦。可以 vim ~/.zshrc , 将 这行的注释去掉:`DISABLE_MAGIC_FUNCTIONS=true 对了,最后还是安利下 autojump , 用的时间越长,越节省时间呢。

2020-04-11 · 1 分钟 · 83 字

Git使用技巧

git clean 之前的文章 git-clean exclude: 本地的.gitignore 有时候我们在本地创建的文件,不想提交到仓库时,会考虑用.gitignore。 但.gitignore文件本身往往是添加到版本控制的。为了不影响其他协作者。git提供了一个只对本地生效的规则文件 在项目的 .git/info/exclude 文件里编辑即可。规则用法与.gitignore一致。 统计两个commit之间的文件行数增改情况 将以下shell保存为diff_git_commit.sh git log $1...$2 --pretty=tformat: --numstat | grep -v 'src/proto_lib/' | grep -v 'test/' | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' - 用法:./diff_git_commit.sh commitId1 commitId2,当然你也可以用 ./diff_git_commit.sh tag1 tag2。 你可能注意到了上面的grep -v。我把不需要统计的文件目录排除了。你可以按需修改以上shell。 文件权限/格式相关(常用于需要与unix协作的win下) 以下命令需要设置为全局时,在 git config 后面加 –global 即可 git config core.filemode false # 忽略文件权限 git config core.autocrlf true # 将所有add到仓库的文本的结束符从crlf替换成lf(unix系统下将true替换成input) git config core.eol lf # 设置行结束符,不过当core.autocrlf设置为true/input时,该配置不生效 git config core.ignorecase false #区分大小写 分支相关 git push origin :branchName # 删除远程分支。其实就是把空分支push上去 git fetch origin --prune # 清除远程没有了,本地却还有的origin分支 Tag git tag -a tag名 -m "tag描述" # 创建tag git push origin tag名 # 推送指定tag到远程 git tag [-n] [--sort=creatordate] # 列出所有tag,并按创建时间排序 git fetch --tags # 从远程拉取所有tag 彻底将已删除的文件从版本库中清理掉 主要使用 git filter-branch ...

2020-03-18 · 1 分钟 · 147 字

qq互联100016错误

对于这个错误我也是很服气的。 用客户端传过来的 access token 换用户信息时报错:{“error”:100016,“error_description”:“access token check failed”} 请求的链接为:https://graph.qq.com/oauth2.0/me?access_token=我的token&unionid=1 官网文档说这是AccessToken过期了,或token不对。但我确信AccessToken是正确的。毕竟前后端的代码没有动过,唯一改变的是appid。 我鬼使神差地把unionid=1去掉后,正常响应了。我立马知道是因为该应用没有关联到开放平台,导致没有unionId,所以报错了。(评论区有同学也遇到这个问题,解决方案是:还要在【QQ互联】里面点击一下申请获取unionid权限,该权限申请后自动通过) 但….报的这个错也太不负责任了。想到这是qq互联,我立马原谅了他。毕竟他还是5年前那个qq互联呀。 ps: 5年前的吐槽 qq互联100010错误

2020-02-06 · 1 分钟 · 15 字

给你的Mac/Linux的rm装一个回收站

作为程序员,在工作中经常用到rm。我在不久前用vscode写代码,在底下的终端里想删掉没用的文件,手抖把未提交到git的代码文件删了。还好代码量不多,否则会崩溃。毕竟重写代码是很痛苦的~ 因此本文标题提上了日程 选择一款安全的删除脚本 Github看到一个脚本满足需求。 github地址,里边有多种安装方式。我选择的是npm全局安装。 npm i -g safe-rm 安装后,safe-rm命令就可以用了~ 将安装好的脚本设置为rm的别名 vim编辑~/.bash_profile(或其他bash启动时会执行的文件)。添加 alias rm='safe-rm' 由于我使用了fish-shell,因此还需要在fish启动时会执行的config文件里添加别名:vim编辑~/.config/fish/config.fish。添加 alias rm='safe-rm' Done 添加完之后别忘了重新打开终端窗口哦(或者source刚刚的配置文件)。至此,rm后文件的被mv到~/.Trash。即使是重名的文件也会在文件尾添加时间后缀,保证文件不被覆盖。

2018-10-09 · 1 分钟 · 19 字

HTTPS原理解析

HTTP是什么 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是互联网上应用最为广泛的一种网络协议。是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。 为了方便通信就必须统一约定好双方的数据协议,如果每个人都搞一套自己的规则,这玩起来就很麻烦了。因此IETF (互联网工程任务组) 推动了HTTP的统一和发展。现在大家用得最多的还是1999年收录于RFC 2616的1.1版本,2015年发布的2.0版本在推广道路上任重道远。 HTTP[S]报文 最直观上的差异,HTTP协议用明文传输报文,HTTPS用密文。 HTTP的缺陷 窃听风险(eavesdropping):明文传输,第三方可以获知通信内容。 篡改风险(tampering):第三方可以修改通信内容。 冒充风险(pretending):第三方可以冒充他人身份参与通信。 HTTPS是什么 超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure) 是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS协议来加解密数据包。 HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性; HTTPS并不是一个单独的协议,而是对工作在一加密连接(TLS/SSL)上的常规HTTP协议的称呼。因此HTTPS被称之为身披SSL外壳的HTTP。 SSL/TLS协议 传输层安全性协议(Transport Layer Security,缩写作 TLS),及其前身安全套接层(Secure Sockets Layer,缩写作 SSL)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障 网景公司(Netscape)在1994年推出首版网页浏览器,网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。后面,IETF将SSL进行标准化,称为TLS。在浏览器、电子邮件、即时通信、VoIP、网络传真等应用程序中,广泛支持这个协议 协议 年份 描述 SSL 1.0 N/A 从未公开过,因为存在严重的安全漏洞 SSL 2.0 1995 因为存在数个严重的安全漏洞而被3.0版本替代 SSL 3.0 1996 2014年10月Google发现该版本的严重漏洞,建议全面禁用SSL版本 TLS 1.0 1999 IETF标准化后的第一个版本。包括可以降级到SSL 3.0的实现,这削弱了连接的安全性 TLS 1.1 2006 - TLS 1.2 2008 删除了对SSL的兼容。目前使用最广泛的版本 TLS 1.3 2018 截至本文撰写,为建议标准的互联网草案 在TCP/IP模型的位置:介于传输层与应用层之间 ...

2018-08-23 · 3 分钟 · 440 字

下载知乎的视频(M3U8)

总结:知乎的视频播放基于M3U8文件,找一种支持通过该类文件下载目标文件的工具即可,例如FFmpeg 某个慵懒的周末上午刷着知乎,一位知友po了自己用鼓(还是啥?)敲击的旅行青蛙音乐的视频,评论区有小伙伴想要该视频的音频文件下载,想着举手之劳,顺便看看知乎的视频播放用的啥技术。 打开开发者工具,刷新网页并播放,观察网络请求并没有media文件的下载,倒是看到很多.ts文件不断下载中。看来是将视频切割为多个片段了,Google后了解到知乎使用的是M3U8文件,再从该文件下载片段。 什么是M3U8?这是一种utf8格式的M3U(MP3 URL的缩写)文件,最先由Fraunhofer协会(研究出MP3算法的那个)设计并用于Winplay3软件。最初只是应用于MP3等音频文件,现在广泛应用于在线流媒体和视频播放。说白了,它就是一个资源文件的播放列表索引文件,该文件记录了目标资源片段的url链接。具体请看维基百科 打开知乎视频,观察网络请求,你会发现请求了一个m3u8的资源。看看它返回的是什么: foam@foamdeMacBook-Pro: ~ » curl "https://vdn.vzuu.com/Act-ss-m3u8-hd/c338e5b09ab2431080a58ed4d1bb6e17/5a996be2-17da-11e8-b60a-0242ac112a05None.m3u8?auth_key=1521964082-0-0-4d282a5ef6e479a492e6182f044384f5&expiration=1521964082&disable_local_cache=0" #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:2 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:2.000000, 5a996be2-17da-11e8-b60a-0242ac112a05None-00001.ts?auth_key=1521964082-0-0-c0110f185ac09713b4d717e1f2ec30ca #EXTINF:2.000000, 5a996be2-17da-11e8-b60a-0242ac112a05None-00002.ts?auth_key=1521964082-0-0-26ad0014261d1e1f94b1273d91e9a1ec #EXTINF:2.000000, 5a996be2-17da-11e8-b60a-0242ac112a05None-00003.ts?auth_key=1521964082-0-0-ed71bc54e68662748af8eb5228525b84 #EXTINF:2.000000, 5a996be2-17da-11e8-b60a-0242ac112a05None-00004.ts?auth_key=1521964082-0-0-7ef99c02438c16e8d0eabc4955cf3f84 # 有点长,省略若干行... ... #EXT-X-ENDLIST 可以看到返回了一个列表,每个片段2秒钟,包含了链接。 这里使用FFmpeg下载M3U8的资源。FFmpeg是一种处理音视频的强大的开源工具(向开源大佬们致敬),强大到令我泪流满面。该工具有win/linux/mac版本,请自行到官网或包管理器下载。 贴出命令: 根据M3U8下载资源文件: ffmpeg -i "https://vdn.vzuu.com/Act-ss-m3u8-hd/c338e5b09ab2431080a58ed4d1bb6e17/5a996be2-17da-11e8-b60a-0242ac112a05None.m3u8?auth_key=1521964082-0-0-4d282a5ef6e479a492e6182f044384f5&expiration=1521964082&disable_local_cache=0" -c copy 1.mp4 将MP4转换为MP3 ffmpeg -i 1.mp4 -f mp3 -vn 1.mp3 感谢科技的美好~

2018-03-25 · 1 分钟 · 46 字