4个版本

0.1.3 2022年10月30日
0.1.2 2022年10月30日
0.1.1 2022年10月30日
0.1.0 2022年10月29日

#645 in 配置

CC0-1.0 OR Apache-2.0

25KB
186

Shell Of A New Machine

soanm 是一个用于轻松配置新UNIX机器的简单工具,对目标机器几乎没有任何先决条件。它只需要 curl

目前它在 MacOS 和 Linux(包括 aarch64 和 x86_64)以及 x86_64 的 OpenBSD 上运行。这些都是我通常使用并且可以轻松构建的系统,但将其移植到新平台就像编译一个新的静态Rust二进制文件并将其添加到GitHub上的发行版一样简单。如果您希望支持新平台,请提交一个问题,我将很高兴帮助将其移植。

基本思想

当您在某些机器上安装新的操作系统时,无论它是服务器、笔记本电脑、台式机还是虚拟机,都需要费劲周折才能达到在机器上感到舒适的状态:您需要安装数十个工具,其中许多都需要配置。您需要设置Tailscale、SSH密钥和API密钥。

如果可以一次性、完全自定义地完成所有这些操作,那岂不是很好?现在您就可以做到了!

您需要两台计算机:一台“赞助者”,它具有为“注册者”提供配置所需资源的任何资源(“注册者”是另一台机器)。例如,如果您希望新机器能够访问GitHub,那么赞助者计算机应该有将SSH密钥添加到GitHub的能力。

为了配置 soanm,您还希望有一个描述配置阶段的目录:它应该有一个名为 enroll 的子目录,其中包含将在注册者上运行的程序,一个名为 sponsor 的子目录,其中包含将在赞助者上运行的程序,以及一个名为 results 的子目录,其中将存储注册者的输出。在 sponsorenroll 目录中必须具有相同数量的程序,并且所有这些都必须设置为可执行。

一旦您创建了此配置目录,就可以通过运行 soanm sponsor [conf_directory] 来开始配置过程。这将打印出您需要在注册者上运行的相应命令(此命令将包含用于安全连接计算机的秘密)。

程序将按文件名排序的顺序执行。对于每一对程序,首先运行sponsor程序,并通过Magic Wormhole发送其输出。然后,将这个输出用作对应enroll程序的输入。接着,将enroll程序的输出发送回赞助商,并保存在results目录中,供后续的sponsor程序使用。

请注意,在赞助商机器上,配置程序的stdin从顶级程序继承,允许用户输入。在赞助商和报名机器上,stderr都会打印到相应的终端。

如何使用

赞助商机器需要一个相对较新的rust版本,以及一个包含sponsor程序子目录、一个enroll程序子目录和一个名为results的空目录的目录。

cargo install soanm
soanm sponsor config_dir

这将打印出一个命令,该命令应在报名者机器上运行。

安全考虑

在假设的情况下,使用这个工具传递秘密应该是相对安全的。

显然,你必须相信这里提供的发布二进制文件不是恶意的。我以此信誉担保,我亲自从该存储库中的源代码构建了这些二进制文件,这些源代码(当然)不包含恶意代码。但如果你不信任我,或者你用于构建这些二进制文件依赖的树,你应该验证发布二进制文件看起来是安全的。这也需要信任GitHub忠实地为已上传的二进制文件提供服务,以及信任没有人未经授权访问我的GitHub账户。出于明显的原因,我努力保护我的GitHub账户,并保证我永远不会将此存储库的控制权交给其他人。

你还需要信任magic-wormhole协议。我们使用默认的magic-wormhole rendezvous服务器(ws://relay.magic-wormhole.io:4000/v1)来建立安全的点对点连接,通过该连接传输文件。我们默认使用128位的密码(16个单词)进行初始 rendezvous,尽管在赞助商命令行上可以配置。我们选择默认使用非常长的密码,因为我们希望将中间人攻击的概率降到极低,而且通常情况是从一个shell复制/粘贴密码到另一个shell。

为什么不直接使用[另一个工具]呢?

有许多工具可以用于完成这项任务的部分工作。其中最重要的是Nix。如果你只使用Linux、MacOS或也许FreeBSD,Nix可以完成你所需的一切:只需编写一个快速脚本,安装nix,获取你的nix配置,并将其实例化到你的配置文件中,然后你可以使用curl -L [myscript] | bash来神奇地设置一切。但如果你使用任何其他平台,例如(比如说)OpenBSD,Nix目前不可行。

其他可能性

  • 你可以编写一个脚本,使用SCP将你的文件和配置脚本发送到远程主机,然后运行它们。这会很好用,但需要你有SSH访问新主机,例如,在新笔记本电脑上通常不是默认情况。
  • 您可以使用Ansible、Puppet或Terraform。但您需要在主机上安装这些工具,当然您还需要学习如何使用这些系统,这可能会很复杂。《soanm》不需要比shell脚本更复杂的东西,并允许您在确保它们在早期阶段正确安装的情况下,用任何您想要的编程语言编写代码。使用这些其他工具的大部分,您可能还需要额外的工具来管理您的机密信息,而使用《soanm》则可以从旧主机安全地将它们传输到新主机。
  • 您可以使用点文件管理器,如《chezmoi》。这些通常不会为您安装包或运行任意代码。

如果您愿意,可以轻松地将《soanm》与这些其他方法结合起来。

完成这类任务可能有成千上万种方法。我没有找到我喜欢的方法,所以我自己编写了一个。也许您也会喜欢。

依赖项

~26–39MB
~735K SLoC