当前位置: 首页 > news >正文

远程机器操作--学习系列004

远程机器操作

生物信息学中的大多数数据处理任务所需的计算能力都超出了普通工作站的承载范围,这意味着我们必须借助大型服务器或计算集群。对于某些生物信息学项目,你可能主要通过网络连接与远程机器交互。不足为奇的是,远程机器操作对新手而言颇具挑战,甚至会降低资深生物信息学者的工作效率。本章将学习如何让远程机器操作变得轻松自如,从而将时间和精力集中在项目本身。

Xshell及Xftp v8.0安装与使用-生信工具050_xftp8产品密钥-CSDN博客

aspera安装与使用(NCBI上传下载工具)-生物信息学工具31_ncbi的aspera续传-CSDN博客

服务器遭遇挖矿病毒syst3md及其伪装者rcu-sched:原因、症状与解决方案-CSDN博客

用 SSH 连接远程机器

通过网络连接另一台机器的方式有很多,但最常用的无疑是安全外壳协议(SSH)。我们选择 SSH 是因为它具有加密功能(可安全传输密码、编辑私密文件等),且所有 Unix 系统都预装了 SSH。服务器、SSH 及用户账户的配置由你或系统管理员决定,本章不涉及这些系统管理主题。本节内容将帮助你解答系统管理员可能会问的常见 SSH 问题(例如 “你有 SSH 公钥吗?”),同时掌握作为生物信息学者连接远程机器所需的所有基础知识。

要初始化与主机(此处为 biocluster.myuniversity.edu)的 SSH 连接,使用ssh命令:

$ ssh biocluster.myuniversity.edu
Password:
Last login: Sun Aug 11 11:57:59 2013 from fisher.myisp.com
wsobchak@biocluster.myuniversity.edu$

通过 SSH 连接远程主机时,系统会提示你输入远程用户账户的密码。输入密码登录后,你将获得远程主机的外壳提示符,从而可以像在本地一样在远程主机上执行命令。

SSH 也支持 IP 地址 —— 例如,你可以用ssh 192.169.237.42连接机器。如果服务器使用非默认端口(默认端口为 22),或远程机器上的用户名与本地用户名不同,连接时需要指定这些细节:

$ ssh -p 50453 cdarwin@biocluster.myuniversity.edu

这里,我们用-p标志指定端口,并用user@domain格式指定用户名。如果无法连接主机,使用ssh -v-v表示 verbose,详细模式)有助于排查问题。可以用-vv-vvv提高详细程度,更多细节参见man ssh

存储常用 SSH 主机

生物信息学者经常需要通过 SSH 登录服务器,输入 IP 地址或长域名会变得十分繁琐,记住并输入远程服务器端口或远程用户名等附加信息也很麻烦。SSH 的开发者提供了一个巧妙的解决方案:SSH 配置文件。SSH 配置文件存储你经常连接的主机信息,创建简单,且文件中存储的主机不仅适用于ssh,还适用于第 6 章将学习的scprsync

创建配置文件只需编辑~/.ssh/config。每个条目格式如下:

Host bio_servHostName 192.168.237.42User cdarwinPort 50453

只有当远程主机的端口和用户名与默认值不同时,才需要指定PortUser。保存文件后,你可以用别名ssh bio_serv登录 192.168.236.42,而无需输入ssh -p 50453 cdarwin@192.169.237.42

如果在多个终端标签中操作多个远程机器连接,有时需要确认自己是否在预期的主机上工作。可通过hostname命令查看主机名:

$ hostname
biocluster.myuniversity.edu

同样,如果你在服务器上有多个账户(例如,用于分析的用户账户和权限更高的系统管理账户),查看当前使用的账户会很有帮助。whoami命令返回用户名:

$ whoami
cdarwin

这一点在偶尔登录具有更高权限的管理员账户时尤为重要 —— 在管理员账户上操作出错的风险高得多,因此你应始终清楚自己当前的账户(并尽可能缩短使用时间)。

用 SSH 密钥快速认证

