基于Flask的简易webtelnet和webssh

2020-02-25 作者:

Chinese version README of the Github repo – flask-remote-terminal.

简而言之,一台具备多用户支持的,仅限使用telnet/ssh,访问远程固定地址的,web终端。

演示截图:


有啥稀罕的

  • 只可访问远程地址,非本机终端
  • 目前仅限telnet(支持十几年前老设备用)和ssh访问,代码中也可增加其他协议,但始终受控
  • 仅限访问固定远端地址(IP/域名),代码config可配,一旦服务运行后不可更改
  • 服务端session存储pid和fd等,用于多用户支持


参考项目


需求如此“扭曲”,何解

通过web终端去管理一台特定的中转机,其多数端口是(在特定时间段内)代理到真正需要管理的目标机。具体需求如下:

  • 同多数web terminal一样,浏览器即开即用,免安装
  • 只允许访问特定地址(中转机),避免被抓肉鸡
  • 只允许使用telnet和ssh进行连接,不可自选其他客户端命令,在此基础上允许用户自行输入用户名和端口号
  • 只用于远程连接,在用户exit退出终端后,也无法回到shell操作提供该服务的server
完整阅读本篇»

基于阿里云API实现简单DDNS

2019-02-28 作者:

This is a post talking about using Aliyun Domain Control API (and python sdk as well) to script a simple, self-own ddns service, with only one assumption – a public ip over WAN port of your router.

 

原始状态

光猫 <—> R7000主路由 <—> 需要出门的母鸡+小鸡们

 

设计思路

  • 办法1:破解光猫,将光猫与R7000桥接。
    • 优势:内网只有一层,简洁明了。
    • 劣势:打N通电话,下N多工具,还要将独立IPTV信道映射或proxy到R7000的某个LAN口。
  • 办法2:硬件不做任何变动,添加两层映射。
    • 优势:实施安全性高。
    • 劣势:理论上,走ddns经双层转发,传输性能受影响。
  • 总结:人老色衰,首选安全方案。

 

网络拓扑

【更新】代码已推至github,欢迎加星。

完整阅读本篇»

微信oAuth错误码10003最速解法

2018-04-06 作者:

服务号code两年没更新,最近花时间做了彻底重构,说白了差不多重新开发

填坑无数,信心上线后,点公号菜单跳页面时,遇到如下问题

redirect_uri域名与后台配置不一致,错误码:10003

OK,梳理一下,我的后台配置成啥了?(more)

完整阅读本篇»

Mysql full-text index query with SqlAlchemy

2017-11-24 作者:

结论:

  1. mysql fulltext index基本可用(试了natural language mode和boolean mode),尤其在表结构比较简单的前提下
  2. sqlalchemy自带的match关键字只能match单列的fulltext索引,多列的我们用如下办法自制 – 仅用于查询的话,完全够用
  3. 最重要的一点:数据量大时,一个query尽量只使用where match against,与其他的where some_column = ‘hello’要分开写(做成subquery)。如果写在一起,极有可能只有fulltext索引生效,而其他列的简单查询所对应的index不生效。

注册自己的Match子句

所有条件一起用于查询(前面1个filter不能触发已有index)

先做普通字段查询,join后再做fulltext检索(subquery和query各自使用自己的index)

参考自:https://stackoverflow.com/questions/14971619/proper-use-of-mysql-full-text-search-with-sqlalchemy

完整阅读本篇»

Python Thread Pool传参只一个怎么破?

2017-06-09 作者:

作为批量化操作的method,map比apply要方便简洁一些,至少不用for循环一堆东西
【注1】apply现已不用,因为实际使用基本等价于单进程操作
【注2】至于map之于map_async,及apply之于apply_async,是另外一个话题,可以参考这里
回到之前的话题,apply传参 – 可以清晰的看到,apply可以随意带args,多少个都没关系

有的同学可能要问 –
Q: 那如果两个(或多个)参数都是变参呢?
A: 开动一下脑筋吧 – 一起打进iterable里可好?
Q: 如果变参B与A不具备同样的iterable特性呢?
A: 擦的咧 – 那还map个毛啊。。。

完整阅读本篇»

微信公号调试遇到Nginx错误499 | Nginx Code 499 on Wechat OAuth debugging

2017-01-25 作者:

最近弄了个公号测试号,尝试一下腾讯OAuth,用的还是习惯的nginx+uwsgi+flask

注意【开放平台】和【公众平台】的OAuth有差别,跳转的auth地址,及scope都是不同的;前者主要用于浏览器app(微信内置浏览器也可兼容),后者跟公众号绑定的更紧密(不关注不能auth)

这货调试蛮坑的 –

  • 首先得有公网IP,这个简单,买个按小时付费的美团云(阿里云)就行,1核1G,不要数据盘,带宽1M;一个小时0.1元多一点,一天也不到3块钱,不需要了随时可删。
  • (带备案)域名一个。这个有点难度,买云主机备案不要钱,但两周时间等的着实有点心焦。如果有现成域名,可以开个二级域名(端口依然要80),nginx转发一下,这样也是ok的。

木有用域名的时候,我尝试直接用云主机ip接测试号,一共有3处配置,都配了IP(而非域名)

  • 接口配置信息
  • JS安全域名
  • OAuth授权回调域名(关键)

但实际在微信浏览器中访问时,页面无法正常展示,这个提示很关键(转换成手机预览模式)

于是在OAuth的过程中,uwsgi经常报如下错误(而且还是在auth成功之后):

500ms的请求不算慢啊,为啥会broken pipe呢?

并且明显uwsgi返回了code 200,请求没啥问题噻?

开始时,丈二和尚摸不着头脑,鉴于uwsgi是nginx的upstream,那就找一下nginx看人家说啥呗

一看不要紧,同一个请求,nginx code是499;google后,表明499是“客户端主动关闭连接”,那么uwsgi送给nginx的200自然木有什么卵用了 – 客户端不要了

而且这一条log是在access.log而非error.log,说明nginx并木有怪罪uwsgi

who to blame right now?

我开始怀疑没有域名导致的转码,找了一个备案后没用过的域名,指向这个ip,不到一分钟就生效了

然后把测试号那三处配置都改成域名,再试。。。搞定了,同一个链接,uwsgi和nginx log都是code 200.

同时网页访问也展示正常了,不需要什么“转换成手机预览模式”(截图就不贴了)。

究其本质,这个nginx code# 499(以及uwsgi的broken pipe),也即客户端主动断开连接,就是ip访问状态下,微信浏览器为了安全防护,拒绝直接渲染前端页面造成的。

完整阅读本篇»