惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

Razeen`s Blog

Let's Encrypt 推出 Gen Y 根证书架构:揭示 Web PKI 的五大未来趋势 通过 Wi-Fi 自动备份你的 iPhone 到 Nas 管理培训感悟:从技术视角看管理之路 UPS 一拖多:保护你的 NAS 和 Linux 服务器 从影音中心到 AI 助手:我的50款 Homelab 服务清单 从SSL证书有效期将缩短到47天聊开去 部署一个自己的 Running Page 谈谈特斯拉 Model Y 用车一年的感受和费用分析 弃用 Disqus 评论,使用自建 Waline 使用 Prometheus 和 Grafana 搭建你的证书监控面板 服务器迁移记:一次磁盘换板引发的Linux分区与挂载的学习 改善信息来源, 利用 RSS 高效获取资讯 (RSShub + Reeder5 + WeWe RSS) 多种 Docker 镜像拉取解决方案与实践 App分享 | AppCleaner - Mac上的卸载神器 Azure OpenAI API 申请和使用 如何开通 OneKey 虚拟信用卡,并充值消费 如何拥有一个可长期在国内使用的国外手机号码 分享开通 ChatGPT Plus 过程 如何开通 Depay 虚拟信用卡,并充值消费 如何开通欧易Web3钱包, 交易入账 如何5分钟内1块钱注册 ChatGPT 科学上网 如何注册美区的 Apple ID (2023年/无需科学上网) NAS折腾记(11): NASTool3.0体验和降级 NAS折腾记(10): Docker版本的NASTool配置 NAS折腾记(9): NASTool与微信交互,微信发送消息远程下载电影【多图】 NAS折腾记(8):群晖安装 NASTool 实现影音半自动化【多图】 内网穿透(2):Tailscale 组网实现内网穿透,操作简单,无成本 内网穿透(1):总结了11中内网穿透的方式,总有一种适合你 NAS折腾记(7):从零开始设置(黑)群晖系统 NAS折腾记(6):黑群晖系统安装好后怎么洗白? NAS折腾记(5):群晖硬盘休眠设置与分析 NAS折腾记(4): 20分钟手把手带你完美安装 DS918+ 黑群晖7.1.1 NAS折腾记(3):NAS 装机 NAS折腾记(2):B360-ITX 双M.2 双2.5G网口 6 SATA主版 开箱 NAS折腾记(1):328元的4盘位Nas机箱开箱 Openwrt + Clash 全局科学上网 Newifi3 刷入 OpenWrt 固件 v21.02 利用 Markdown 画一些流程图、时序图、甘特图等 Homelab(8): 搭建自用 Gitlab 与 Docker 仓库 Nginx Tcp 转发保留客户端真实 IP (PROXY Protocol) Homelab (7):IPSec VPN(基于证书认证)客户端设置 Homelab (6): 基于自签发证书的 IPSec VPN 搭建 Homelab (5): DDNS 动态域名解析 Homelab (4): Linux 服务器基础环境准备 Homelab (3): 整体网络与基础硬件介绍 Go学习笔记(十)老项目迁移 go module 大型灾难记录 Github Actions 初体验之自动化部署 Hexo 博客 记一次 Nginx DNS 缓存导致转发问题 Homelab (2): 电信悦me网关修改桥接模式,路由器拨号 Homelab (1):5分钟上手黑群晖 NAS 终极 Bash 脚本指南 Ubuntu 20.04 LTS 有线网卡驱动安装 折腾 Ubuntu 20.04 LTS 开发环境 Go学习笔记(九) 计时器的生命周期[译] 利用 git hook 规范你的代码与 commit message 规范 git commit message 与自动化版本控制 超详细 vim 配置 (with MacVim) Golang 中的 RESTful API 最佳实践 折腾服务器(开篇) 我的第一台个人服务器 Newifi3 实现低成本家庭级科学上网 Go学习笔记(八) | 使用 os/exec 执行命令 如何用 Go 调用 Windows API Mac OS 自动根据 WI-FI 名字改变网络位置 关于 Docker 清理 MIME Types 速查表 Go学习笔记(七) | 理解OAuth 2.0并实现一个客户端 我又又又把博客迁移了 Go学习笔记(六) | 使用swaggo自动生成Restful API文档 Go学习笔记(五) | 使用代码片段(snippets)提高编码效率 书单 - 2018 IPFS 初体验,利用 IPFS 托管你的静态网站 记一次 PostgreSQL LIKE 索引优化,联合字段 LIKE 查询优化。 Disqus 添加有趣的 Reactions 的功能 TLS 1.3 详解 (RFC 8446解读) gRPC在Go中的使用(三)gRPC实现TLS加密通信与流模式 gRPC在Go中的使用(二)gRPC实现简单通讯 gRPC在Go中的使用(一)Protocol Buffers语法与相关使用 CentOS 安装 tshark 抓包工具 Go学习笔记(四) | win上使用VSCode搭建Go开发环境 日常 Postgres 数据库点滴记录 简单了解 PKCS 规范 美食篇 | DIY戚风蛋糕(烤箱做蛋糕) Go学习笔记(三) | 怎么写Go基准测试(性能测试) TLS1.3正式更新,为Nginx添加TLS1.3的支持 一次诡异的数据库删除 GitHub Pages自定义域名开启HTTPS 证书透明度是什么?它是怎么工作的? Go学习笔记(二) | 我对 recover 的一点误解 搭建证书透明度(certificate-transparency)日志服务之从入门到放弃 修复远程登陆 Centos 时,出现 UTF-8 Warning HTTPS篇之SSL握手过程详解 Go学习笔记(一) | postgres与golang点点滴滴 AWS 命令行界面(aws-cli)从安装到快速上手 数字证书分类及怎么区分各类数字证书 常用 linux 命令小结(一)文件目录操作 云服务器搭建 hexo 博客,git hooks自动更新 SSH 免密登陆, SSH Config 配置 Golang CGO Mac 交叉编译 Windows 使用 goose 让数据库迁移更加轻松
Typora 自动上传图片到七牛云
2021-01-31 · via Razeen`s Blog

