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

推荐订阅源

D
Docker
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
博客园 - 司徒正美
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
量子位
罗磊的独立博客
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
小众软件
小众软件
C
Cybersecurity and Infrastructure Security Agency CISA
Cyberwarzone
Cyberwarzone
大猫的无限游戏
大猫的无限游戏
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园_首页
博客园 - 叶小钗
V
Vulnerabilities – Threatpost
T
The Exploit Database - CXSecurity.com
T
Tailwind CSS Blog
IT之家
IT之家
博客园 - 聂微东
Spread Privacy
Spread Privacy
V2EX - 技术
V2EX - 技术
S
Security Affairs
宝玉的分享
宝玉的分享
V
V2EX
C
Cisco Blogs
博客园 - Franky
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
S
Securelist
J
Java Code Geeks
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
WordPress大学
WordPress大学
W
WeLiveSecurity
T
Threatpost
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志

卡瓦邦噶!

服务器高性能网络调优 | 卡瓦邦噶! 为何写作 | 卡瓦邦噶! 读《金阁寺》 | 卡瓦邦噶! 雨季又来 | 卡瓦邦噶! MTU Probe 引起的初始延迟 | 卡瓦邦噶! 3.5 秒的固定延迟问题 | 卡瓦邦噶! 学习网络的一点经验 | 卡瓦邦噶! ARP 问题诊断 | 卡瓦邦噶! 网络断断续续…… | 卡瓦邦噶! Piccolo P2P 镜像分发 | 卡瓦邦噶! 一起看电影 | 卡瓦邦噶! 《征服C指针》 | 卡瓦邦噶! 我的姥姥 | 卡瓦邦噶! Python的哲学 Python 3.5的新特性 学校不教的计算机课 垃圾回收(GC)的三种基本方式 在编程中体验纯粹的快乐 从《美丽新世界》谈自由 在快钱实习 迷人的嗓音和迷人的故事——《Sleepyhead》 Python 的十个自然语言处理工具 记一个愚蠢的bug 一年炉石传说的游戏体验 《以撒的结合:重生》网页版图鉴 分清 C++的指针、引用和数组 笑话三则 自由比皇帝更伟大——《悲惨世界》笔记 Git 10 周年访谈:Linus 讲述背后故事 用 0x3f3f3f3f 设定最大int值的优点 Joel给计算机系学生的建议 一个词法分析器的简单实现 怎样才算健康的生活方式 MacVim 配置攻略 学习培训课程的视频效果好吗? 语言的控制 可悲的大多数 CSS样式思维导图 2014年终总结 奥巴马成为首位写程序的美国总统 青岛老城区的下水道好在哪里? 做优秀 UI 的七个建议(第二部分) 选择爱情的骑士 Git简明教程 Java集合总览 读 《1984》 java问答:终极父类(六)——等待/唤醒和接口 Java 问答:终极父类(五)——toString() Hyperlapse快速视频背后的技术细节 平庸之恶 Java程序员须知的七个日志管理工具 苏州 逛书摊随想 关于考试作弊 你的工作不仅仅是编程 推荐在线学习Java的英文资源 关注女性命运——《千禧年三部曲》 用好你的幻灯片——《演说之禅》 使用ReentrantLock和Lambda表达式让同步更纯净 新手学编程,从哪里开始? 程序员都是工程师吗? 不要学习代码,要学会思考 Java 问答:终极父类(四)——hashCode() Java 问答:终极父类(三)——finalize()和 getClass() 程序员职业之路的选择 我是一名摄影家 写给何小树的城市指南 为什么一些语言会比别的快? Java的常见误区与细节 跟朋友在一起玩游戏 死神永生——读《三体》 五种类型的程序员 创业圣经——读《黑客与画家》 纪念加西亚·马尔克斯 Junit中处理异常的另一种方式:catch-exception Java8采用Martin Fowler的方法创建内部DSL Linux HotSopt虚拟机GC线程的CPU占用率 J2EE概念介绍 如何成为一名黑客 Java 问答:终极父类(二)——equals()方法 为什么我喜欢Java Java 问答:终极父类(一)——clone()方法 七个改变世界的Java项目 java中默认类型转换的小问题 传统与创新 欢迎来到互联网 莫言和马尔克斯——读《生死疲劳》 位运算的妙用 读《人为什么活着》 写博客教会我的事情 中国特色操作系统 2013年总结 《永不妥协》影评 恨不相逢未嫁时——《廊桥遗梦》影评 如何优雅地使用PPT 给明年依然年轻的我们 天才与柱子 黑客守则和黑客精神 Looking for Freedom——《被解救的姜戈》 简洁之道
介绍 Lobbyboy 项目
laixintao · 2021-10-27 · via 卡瓦邦噶!