SSH 要求输入远程机器上账户的密码,但每次登录都输入密码不仅繁琐,还可能不安全(例如,键盘输入可能被监控)。更安全、更简便的替代方案是使用SSH 公钥。公钥加密是一项有趣的技术,但其细节超出本书范围。要用 SSH 密钥实现无密码登录远程机器,首先需要生成公钥 / 私钥对,通过ssh-keygen命令完成。务必注意区分公钥和私钥:公钥可以分发给其他服务器,而私钥必须安全保管,绝不能共享。

ssh-keygen生成 SSH 密钥对:

$ ssh-keygen -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/username/.ssh/id_rsa.
Your public key has been saved in /Users/username/.ssh/id_rsa.pub.
The key fingerprint is:
e1:1e:3d:01:e1:a3:ed:2b:6b:fe:c1:8e:73:7f:1f:f0
The key's randomart image is:
+--[ RSA 2048]----+
|.o... ...         |
|   .   o          |
|     . *          |
|      o +         |
|      S .         |
|     o   E        |
|    + .           |
|oo+..   . .       |
|+=oo... o.        |
+-----------------+

这会在~/.ssh/id_rsa创建私钥,在~/.ssh/id_rsa.pub创建公钥。ssh-keygen允许使用空密码,但通常建议设置真实密码。ssh-keygen生成的随机图形是一种验证密钥的方式(好奇的话可在man ssh中查看更多细节)。

要使用 SSH 密钥实现无密码认证,首先通过 SSH 登录远程主机(用密码),切换到~/.ssh目录,将本地公钥文件(id_rsa.pub,注意不是私钥!)的内容追加到远程主机的~/.ssh/authorized_keys中(~在远程系统中可能扩展为/home/username/Users/username,取决于操作系统)。你可以从本地复制公钥内容,粘贴到远程的~/.ssh/authorized_keys文件中。有些系统提供ssh-copy-id命令,可自动完成此操作。

再次强调,务必使用公钥而非私钥。如果私钥意外泄露,会危及所有已配置密钥认证的机器的安全。~/.ssh/id_rsa私钥应仅对创建者有读写权限,且需保持这种严格的权限设置。

将公钥添加到远程主机后,尝试登录几次,你会发现仍需输入 SSH 密钥的密码。如果你疑惑这如何节省时间,还有最后一个技巧:ssh-agentssh-agent程序在本地机器后台运行,管理你的 SSH 密钥,让你无需每次都输入密钥密码 —— 这正是我们频繁连接服务器时所需要的。Unix 系统通常已运行ssh-agent,如果没有,可用eval ssh-agent启动。然后,用ssh-add告知ssh-agent我们的密钥:

$ ssh-add
Enter passphrase for /Users/username/.ssh/id_rsa:
Identity added: /Users/username/.ssh/id_rsa

现在,后台的ssh-agent进程会管理密钥,连接远程机器时无需再输入密码。我曾计算过,自己每天约连接不同机器 16 次,平均输入密码需 2 秒(包括输入错误的情况)。假设周末不工作,一年仅花在 SSH 连接上的时间就约为 8320 秒(2.3 小时)。10 年下来,这几乎是一整天的时间。学习这些技巧可能只需一小时,但从职业生涯来看,确实能节省大量时间。

用 nohup 和 tmux 维持长时间运行的任务

第 3 章简要提到,关闭终端窗口时,进程(无论在前台还是后台运行)都会被终止。断开服务器连接或网络暂时中断时,进程也会终止。这种行为是故意设计的 —— 程序会收到挂起信号(技术上称为 SIGHUP),几乎所有应用都会立即退出。由于日常生物信息学工作中我们经常使用远程机器,需要一种方法防止挂起信号终止长时间运行的应用。在程序运行时保持本地终端与远程机器的连接很不可靠 —— 即使最稳定的网络也可能出现短暂中断。我们将介绍两种更优的解决方案:nohup和 Tmux。如果使用集群,有更好的方法处理挂起(例如,向集群软件提交批处理任务),但这取决于具体的集群配置,此时应咨询系统管理员。

nohup

nohup是一个简单的命令,用于执行命令并捕获终端发送的挂起信号。由于nohup命令捕获并忽略这些挂起信号,你运行的程序不会被中断。在命令前添加nohup即可使用:

