SSH 全称 Secure Shell,是一种加密的网络传输协议,可以在不安全的网络中为网络服务提供安全的传输环境。
几个 ssh 命令的参数
C
压缩数据传输-f
后台登录用户名密码,如果省去该参数 ssh 会一直等待-g
允许打开的端口让远程主机访问-N
不执行shell-T
表示不为该连接分配TTY-p
后接端口本地端口转发,就是将发送到本地端口的请求,转发到目标主机端口。
ssh -L 本地网络地址:本地端口:目标主机地址:目标端口 root@<主机地址>
ssh -L localhost:3000:localhost:80 root@<ip> # 将发送到本地3000端口的请求,转发到远程主机80端口
ssh -L 3000:localhost:80 root@<ip> # 将发送到本地3000端口的请求,转发到远程主机80端口,省略掉本地地址
ssh -p port -C -f -NT -g -L 3000:localhost:80 root@<ip>
远程端口转发,就是将发送到远程端口的请求,转发到目标端口,一般用来将公网主机端口请求转发到局域网内机器端口以实现外网访问。
ssh -R 远程地址:远程端口:目标地址:目标端口 root@<主机地址>
ssh -R localhost:3000:localhost:80 root@<ip> # 将远程主机 80 端口的请求转发到本地3000端口
ssh -p port -C -f -NT -g -R 3000:localhost:80 root@<ip>
动态端口转发,则是绑定一个本地端口,目标地址,目标端口不固定,目标地址和目标端口由发起的请求决定。只有root才能转发特权,支持 Socks 5 本地。
ssh -D 本地地址:本地端口 root@<主机地址>
ssh -D localhost:5000 root@<ip>
ssh -D 5000 root@<ip> # 省略 localhost,监听本地5000端口
ssh -p port -C -f -NT -g -D 8080 root@<ip> # Sock监听本地 8080 端口,任何发给 8080 端口的内容都会被转发到远程主机
nc 是 netcat 的简称,nc 工具是一个 TCP/IP 的瑞士军刀类型的工具,netcat 可以使用 TCP 或者 UDP 协议来进行网络连接的读写诊断,nc 命令可以用于 TCP,UDP,Unix 套接字相关的任何事情,是一个非常强大的网络工具。
端口是 Linux 机器上的应用、服务、进程与网络进行通信的端点。常用的 netstat 或者 nmap 等也能够列出本地机器上的开放端口。但是 nc 可以用来确定远程主机端口是否开放。
sudo apt install netcat
nc -l -p 80 # 开启本机 80 端口 TCP 监听
nc -l -p 80 > /tmp/log
机器上运行该命令,端口 80 会被认为开放,可以用来欺骗扫描机
扫描端口
nc -zv host.example.com 22 # 扫描 22 端口是否开放
nc -zv host.example.com 22 80 443 # 扫描端口
nc -zv host.example.com 20-30 # 扫描一个范围
nc -zv -w 5 host.example.com 22-443 # -w 表示超时等待 5 秒
说明:
-z
设置 nc 只是扫描侦听守护进程,实际不发送任何数据-v
开启 verbose,如果多加 -vv
会输出更多信息上面的例子中,已经统计到了扫描一个端口,多个端口,或者指定端口范围。
nc -l 8080 < index.html
客户端请求
curl localhost:8080
电影电视剧配乐一直都是一门学问,我一直很好奇韩剧或者韩综的配乐,如何能做到用音乐去推进故事,用音乐是暗示结局。但其实本文就是罗列了几个收集音乐的好地方,本不求达到那么专业的水平,只求在日常vlog或者短片中找到合适的BGM。
SoundCloud 是一个在线音乐分享平台,上面有无数的音乐人作品,但是使用的时候请一定遵照版权。
几个账号
这是 icons8 推出的免费音乐计划,只有在使用的地方标注来源即可免费使用网站上的任何音乐素材。
YouTube 是一个视频分享网站,YouTube 自身的版权做得非常健全,如果你使用了盗版的音乐素材极有可能直接被YouTube Content ID 扫描出来而直接屏蔽,所以谨慎使用版权素材,因此 YouTube 也提供了他的免费音乐库,上面也有非常多的选择。
另外作为数一数二的视频分享网站,YouTube 上面也有无数的音乐人,作曲家自己分享了很多作品,你可以在标明涞源的情况使用他们的音乐,这个就要依靠自己的发觉或者自身的喜好来决定收藏了。
Bensound 是一个免费的音乐素材网站,有丰富的免费音乐素材
该网站为收费网站, 199 刀 一年,还是很贵的
最近要搬家,最初的需求就是快速打包搬走,想要找一些比较好用的搬家神器,搬家神器倒是没找到,不过找到了一些日常收纳整理之术。平时如果注重收纳整理,知道断舍离,其实搬家也远没有那么的痛苦。
可能提到搬家很多人会想到小推车,收纳箱等等用于收纳的物品,当然这些都是日常生活中必不可少的。即使不搬家,在家中使用收纳箱收拾平时不穿的鞋子,衣服等不仅能够防潮,也方便了快速分类整理。下面也不多废话,就直接把我整理过程中觉得比较有用的记录下来。
想要打包的时候加快速度,那就一定成都上依赖于平时的收纳,我自己平时本没有那么注意收纳,因此在打包时格外的零碎,各种文件,电器,工具分散在房间的各个地方,抽屉,架子,箱子中哪里都是。这可能是我第一要注意的事情,物品分类收纳是平时就需要养成的习惯。说到分类整理,对于我这样常年在外的人来说,收纳箱就必不可少了,虽然可能也有柜子书桌,但是一遇到搬家可能就要挪位置,还不如直接使用收纳箱来整理。
按照 不常用 - 常用 - 日常用
顺序打包,最后打包日常洗漱用品,杯子、碗筷、枕头、床铺之类
我是这么觉得,如果要出差一周需要打包的东西,比如洗漱用品,换洗衣服,以及必要的电子设备,这些可以放到最后打包,其他剩下的所有东西都可以提前打包好。最后留一个 20 几寸的行李箱装下所有日常装备就行。而其他平时不用的分类整理到收纳箱,或者纸箱中等待运输即可。易碎物品一定要贴上标签,特别注意。
日常用品基本上可以用一个行李箱搞定,剩下的就是平时也会用到的,比如台灯,衣架等等一个礼拜就要用上几次的物品,这类物品可以稍晚一些打包,预留一个比较充裕的纸箱,或者收纳箱,最后在搬家前将这类物品迅速的放到箱中,搬完之后也可以第一时间将这些物品拆出来。
而剩下的不常用的物品,按照物品品类分类打包:
对于我,大部分的电器我都留了原始的包装,其中的防碰撞泡沫可以完美的契合物品,除此之外各种零碎物品我都放到抗压的收纳箱中,衣服被褥则放到了收纳袋,然后装到纸箱中。
我个人使用了 50L 的收纳箱,然后有一下规格的收纳袋, 45 * 70
可以放下一个枕头,或者日常春秋外套, 56 * 80
放一些冬季棉衣、羽绒服,80 * 100
放被子等大件。
整理过程中,该丢的一定要丢掉,学会断舍离,然后平时一定要学会分类整理,把规划制定到平时。所以写到这里也就回答了我最初的问题,有没有搬家神器,有,只不过都在平时。
RabbitMQ 是一个使用 Erlang 编写的消息队列的实现,能够接收并转发消息。
RabbitMQ is open source message broker software (sometimes called message-oriented middleware) that implements the Advanced Message Queuing Protocol (AMQP). The RabbitMQ server is written in the Erlang programming language and is built on the Open Telecom Platform framework for clustering and failover. Client libraries to interface with the broker are available for all major programming languages.
各个平台的安装官网都非常详细: https://www.rabbitmq.com/download.html
各个语言的客户端:https://www.rabbitmq.com/devtools.html
apt install rabbitmq-server
docker pull rabbitmq
docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq --hostname=rabbitmq rabbitmq:latest
rabbitmq 默认的 latest tag 是不带管理页面的如果是要管理页面需要使用 rabbitmq:3-management
docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq --hostname=rabbitmq rabbitmq:3-management
启动之后访问 http://ip:15672 就能够访问管理后台
列出当前 RabbitMQ 中的队列
sudo rabbitmqctl list_queues
列出 exchange
sudo rabbitmqctl list_exchanges
各个客户端的教程官方的教程非常详细可以直接参考。
linux中的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。ifconfig是net-tools
中已被废弃使用的一个命令。iproute2 套件里提供了许多增强功能的命令,ip命令即是其中之一。只需一个ip命令,就能很轻松地执行一些网络管理任务。
给机器设置一个IP地址
sudo ip addr add 192.168.0.193/24 dev wlan0
列出路由表条目
ip route show
显示网络统计数据
ip -s link
在 Flask 中使用 Celery 官方给出了一个非常详细的教程,可是这个教程中有一点没有讲清楚,就是关于引入了 Celery 之后如何在项目中划分模块以及模块之间的相互调用,我们知道 Flask 用于构建比较大的项目时可能会使用到 blueprints,而这个时候项目结构可能就比较复杂了。
而引入 Celery 直接面临的问题是如何初始化 Celery 实例,在创建 Flask app 的同时创建 Celery 实例,这时候就面临一个问题,通常我们都在 Views 中引用 celery 异步任务,不可避免的会导致,需要在 views 中 import celery 相关的 module,而 celery 相关的 module 会引入 Flask app 相关的内容,而 Flask app 初始化会引入 views 相关的内容,就变成了循环调用。
有一个比较简单的解法就是初始化两个 Flask App 实例,一个用来启动,一个用来给 Celery 创造上下文。
不要在 create_app()
中再创建 Celery 实例。比如新建 celery_worker.py
来初始化 celery 实例,而在另外的文件中初始化 Flask()
实例。
项目结构大致如下:
├── README.md
├── app
│ ├── __init__.py
│ ├── config.py
│ ├── forms
│ ├── models
│ ├── tasks
│ │ ├── __init__.py
│ │ └── email.py
│ └── views
│ │ ├── __init__.py
│ │ └── account.py
├── celery_worker.py
├── manage.py
└── wsgi.py
图中
在 app/__init__.py
from celery import Celery
from flask import Flask
from app.config import BaseConfig
celery = Celery(__name__, broker=BaseConfig.CELERY_BROKER_URL)
def create_app():
app = Flask(__name__)
# ....
celery.conf.update(app.config) # 更新 celery 的配置
# ...
return app
在 celery_worker.py
from app import create_app, celery
app = create_app()
app.app_context().push()
这个文件有两个操作,一个为初始化 Flask 实例,也就初始化了 Celery 实例,然后第二个操作是使用 Flask 的 application context,celery 的所有操作都会在这个环境中执行。
然后就可以启动 Celery celery worker -A celery_worker.celery -l INFO
这里便引出了另外一个问题,如何在 Flask 外部使用 SQLAlchemy 中定义好的 model,当我们定义好和数据库相对应的 Object 之后,难免有些时候需要在 Flask 外部使用,比如清洗一些数据,或者单独跑一些数据时,这时没有 Flask Context 环境,那么这个时候需要借助 app_context()
函数:
from my_package import create_app
app = create_app(my_envrionment)
with app.app_context():
# your code here
在 Context 上下文环境中就能够使用定义好的 model 了。另外一种方法是使用 @with_appcontext
装饰器:
from flask.cli import with_appcontext
@click.command(name='db-init-data')
@with_appcontext
def db_init_data():
"""Init db with some data"""
admin = User(fname='John', lname='Smith', email='jsmith@google.com')
db.session.add(admin)
db.session.commit()
k3 的折腾记录
我的固件版本 V21.6.12.66
只要两步,WEB 直刷,就能降级
K3_V21.6.11.58P 下载地址
链接:https://pan.baidu.com/s/1rasSyjq 密码:ksxp
K3_V21.5.37.246 下载地址
链接:https://pan.baidu.com/s/1mjv2jaC 密码:xmrh
使用这个教程 激活 Telnet 端口
然后备份路由器
telnet 192.168.2.1
mount # 查看当前挂载的 U 盘
cd /tmp/share/sda1/
mkdir backup
cd backup
cat /dev/mtdblock0 > mtdblock0.bin # 备份 CFE
cat /dev/mtdblock5 > mtdblock5.bin # 备份设备信息
cat /dev/mtdblock6 > mtdblock6.bin # 备份固件,备份固件时间可能有些长 1min 左右
这个几个分区的作用
对于 K3 官方固件:
mtd0 boot
cfe 引导分区,建议备份,还包含了部分 nvram 参数和 MAC 等信息,不要刷入别人的,也不要随意刷写这个分区。
mtd1 nvram
设置分区,不用备份,保存了路由的所有设置信息,恢复出厂时会格式化然后从 cfe 和当前固件复制默认参数。
mtd2 nvram_back
从名字看像是 nvram 的备份,实际固件没有使用,全部空白,不用备份。
mtd3 res_info
没有使用,全部空白,不用备份。
mtd4 pro_info
只有 6 字节数据,00904C17F234,所有机器都一样,可选备份,就算没备份把这 6 字节复制过去就恢复了。
mtd5 dev_info
176 字节数据,好像是加密的固件的版本一些信息,刷写官方固件版本号发生变化时候这里的数据就变化,可选备份。
mtd6 linux
整个固件分区,平常刷写官方固件或者 LEDE 都是刷到这里,官方提供固件下载,只要 cfe 正常随便刷,不用备份。
mtd7 rootfs
动态的,包含在 linux 分区,mtd6 减去当前固件内核部分,是固件的后半部分,而固件是一个整体,当然不用备份。
mtd8 brcmnand
存储分区,日志文件、自己安装的软件保存再这里,固件版本信息变化时系统会格式化,不用备份,也不要恢复。
这里我使用 abccba94 官改固件,在页面下载固件,现在最新的已经到了 k3_v16d ,解压,得到 k3_v16d.bin 文件,复制到 U 盘,如果 U 盘还连在路由器,可以使用 \192.168.2.1\ 然后远程将文件拷贝到 U 盘中。
然后在登录 telnet 192.168.2.1
cd /tmp/share/sda1/
cat k3_v16d.bin > /dev/mtdblock6 && reboot
将该目录下固件刷入,等待重启之后,做一次恢复出厂设置,长按 reset 键 5 秒。
K3 的固件整理大全
在管理后台软件中心安装 entware 之后,可以使用命令安装很多扩展。
entware 中的包列表:
http://pkg.entware.net/binaries/armv7/Packages.html
安装 ttyd
opkg install ttyd
然后在 webshell 中设置开启网页管理,那么直接访问 http://ip:7681 ,输入用户名和密码就能够在网页中管理路由器。
ttyd 开源在 GitHub,使用 C 语言,websocket 通信。
更多有趣的包可以查看这里
手机移动端 SSH 工具:
IOS:Termius、Prompt 2 Android:JuiceSSH、ConnectBot、Termius
K3 的 SSH 用户名是 admin,密码是网页管理密码。(网页管理密码和 SSH 密码是分开保存的,如果你开机后改过网页密码(比如执行恢复出厂设置相当于改成预置的 admin),ssh 密码不会立即同步,重启之后才会同步网页的管理密码)
我一直用的是 Cinnamon 的桌面环境,使用 icon 主题也比较方便,这里就做个记录。
地址:
安装
sudo add-apt-repository ppa:papirus/papirus
sudo apt-get update
sudo apt-get install papirus-icon-theme
地址
安装
sudo add-apt-repository ppa:noobslab/icons
sudo apt-get update
sudo apt-get install ultra-flat-icons
更多的 ICON 主题可以看
自己的 yourls 已经搭建完毕 ,重要的就是如何高效的用起来了, yourls 自身提供了很不错的快速访问工具,安装完毕之后直接浏览
https://域名/admin/tools.php
可以得到书签栏中的快速访问工具,直接拖拽到浏览器的地址栏就可以快速的将当前的页面地址缩短。这个工具也就不多介绍了,这篇文章主要摸索一下 yourls 的API调用,以及如何在PC,和移动端快速的使用短链接服务。
yourls 提供了丰富的API,使用自身的API可以实现
请求的地址
https://域名/yourls-api.php
通过 GET 或者 POST 请求(GET请求需要URL Encode)
两种方式获得授权,一种是使用 username
/ password
对发送请求,但是这种方式不安全,可能导致用户名密码在传输过程中被截取泄露;另一种方式是使用不需要密码的 token 机制,在 admin/tools.php 页面会产生当前用户的验证 token。
动作 action
参数有很多个选项
shorturl
获取链接的短链接
在使用了值之后,另外两个参数
- `url` 用来缩短的原始链接
- `keyword` 或者 `title` 可选参数,用来自定义短链接
expand
获取短链接的原始长链接
将短链接展开
- `shorturl` 值可以为 `abc` 或者完整的短链接
url-stats
获取短链接的信息
短链接的统计信息
- `shorturl` 值可以为 `abc` 或者完整的短链接
stats
获取链接的信息
获取链接的信息
- `filter` 值可以为 `top`, `bottom`, `rand`, `last`
- `limit` 返回的数量
db-stats
获取全局的链接和点击数
输出格式 format
参数用来指定API输出的格式,有如下值
请求缩短链接
curl -X POST \
https://gtk.pw/yourls-api.php \
-F signature=xxxxxx \
-F action=shorturl \
-F url=https://gtk.pw/readme.html \
-F format=json
返回结果
因为之前已经请求过,所以报了fail,不过结果依然能够从 shorturl
中拿到
{
"status": "fail",
"code": "error:url",
"url": {
"keyword": "OStH3",
"url": "https://gtk.pw/readme.html",
"title": "YOURLS: Your Own URL Shortener",
"date": "2018-05-18 03:27:36",
"ip": "123.123.123.7",
"clicks": "0"
},
"message": "https://gtk.pw/readme.html already exists in database",
"title": "YOURLS: Your Own URL Shortener",
"shorturl": "https://gtk.pw/OStH3",
"statusCode": 200
}
其他几个API同理,返回结果结构稍有差异不过都类似。
iOS 上可以借助 Workflow 快速实现,主要的步骤
然后每一次将链接复制到粘贴板,然后运行该 workflow ,短链接就在 Clipboard 中了。
第二中方法,是直接在浏览器中,在链接前面加上,yourls 的域名,比如
https://blog.einverne.info
加入yourls 的域名是 https://gtk.pw
那么在链接前加上 gtk.pw,yourls 会跳转到 admin 页面并添加该链接
gtk.pw/https://blog.einverne.info
其他平台同理,不过需要登录 admin 略麻烦。