上周末写了一个小工具,叫做 Lobbyboy(源代码:https://github.com/laixintao/lobbyboy )简单的来说,就是一个 ssh server,启动之后监听一个端口。你用通用的 ssh 客户端连接上以后,它会为你开一台 VPS,然后帮你打开一个 shell。等你用完 logout 之后它会再帮你销毁 VPS。

很多人会有疑问为啥需要这么个东西,其实这个只是解决一小部分人(指我自己)的需求,它并不是将不可能的事情变成可能,而是将可能、但是有些复杂的事情变得简单。这篇文章就来讲一讲为什么我将它实现成现在的样子,抓手是什么,底层逻辑是什么,形成了怎样的闭环,我的思考在哪里。

它是解决什么问题的?

它是解决运维人士经常需要使用一些服务器执行临时任务,比如编译乱七八糟的东西,跑一个数据清理,跑爬虫等,要经常开服务器,用完之后关掉这种场景;

还有一种场景是需要新的服务器进行验证(称之为验证场景),比如需要高规格的 CPU,需要 GPU,需要公网 IP,需要 IPv6,需要特定版本的 Ubuntu 发行版,甚至 Mac Mini(aws 提供的服务),或者 Windows(Azure提供的服务)等等。因为 Lobbyboy 提供了一种接口“协议”,三句话,我让男人三个接口,可以对接任意的 VPS 提供商,几乎可以做任何事情,构建出来任何的机器;测试完之后,想要拍屁股走人,不想要恢复原状(我是一个 Chaos Engineer!)。

实现一个新的 Provider(即,接入一个新的云厂商)只需要实现 Provider 的三个接口:

  1. 告诉lobbyboy 如何创建虚拟机 new_server
  2. 如何登录虚拟机 ssh_server_command
  3. 以及如何销毁虚拟机 destroy_server

所以任何能够提供 Linux 的地方都可以成为 Provider,比如说 Vagrant,VirtualBox,甚至感觉 Docker 也可以。lobbyboy 会内置一些 Provider,比如说 Vagrant(也作为一个内置的实现参考)。

用户实现的 Provider ,也可以考虑 patch 给 Lobbyboy,或者作为一个独立可安装的 pypi package 存在。

想到的还有一种场景(称之为吃火锅场景),就是你和你的好兄弟在吃火锅,这时候你正在上大学的表弟问你这行 Python 代码的输出结果是啥:”foo” == “bar” == False,虽然你 90% 确定,但是又不敢贸然回复,万一说错了,你在表弟心中“计算机大神”的人设就毁了。所以这时候你想找一台 Linux 跑跑试试。

上述需求能否用虚拟机实现呢?

运维人士需要经常背着电脑到处跑,所以选择笔记本通常会选择最轻薄的,方便 24 小时 OnCall. M1现在很火,但是 M1 上的虚拟机还不是很好用。Virtualbox 不支持 M1,UTM 貌似是支持的,但是这玩意不支持 vagrant。所以对 M1 用户来说,虚拟机就挺麻烦的。

另外值得一提的是,Lobbyboy 是支持 vagrant 的(vagrant provider,可以作为其他 provider 的一个实现参考),如果你在本地开一个 Lobbyboy,每次 ssh 到这个端口的时候,就会自动帮你开一台出来,省去了你 vagrant init; vagrant up; vagrant ssh; vagrant destroy 这些命令。

为什么不写一个命令行工具帮你开启/销毁机器?

有三个原因:

  1. 这样的话用起来还是需要安装,每次用的时候都要执行一堆命令,比较繁琐;
  2. Lobbyboy 有一个功能是,自动在 VPS 即将进入下一个计费周期的时候销毁。比如说 DigitalOcean 是按小时收费的,如果你一台机器用了 10 分钟,然后第 40 分钟的时候又想用,那么你还可以继续用。等到第 55 分钟了,Lobbyboy 发现机器没有在用了(没有 active session),就会给你销毁,这样你就付了一个小时的钱。假如第 59 分钟还有人在用的话,那么就等到第 119 分钟再尝试销毁。我们吃了一碗粉,就付一碗的钱;付了两碗的钱,就吃两碗粉。这种 Feature 必须有一个常驻的 daemon 来实现(crond 也是 d);
  3. cli 无法实现上述的“火锅场景”。而如果作为一个 ssh server 的话,无论你用 ipad,iPhone,Chromebook 等等等等,只要你有一个 ssh 客户端,你就可以用。

其实 Lobbyboy 还支持不同的 ssh key 策略,比如每次创建都加上你的 key,或者每次创建都自动生成一个新的 key(毕竟,你登录的是 Lobbyboy,Lobbyboy 登录新的 VPS,所以你的 key 其实不需要在 VPS 上面)。

为什么不一直使用一台 VPS?

是否可以 ssh 到一台你已经有的 VPS 上去做事情呢?无法满足“验证场景”。比如做一些具有破坏性的实验而不影响其他的服务。当然你也可以说,可以开一台备用的 VPS 一直放在那里,但其实也有一些不方便:1)费钱。2)如果做完一些事情不想清理,那么还是要再重新开一台。那又要用到 Lobbyboy 了。

