0

    如何让计算机工作环境更便捷?几行简单的命令即可

    2023.07.08 | admin | 123次围观

    作为长期从事数据科学相关工作的人,作者很喜欢便捷的工作环境,并为此探索出来一些小技巧。通过这些技巧,可以将日常一些重复性或者枯燥的简单工作变得「自动化」,使计算机的工作环境更加友好。

    过去几年里,我一直从事数据科学/研究项目,本科就做了一些与这个行业相关的工作,现在是研究生在读,也在做这方面的研究。作为一个喜欢便捷环境的人,我总是喜欢改进我的工作方式,将日常的枯燥过程变得「自动化」。在这篇文章中,我将描述如何使环境更便于使用。

    我使用的设置包含以下组件:

    由于我研究的项目计算量巨大,笔记本电脑无法负担。因此,我需要这些机器辅助我。出于安全原因,远程服务器无法直接访问,这意味着它们只能由网关机器访问。

    连接服务器的基本方法是首先将 ssh 连接到网关,然后将 ssh 连接到服务器,每次连接时都需要输入用户名和密码。输入一遍又一遍是相当麻烦的。现在我将介绍如何使用单个命令轻松连接到两个服务器。

    充分利用 SSH

    关于 SSH

    SSH(Secure Shell)是一种安全协议,允许用户控制他们连接的服务器。使用 ssh 连接到远程服务器的常用方法是使用以下命令:ssh user@host,然后获得一个密码提示符。在这篇文章中,我不会详细介绍 ssh 的工作原理,只是利用 ssh 基本的使用知识。

    无需密码即可连接

    首先创建一个认证密钥,并将公共密钥传输到我们想连接的服务器。我们从设置第一个连接开始——从笔记本电脑到网关。

    我们将使用一个名为 ssh-copy 的小软件。它为我们完成所有工作,我们需要做的就是在终端中键入以下命令:

    ssh-keygen -t rsa  # create an SSH key, if needed.
    ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

    ssh-copy-id 命令将 SSH 密钥复制到服务器,如果需要,创建相应的 ssh 文件夹,最后将公钥作为授权密钥添加到服务器的.ssh / authorized_keys 文件中。

    如果由于某种原因这不起作用,只需复制粘贴以下命令,这基本就是 ssh-copy 的作用:

    打开终端并运行以下步骤:

    OK!从现在开始,你无需密码即可轻松访问服务器。

    ssh user@host

    要从网关连接服务器,遵循相同的步骤(如果尚未配置)。

    方便的 SSH

    现在要做的是进阶版。与每次 ssh 都使用完整主机名+用户名不同,我们可以使它更方便——无论是网关或代理机器。

    在本地计算机的~/.ssh/config 文件下插入以下内容:

    Host gate
     HostName [gateway.name]
        User [user]

    Host work1
     HostName [machine.name]
     user [user]
     ProxyCommand ssh gate nc %h %p

    还有一个有用的配置参数名为「IdentityFile」,它在处理多个公钥/私钥对时非常有用。假设你除了个人账户外,有一个 github 的工作帐户。那你就需要另一个公钥-私钥对,但你还是需要一个方便的接口。以下是在配置文件中进行设置的示例:

    Host company-github
        User git
        HostName company.github.com
        IdentityFile ~/.ssh/github.comp.key

    每个 ssh 连接将使用匹配的密钥进行连接。

    为了使每个服务器轻松连接,我们可以以类似的方式添加所有远程服务器。

    现在,只需要简单的命令 ssh gate 或 ssh work1,就可以直接连接到网关或 work1 服务器,无需任何密码或其它连接。

    隧道(Tunneling)

    现在我们可以方便地访问远程服务器,然后可以使用隧道来实现对计算机中服务器资源的无缝访问。这样,我们可以在远程机器(具有大量内存)上运行 Jupyter notebook,并在浏览器上与它进行交互。它可以实现如下功能:

    例如,如果我们想在端口 9100 上打开服务器 work1 上的 notebook,可以使用以下命令打开到端口 9200 上的计算机的隧道:

    *ssh* *-N* *-f* *-L* *localhost*:9200:localhost:9100 *work1*

    有趣的隧道

    现在你已经了解如何设置隧道,你可以一直使用这个技巧(至少我一直这样做)。现在以 Jupyter notebook 和 Tensorboard 为例做一个演示。Tensorboard 服务器不会消耗很多资源,但 notebooks 有时会。由于不同的项目使用的机器不同(为平衡负载),因此会使用不同的隧道,所以我有时不记得哪个端口用于什么应用,更不用说在哪个服务器上了。

    最终,我们转向自己的机器,唯一控制的变量是端口号,而这些数字很快会被遗忘。我最近找到了一部分解决方案。我没有在 localhost:xxxx 上打开应用程序,而是生成了新的域名,这些域名只转发到 localhost 主机。这虽然没有解决端口问题,但现在每个应用程序都有自己的名称,没有混淆,在使用一两次后,现代浏览器就会记住端口打开本地连接的命令,所以你只需记住你为每个程序起的名称即可。

    要进行域转发,请执行以下操作:

    现在你可以在 tensorboard:8100 上找到 tensorboard 应用。

    但端口问题仍然没有解决打开本地连接的命令,欢迎提出建议。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论