sm 图床是一个免费图床,在编写 md 文件的过程中,可能需要插入图片,目前 sm 图床支持网页直接上传图片,通过提供的接口,可以使用 curl 在shell上传。
编辑文件
将文章末尾的的内容粘贴到一个文本文件中,然后授予执行权限即可使用
# 编辑一个sh文件
vim smpost.sh
# 将脚本内容粘贴到这个文件中
# 授予这个脚本可执行权限
chmod +x smpost.sh
使用方法:
./smpost.sh xxx.jpg xxx.png
也可以将这个脚本放到 /usr/bin/
目录,这样可以全局执行
如果想要管理图片,可以到 sm 图床上,申请一个账号,然后将 token 粘贴到指定位置。这样上传的图片全都位于这个账号下
进阶
默认情况下,脚本文件输出的url信息不够直观。所以可以安装一个 jq
软件,格式化输入信息。
sudo apt-get install jq
如果是 CentOS 系统则换用 yum
安装 jq
即可
效果图:
脚本文件内容
将这里的内容粘贴到文件中即可
#!/usr/bin/env bash
base_url=https://sm.ms/api/v2
post_path=upload
token=
##################################
post_img_path="$base_url/$post_path"
function postimg(){
if [ "$token"x == ""x ]; then
curl $post_img_path -F "smfile=@$upload_file" -s
else
curl $post_img_path -H "Authorization: $token" \
-F "smfile=@$upload_file" -s
fi
}
function echoUrl(){
if [ "$json_v"x == ""x ]; then
return
fi
imageUrl=`echo "$json_v" |jq -r '.images'`
if [ "$imageUrl"x == "null"x -o "$imageUrl"x == ""x ]; then
imageUrl=`echo "$json_v" |jq -r '.data|.url'`
fi
if [ "$imageUrl"x != "null"x -a "$imageUrl"x != ""x ]; then
echo "[$upload_file] remote url: [$imageUrl]"
else
echo "post image:[$upload_file] error info: "
echo "$json_v"
fi
}
for arg in "$@"; do
upload_file=$arg
if [ ! -f "$upload_file" ]; then
continue
fi
json_v=`postimg`
# 使用 jq 格式化输出 url
# 如果未安装 jq 则直接输出整个信息
which "jq" >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
echo "$json_v"
else
echoUrl
fi
done
带备份功能的图床上传脚本
这一章节的脚本文件内容带了一个备份图片到本地某个目录的功能,如果不想使用备份功能,可以使用上面的内容,或者
backup_dir
保持为空
之所以增加一个备份图片到目录的功能,是为了防止某一台 sm.ms 图床突然倒闭,导致图片无法访问(并不是说图床就一定会倒闭,只是防范于未然)
如果不想使用sm图床了,那么只要在 md 文件中修改一下图片域名并部署自己的图床即可
#!/usr/bin/env bash
base_url=https://sm.ms/api/v2
post_path=upload
token=
# 图片本地备份路径,请在后面增加备份目录
backup_dir=
SM_HOSTS="i.loli.net test.sh"
##################################
function postimg(){
post_img_path="$base_url/$post_path"
if [ "$token"x == ""x ]; then
curl --connect-timeout 10 -m 20 -s \
$post_img_path -F "smfile=@$upload_file"
else
curl --connect-timeout 10 -m 20 -s \
$post_img_path -F "smfile=@$upload_file" \
-H "Authorization: $token"
fi
}
function getImgUrl(){
imageUrl=`echo "$json_v" |jq -r '.images'`
if [ "$imageUrl"x == "null"x -o "$imageUrl"x == ""x ]; then
imageUrl=`echo "$json_v" |jq -r '.data|.url'`
fi
echo "$imageUrl"
}
function echoUrl(){
if [ "$json_v"x == ""x ]; then
return
fi
imageUrl=`getImgUrl`
if [ "$imageUrl"x != "null"x -a "$imageUrl"x != ""x ]; then
echo "[$upload_file] remote url: [$imageUrl]"
else
echo "post image:[$upload_file] error info: "
echo "$json_v"
fi
}
function inSmHost(){
for arg in $SM_HOSTS; do
if [ "$arg"x == "$checkHost"x ]; then
echo "1"
return
fi
done; echo "0"
}
function mkSmBackDirs() {
if [ "$#"x == "0"x ]; then
return
fi
isPath=false
curBackDir="$backup_dir"
maxCount=$#
curCount=0
for arg in "$@"; do
((curCount++))
if [ "$isPath"x == "false"x ]; then
checkHost="$arg"
if [ `inSmHost`x == "1"x ]; then
isPath=true
fi
continue
fi
if [ "$curCount"x == "$maxCount"x ]; then
if [ "$curBackDir"x == "$backup_dir"x ]; then
echo "backup file: [$upload_file] faild, cannot get path"
fi
curBackupFile="${curBackDir}/${arg}"
if [ -f "$curBackupFile" ]; then return; fi
if [ ! -f "$upload_file" ]; then
echo "backup file: [$upload_file] faild, file not exists"
return
fi
cp -f "$upload_file" "$curBackupFile"
if [ ! $? -eq 0 ]; then
echo "backup file: [$upload_file] faild, cp faild"
else
echo "backup file: [$upload_file] success"
fi
else
curBackDir="${curBackDir}/${arg}"
if [ ! -d "$curBackDir" ]; then mkdir "$curBackDir"; fi
if [ ! $? -eq 0 ]; then
echo "backup file: [$upload_file] faild, mkdir faild"
return
fi
fi
done
}
function backUpFile(){
if [ "$backup_dir"x == ""x ]; then
return
fi
if [ ! -d "$backup_dir" ]; then
echo "backup file: [$upload_file] faild, backup dir not exists"
return
fi
if [ ! -w "$backup_dir" ]; then
echo "backup file: [$upload_file] faild, dir can not write"
return
fi
imageUrl=`getImgUrl`
if [ "$imageUrl"x == "null"x -o "$imageUrl"x == ""x ]; then
echo "backup file: [$upload_file] faild, image url is null"
return
fi
imageUParam=`echo $imageUrl |sed 's/\// /g'`
mkSmBackDirs $imageUParam
}
for arg in "$@"; do
upload_file=$arg
if [ ! -f "$upload_file" -o ! -r "$upload_file" ]; then
continue
fi
json_v=`postimg`
# 使用 jq 格式化输出 url
# 如果未安装 jq 则直接输出整个信息
which "jq" >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
echo "$json_v"
else
echoUrl
# 必须使用 jq 格式化获取 url后才能成功备份
backUpFile
fi
done