为什么不使用 Homelab

有人在家里搭了一些服务器,是否可以直接使用 Homelab 完成上述需求呢?也是一样的问题。不过抛开电费和维护成本到底会不会比 VPS 更便宜不说, Homelab 可能可以实现每次帮你开新的虚拟机。不过这样 Homelab 就成了 Lobbyboy 的一个 Provider(所有能提供 Linux 的地方都可以成为 Provider)。所以要解决的问题也不是一样的。

可能上述方案都可以满足大部分人,即并不需要一个这样的反向代理。但是如果你有和我一样的使用习惯的话,那么可以试试 Lobbyboy。

为什么不直接用 openssh 的 server?

其实 openssh + 一个脚本几乎可以实现相同的功能。openssh 有一个功能,就是每次连接上就自动给你执行 /etc/sshrc 脚本。这样如果不从头实现一个 ssh server,只写一个 ssh 连接之后的脚本,也是可以的。但是我想了想,缺点有以下几点:

  1. 配置复杂,毕竟机器本身还有一个 ssh server,你要保证有另外一个端口能登录机器,而不是永远执行脚本,两个 sshd 进程要分别配置;
  2. 安装麻烦,要安装脚本,配置脚本。如果要实现机器回收的功能,还要去配置 crontab;
  3. Lobbyboy 因为只有一个 server 进程,所以它知道当前有哪些 active 的 session(全局变量),如果用 sshd 的话就要想别的办法查询活跃的 session,不同进程之间的交互也要通过 IPC 来解决;

但是 Lobbyboy 这种实现方式也有一些缺点:

  1. 多写很多代码,要处理 ssh 协议的部分,好在 paramiko 都已经做好了大部分。
  2. 有些功能是需要询问用户的,比如创建什么样的机器,去哪一个 provider 创建等等。因为这时候是在使用 ssh 协议简单地通讯,还没有 TTY,所以很多字符输入处理不好,比如你输入 1 再输入删除,并不会删除1,而是会得到 1\x7f

就写到这里吧,有关这个项目还有很多有意思的想法。如果你有什么好想法,欢迎在 issue 里面和我讨论。如果想试一下的话,可以按照 readme 来安装启动,只需要一个配置文件就可以启动了。项目就写了一个周末,如果启动不了或者遇到 bug 可以和我反馈~