华奕神尊的博客

实验室服务器初体验

介绍

最近做本科毕设,用上了学校实验室的服务器。不得不说,实验室的配置还是相当豪华的,48 核的 CPU,256G 的内存以及 6 张 2080TI 的显卡,这个配置也让我这种用轻薄本的人幸福满满。Cloudinary
但是使用体验上并没有那么的美好,最大的问题就是分配的用户没有管理员权限,毕竟是很多人共用的服务器,这个权限没有也是理所当然的,不像我之前用自己的服务器都是直接用 root 账户的。
缺少管理员权限就有很多局限性:

  1. 无法安装自己需要的包,Zsh、Neovim、Pyenv、Curl 等。
  2. 无法通过 systemctl 来让程序后台运行,例如 Clash 等。
  3. 无法更改默认 Shell。
  4. ··· ···
    那么应该怎么配置来得到一个好用的环境呢?

VPN

由于目前在家,而连接学校服务器的 IP 是局域网 IP,这就需要用到 VPN 才能连接上,需要下载EasyConnect,这也成了Zotero之后第二个 Intel 程序,但它在可预见的未来是不会更新的,所以只能将就着用了。奇怪的是它和本机的代理程序是可以共存的,不知道它是通过什么实现 VPN 连接的。

下载 EasyConnect
macOS
Ubuntu_x64 Ubuntu_x86 NeoKylin_x64 NeoKylin_x86
macOS 可用 Homebrew 安装

brew install --cask HuaDeity/tap/easyconnect

EasyConnect 的 Cask 由我维护,由于安装时会安装深信服的证书,且该包没有及时更新并签名,无法被官方 Homebrew Cask Taps 接受。
Cloudinary

故只能从我的 Taps 安装。此外,还有一些由我维护的 Cask 在官方 Homebrew Cask Taps 中,可在我的仓库查看,其中包括知名的菜单栏浏览器MenubarX和知网全球学术快报(Apple Silicon 版本)。

命令行配置

Shell

我的 Shell 环境如图:
Cloudinary
有语法高亮,ls 有颜色和图标,有好看实用的 prompt,有提示,有补全。
T. ps:
如图配置使用终端iTerm2,主题Catppuccin,字体MonoLisa+Nerd Font,Shell Prompt(Zsh+Oh My Zsh+Powerlevel10k) 。如需此配置可查看个人dotfiles 仓库

而服务器初始配置是空白的:
Cloudinary 而且如前所述,这里是不能安装 Zsh 或 Fish 的,即使安装了,但不能更改默认终端,通过.bashrc 方式进入 Zsh 或 Fish 会引起兼容性问题。那么语法高亮,补全,提示等等功能都是不可用的。
由于对 Bash 的不太了解,我对配置 Bash 以达到相似的使用体验没有什么经验。查阅资料得知 Bash 的可扩展性较差,得到语法高亮等功能基本上是不可能的。
Tips: Bash 下有类似 Oh My Zsh 的框架Bash-it
近似实现语法高亮等功能的编辑器ble.sh
但其在我的环境下出现问题,原因未知,故仅做介绍。

想要得到良好的命令行体验通过 Shell 实现还是很困难的,不如就换一种思路,既然在远程机器上配置是有局限性的,那么就通过本地强大的终端达到类似功能。

终端

iTerm2

是的,又是这个功能最强大的终端,之前介绍过它引入的GPT 自然语言处理功能,这里介绍他的 Shell 集成功能。
通过 Shell 集成,可以放大 Shell 和终端的功能和协调性,即使是通过 SSH 连接的远程 Shell,也可实现集成。实现功能如下:

  • 印记,历史记录中保存的位置。它们可以轻松导航到以前的 Shell 提示或其他感兴趣的位置。
  • 当前命令运行完成后发出警报。如果您要求,iTerm2 将在长期运行的命令完成后显示模态警报。
  • 查看有关命令的信息。您可以查看过去在提示时输入的 shell 命令的返回状态代码、工作目录、运行时间等。
  • 只需单击即可从远程主机下载文件。您可以右键单击文件名(例如,在 ls 的输出中)来下载它。
  • 拖放文件以使用 scp 上传。按住 Option,然后将文件从“访达”拖放到 iTerm2 中进行上传。
  • 查看命令历史记录。可以在工具带中查看和搜索,也可以在弹出窗口中快速访问。
  • 轻松访问最近和常用的目录。iTerm2 会记住您使用的目录,按“频率”对它们进行排序,并允许您在工具带和弹出窗口中访问它们。
  • 将配置文件分配给主机名、用户名或用户名+主机名组合。当您根据您定义的规则登录和退出时,会话将自动切换配置文件。
  • 确保命令提示符始终从左列开始,即使最后一个命令没有以换行符结束。