$ nohup program1 > output.txt &
[1] 10900

像平常一样带上所有选项和参数运行命令,添加nohup后,即使终端关闭或远程连接断开,程序也不会被中断。此外,最好像第 3 章那样重定向标准输出和标准错误,以便日后查看输出。

nohup返回进程 ID(PID),如需监控或终止该进程,可通过 PID 操作(参见第 51 页的 “终止进程”)。由于通过nohup运行的进程无法直接访问,终止它的唯一方式是通过进程 ID。

通过 Tmux 操作远程机器

nohup的替代方案是使用终端多路复用器。除了解决挂起问题,终端多路复用器还能显著提高远程连接时的工作效率。我们将使用名为 Tmux 的终端多路复用器,另一个流行的替代工具是 GNU Screen。Tmux 和 Screen 功能相似,但 Tmux 开发更活跃,还有一些额外的实用功能。

Tmux(及一般终端多路复用器)允许创建包含多个窗口的会话,每个窗口可运行独立进程。Tmux 的会话是持久的,意味着通过重新连接会话,所有窗口及其进程都能轻松恢复。

在远程机器上运行 Tmux 时,你可以维持一个持久会话,即使连接断开或关闭终端窗口(甚至退出终端程序),会话也不会丢失。只需通过 SSH 重新登录远程主机,重新连接 Tmux 会话,所有窗口都保持原样,进程继续运行。

安装和配置 Tmux

Tmux 可通过大多数包管理器安装。在 OS X 上,可通过 Homebrew 安装;在 Ubuntu 上,可通过apt-get安装。安装后,强烈建议到 GitHub 本章目录下载.tmux.conf文件,保存到你的主目录。与外壳从~/.profile~/.bashrc加载配置类似,Tmux 从~/.tmux.conf加载配置。.tmux.conf中的基本设置通过底部的实用状态栏和修改部分快捷键(改为大多数 Tmux 用户偏好的设置),让学习 Tmux 变得更容易。

创建、断开和重新连接 Tmux 会话

Tmux 允许有多个会话,每个会话可包含多个窗口。每个 Tmux 会话都是独立的环境。通常,我为每个不同的项目使用一个会话 —— 例如,玉米 SNP calling 一个会话,开发新工具一个会话,编写 R 代码分析果蝇基因表达数据一个会话。每个会话中,我可能打开多个窗口。例如,玉米 SNP calling 项目中,可能有三个窗口:一个用于与外壳交互,一个在文本编辑器中打开项目笔记,另一个打开 Unix 手册页。注意,这些窗口都在 Tmux 内;终端程序的标签和窗口概念与 Tmux 完全不同。与 Tmux 不同,终端无法维持持久会话。

创建新的 Tmux 会话。为简化示例,我们在本地机器上操作。但管理远程主机的会话时,需要在远程主机上启动 Tmux(这常让新手困惑)。在远程主机上运行 Tmux 没有区别,只需通过 SSH 登录主机后启动 Tmux。假设我们要创建一个对应之前玉米 SNP calling 示例的 Tmux 会话:

$ tmux new-session -s maize-snps

Tmux 使用子命令,上述new-session子命令用于创建新会话。-s选项为会话命名,方便日后识别。如果正确将.tmux.conf放在主目录,Tmux 会话应如图 4-1 所示。

Tmux 看起来与普通外壳提示符类似,只是底部多了一个状态栏(稍后详细介绍)。Tmux 打开时,通过快捷键与其交互。所有快捷键都先按Control+a,松开后再按特定键(我们在.tmux.conf中修改了默认的Control+bControl+a,以遵循大多数 Tmux 用户的偏好设置)。

Tmux(及一般终端多路复用器)最实用的功能是断开并重新连接会话而不丢失工作内容。看看 Tmux 中如何操作:首先在空白外壳中输入一些内容(方便日后识别),例如echo "hello, tmux"。要断开会话,按Control+a,然后按d(detach,断开)。操作后,Tmux 会关闭,你将回到常规外壳提示符。

断开后,通过tmux list-sessions子命令可以看到 Tmux 仍保持会话活跃:

