不,在SSH中没有发现任何新的漏洞,我也没有否认SSH作为开发工具链中构建块的可用性。本文将介绍为什么不应该(以及如何避免)将原始SSH会话用于开发工作。
这里有个小故事。我在科技行业工作了很多年,反复遇到一个令人恼火的问题。我会从我的笔记本电脑ssh到一台远程主机,做一大堆工作,最后不管是什么原因都会断开连接。一旦我断开连接,我就会丢失一大堆ssh会话上下文。在重新连接时,我必须重新打开多个终端,将每个终端导航到它们所在的目录,然后重新打开我以前打开的所有文件。
我一直在抱怨这件事,但什么也没做。直到有一天我遇到了致命的问题。我不得不在远程主机上运行几个小时的作业,但我不得不断开笔记本电脑的连接,很快就把它带回家。我简单地研究了一下使用nohup来完成这项工作。但谢天谢地,我向我的领导提到了这个问题,他提到了一种我以前从未听说过的工具。“启动屏幕会话并在那里运行命令。”
我做了一些调查,发现屏幕会话只是一个持久的、可恢复的会话,即使在ssh连接结束后它也会继续运行。它看起来像是一个美化的nohup替代品,只不过它保留了您的整个终端内容,而不仅仅是正在运行的进程。我开始将它用于长时间运行的作业,但我花了更长的时间才意识到,通过使用Screen,我可以完全消除对ssh-disconnect的所有挫败感。即使是像读取日志文件或编码这样简单的事情,我也可以在屏幕会话中完成,以便更容易地从ssh断开连接中恢复。
随着时间的推移,我发现了tmux、tmux-tab、iterm集成等等。很快,我意识到我几乎没有理由使用raw-ssh。通过使用tmux,即使我在10个不同的目录中打开了10个选项卡,运行10个不同的命令,我仍然可以在几秒钟内从wifi断开中恢复过来,而不会丢失任何上下文。为什么这不是我一直以来的默认工作流程!?
显然,如果远程主机没有安装tmux,您仍然需要使用原始ssh会话。除此之外,我使用ssh的唯一原因是作为启动tmux会话的中间步骤。但我很快意识到,即使是这样,也可以实现自动化。
只需将上述内容放入bashrc中,从现在开始,您需要做的就是运行tsh my-remote-host.mycorp.com main,然后您就可以无缝地从您停止的地方重新开始。再也不需要修改ssh或手动调用tmux了。
“函数tsh”:所有这些都是将“tsh”定义为bash函数。也就是说,一个加强版的别名。“ssh”:您值得信赖的ssh工具封装在函数中,因此您再也不需要接触它了。“-X”:启用X11转发,以支持GUI。如果需要,您可以省略此选项。“$1”:函数的第一个参数,它应该是您要连接的主机。“-t”:在伪终端中以交互方式在远程主机上运行以下命令。
“tmux”:运行tmux。如果您喜欢不可读的配置文件,请替换为Screen。“-cc”:使用iterm积分。如果您不使用iterm,或者不喜欢集成,请将其删除。“$2”:函数的第二个参数,应该是会话名称。如果您只希望每台主机有一个会话,则可以使用硬编码名称替换此名称。“Attach-t$2”:使用指定的名称附加到现有的tmux会话。“||tmux-cc new-s$2”:如果连接失败(因为指定的会话名称不存在),则使用该名称启动新会话。
如果您喜欢更冗长但更易读的代码,下面是同一函数的另一个版本:
这就对了。手动处理ssh会话的日子现在结束了,您再也不需要担心会话断开了。