安装 Shell 集成
需要在本机和远程主机上安装 Shell 集成。
在 beta 和 nightly 构建中的 SSH 集成可以对受支持的远程主机的 Shell 自动载入集成。由于实验室的 Shell 不支持,需要手动安装。
Cloudinary 安装流程:
Cloudinary

安装好后,就可使用终端提供的提示,历史记录等功能。

Warp

作为 21 世纪的下一代终端,Warp 除了提供了之前提到的终端命令搜索功能,还提供了开箱即用的 SSH 体验。 Warp 在终端层面提供了语法高亮,提示,补全,历史记录,Prompt 等 Zsh 或 Fish 实现的 Shell 功能。Cloudinary 而且由于 Warp 提供的类似文本编辑器的终端体验,速度非常快,对于 SSH 连接后由于网络延迟以及机器卡断,在一般的终端上输入会有明显的延迟,Warp 则似乎是在本地进行的输入,没有任何的延迟。而类似文本编辑器的终端也给对命令行不熟悉的新手更舒适的使用体验。

Tips: 在基于 GPU 加速的终端中,Hyper是 Electron 程序,AlacrittyKittyWezTerm都是通过 OpenGL 实现的(WezTerm 最近的版本加入了 Metal 后端),而 Apple 的系统已经弃用了 OpenGL,改用 Metal。iTerm2 和 Warp 的 GPU 加速则都是通过 Metal 实现的。

网络配置

配置好了可用的命令行,接下来碰到了网络问题。
是的,没想到 GFW 下,服务器也连不上 Github,或者是师兄没告诉我怎么配置。那就只能自己配置了。
服务器和私人设备不同,不需要复杂的规则配置,只需要可以连接上 Github 即可。那么使用自己的协议的相应的客户端程序就可以满足需求。
但由于我使用的协议没有提供 HTTP 代理,所以这里我还是用了 Clash,并且使用了加强的内核,Clash Meta
Tips: 可参考另一篇博客:How to Learn From Google and Github in China Mainland

由于无法使用 systemctl 保持程序后台运行,这里可以使用tmux终端复用,达到类似后台运行的功能。
运行之后,在.bashrc 中写入(port 改为程序中配置的端口号):

export https_proxy=http://127.0.0.1:port
export http_proxy=http://127.0.0.1:port
export all_proxy=socks5://127.0.0.1:port

大部分的命令行程序都会读取这几个变量作为代理,如有特殊情况,如 Git,根据此地址另行配置即可。

包管理

没有管理员权限,自然也不能通过系统的包管理器安装程序。
再尝试了LinuxbrewPyenv等第三方包管理器之后,发现都不可用。

  • Linuxbrew 初始安装需要管理员权限
  • Pyenv 安装 Python 需要安装生成依赖,服务器上未安装最后选择Conda

Conda 不只是可以用来安装数据科学相关的内容,conda-forge 库甚至可以安装 Zsh,Curl,Starship 等常用的工具。
命令行中不需要安装Anaconda,只需要安装MinicondaMiniforge即可。

总结

这篇文章简单介绍了对于没有管理员权限的服务器的命令行的配置,由于我使用命令行较多(Neovim 用户),所以配置一个好用的命令行是使用一台机器很必要的事情。
对于不熟悉命令行的或者无法配置命令行的情况,可以用Visual Studio CodeJetbrains IDE内部的远程连接功能。