用 Markdown 写博客配图片一直是个烦恼我的为问题, 每次上传图片都比较麻烦,或是中断思路,或是最后集中处理耗费时间。今天无意中,发现了 Typora 的图片自动上传功能,配合一段脚本,将插入的图片自动上传七牛,让写文章更爽了。

偏好设置

我们看到在 Typora 的偏好设置中,有将图片插入时执行的动作。 在上传的设置中可以选择几种上传方式,由于前面几种要下其他软件,我就直接选了其他命令的方式。

image-20210130225707678

规则

看了一下规则,很简单。 当你插入图片的时候会执行你的命令。 假如你的命令叫 upload-image.sh , 则会执行:

upload-image.sh "imagepath1" "imagepath2" ... 

而你的命令只需要如下格式返回上传后的链接:

Upload Success:
http://remote-image-1.png
http://remote-image-2.png

qshell

知道了脚本怎么写,我首先想到了,平常用来上传文件到七牛的命令行工具 qshell

GitHub🔗上有详细的说明,你可以下下来自己编译,也可以直接下载编译好的。

关于命令使用,上面也有详细的介绍。 其实,我们这里主要只用到两个命令。

  • 设置账户。

    qshell account [AccessKey] [SecretKey] [Name]
    

    其中,两个 Key 七牛账户中可以添加。 后面的 Name 随便写。

  • 上传

    qshell rput <Bucket> <Key> <LocalFile>
    

    其中,Bucket 就是对象存储空间的名字, key 上传后的路径, LocalFile 本地文件路径。

写脚本

最新的脚本可以看这里

#!/bin/bash

set -e
IFS=$';'

BUCKET="blog"  # 这里换成 你在七牛的空间名称
QSHELL="D:\Users\Razeen\wspace\bin\qshell.exe" # 这里换成 你qshell可执行文件的路径
DOMAIN="https://st.razeen.me" # 这里换成 你在七牛对应的自定义域名
PATH_PREFIX="img" # 这里换成 你想设置的图片路径前缀
ACCESSKEY=xxxxxxxx # 这里设置 你的七牛密钥
SECUREKEY=xxxxxxx 
ACTNAME=self # 可以给这个账号一个别名

$QSHELL account $ACCESSKEY $SECUREKEY $ACTNAME -w

sys=$(uname -s)

i=0

for filepath in $@; do

    i=$((${i}+1))

    date_prefix=$(date +'%Y%m%d%H%M%S')

    filename="${date_prefix}-${filepath##*/}" 

    # windows 路径匹配不一样
    if [[ ${sys} == "MINGW64"* ]]; then
        filename="${date_prefix}-${filepath##*\\}"
    fi                                                                   

    if [ -f "${filepath}" ]; then

         ${QSHELL} rput ${BUCKET} "${PATH_PREFIX}/${filename}" "${filepath}" > /dev/null

        if [ $? -eq 0 ]; then

            if [ ${i} -eq 1 ]; then 
                echo "Upload Success:"
            fi

            echo "${DOMAIN}/${PATH_PREFIX}/${filename}"

        else
            echo "upload ${filepath} failed!"
            exit 1;
        fi
    else 
        echo "${filepath} does not exist"
        exit 1;
    fi

done

设置

  1. 保存上面脚本,修改当中需要的信息,并添加执行权限。

  2. Typora 中设置 这个命令(绝对路径),如

    image-20210131000315109

    Mac/Ubutun上这么设置没问题, 但Windows上可能会出现如下错误。

    image-20210701002428848

    这时我们需要换一个脚本解释器,如换成 Git Bash,如下图,直接在脚本前面加上Git Bash路径。

    image-20210701002924703

  3. 最后使用效果如下:

    image-20210131000625463

相关知识点

  • shell 脚本读取用户输入参数:

    $# 是传给脚本的参数个数
    $0 是脚本本身的名字
    $1是传递给该shell脚本的第一个参数
    $2是传递给该shell脚本的第二个参数
    $@ 是传给脚本的所有参数的列表
    
  • shell脚本中判断上一个命令是否执行成功

    shell中使用符号 $? 来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败。
    
  • shell 从路径中提取文件名和目录名

    提取文件名 ${filepath##*/}
    提取文件后缀 ${filepath##*.} 或 ${filepath#*.}
    提取目录 ${filepath%/*}
    主要原理:
    #:表示从左边算起第一个
    %:表示从右边算起第一个
    ##:表示从左边算起最后一个
    %%:表示从右边算起最后一个
    
    除此之外,basename 和 filename 命令也可以做到。