$ tmux list-sessions
maize-snps: 1 windows (created Mon Feb 10 00:06:00 2014) [180x41]

现在重新连接会话。用attach-session子命令重新连接,简写attach也可:

$ tmux attach

由于只运行了一个会话(maize-snps),无需指定会话名称。如果有多个会话运行,list-sessions会列出所有会话名称,可通过-t <session-name>重新连接特定会话。只有一个 Tmux 会话时,tmux attach等同于tmux attach-session -t maize-snps

通过 Tmux 管理远程会话与本地管理相同,唯一区别是需要先通过 SSH 连接远程主机,再在远程主机上创建会话。关闭 SSH 连接(无论有意还是网络中断导致的意外)会使 Tmux 断开所有活跃会话。

操作 Tmux 窗口

每个 Tmux 会话还可包含多个窗口,这在操作远程机器时特别方便。借助 Tmux 窗口,一个 SSH 连接可支持远程主机上不同窗口中的多项操作。Tmux 还允许在一个窗口中创建多个面板,拆分窗口,但为节省篇幅,这部分功能请读者自行学习。可参考 Tmux 手册页(例如man tmux)或网上众多优秀的 Tmux 教程。

与其他 Tmux 快捷键类似,创建和切换窗口需按Control+a加其他键。创建窗口用Control+a c,切换到下一个和上一个窗口分别用Control+a nControl+a p。表 4-1 列出最常用的 Tmux 快捷键,完整列表参见man tmux或在 Tmux 会话中按Control+a ?

表 4-1 常用 Tmux 快捷键

快捷键序列操作
Control+a d断开会话
Control+a c创建新窗口
Control+a n切换到下一个窗口
Control+a p切换到上一个窗口
Control+a &关闭当前窗口(在外壳中输入exit也可)
Control+a ,重命名当前窗口
Control+a ?列出所有快捷键

表 4-2 常用 Tmux 子命令

子命令操作
tmux list-sessions列出所有会话
tmux new-session -s session-name创建名为 “session-name” 的新会话
tmux attach-session -t session-name连接名为 “session-name” 的会话
tmux attach-session -d -t session-name连接名为 “session-name” 的会话,先断开其现有连接

如果你用 Emacs 作为文本编辑器,会很快发现Control+a快捷键可能冲突。要输入字面意义的Control+a(如在 Emacs 或 Bash 外壳中用于跳到行首),按Control+a a

http://www.dtcms.com/a/314182.html

相关文章:

  • Vue Router快速入门
  • 数据从mysql迁移到postgresql
  • Petalinux快捷下载
  • 项目一:Python实现PDF增删改查编辑保存功能的全栈解决方案
  • WPF 按钮背景色渐变
  • LLM开发——基于Graph RAG知识图谱检索增强生成
  • steam Rust游戏 启动错误,删除sys驱动,亲测有效。
  • MySQL 约束知识体系:八大约束类型详细讲解
  • Spring Cloud Gateway 实现登录校验:构建统一认证入口
  • 网站从HTTP升级到HTTPS网址方法
  • AWS Lambda Function 全解:无服务器计算
  • 力扣top100--哈希
  • AWS VPC Transit Gateway 可观测最佳实践
  • 【MySQL】配置复制拓扑
  • Qt 商业应用开发流程与规范
  • 【Pytorch✨】LSTM03 三大门
  • 飞算科技:用自主创新技术,为行业数字化转型按下 “加速键”
  • Selenium教程(Python 网页自动化测试脚本)
  • 补:《每日AI-人工智能-编程日报》--2025年7月31日
  • 每日一leetcode:移动零
  • 服务器的Mysql 集群技术
  • IDA9.1使用技巧(安装、中文字符串显示、IDA MCP服务器详细部署和MCP API函数修改开发经验)
  • 主要 bug/问题 以及 修改建议:
  • 【Linux】System V - 基于建造者模式的信号量
  • Go语言流式输出技术实现-服务器推送事件(Server-Sent Events, SSE)
  • Git 与 GitHub 协作
  • BackgroundTasks 如何巧妙驾驭多任务并发?
  • 9. Linux 交换空间管理
  • [GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!
  • 事件(二)实战案例