如何设置 SSH 连接#
AiiDA 通过 SSH 协议与远程计算机通信。为 AiiDA 设置 SSH 连接有两种方法:
使用无密码 SSH 密钥(更简单,但不安全)
通过
ssh-agent
使用受密码保护的 SSH 密钥(多一个步骤,更安全)
使用无密码 SSH 密钥#
网上有许多教程,如 here。简而言之,首先创建一个新的私钥对/公钥对( aiida
/ aiida.pub
),留下口令 emtpy:
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/aiida
将公钥复制到远程计算机,通常这将把公钥添加到远程计算机的 ~/.ssh/authorized_keys
中:
$ ssh-copy-id -i ~/.ssh/aiida YOURUSERNAME@YOURCLUSTERADDRESS
在 ~/.ssh/config
文件中添加以下行(如果不存在,则创建该文件):
Host YOURCLUSTERADDRESS
User YOURUSERNAME
IdentityFile ~/.ssh/aiida
备注
如果您的群集需要您先连接到另一台计算机 PROXY ,您可以使用 SSH 的 ProxyJump
或 ProxyCommand
功能,请参阅 通过代理服务器连接远程计算机 。
现在,您应该可以通过*访问远程计算机(无需输入密码):
$ ssh YOURCLUSTERADDRESS
# this connection is used to copy files
$ sftp YOURCLUSTERADDRESS
最后,如果您打算在远程计算机上使用批处理调度程序,也可以试试:
$ ssh YOURCLUSTERADDRESS QUEUE_VISUALIZATION_COMMAND
将 QUEUE_VISUALIZATION_COMMAND
替换为 squeue
(SLURM)、 qstat
(PBSpro) 或调度程序的相应命令,并检查它是否能无差错地打印作业队列列表。
通过 ssh 代理使用受密码保护的密钥#
像 ssh-agent
这样的工具(可在大多数Linux发行版和MacOS上使用),可以让你一次性输入受保护密钥的口令,只要代理在运行,就可以访问解密后的密钥。这让你可以使用受密码保护的密钥(一些 HPC 中心要求),同时让 AiiDA 可以使用解密后的密钥进行自动 SSH 操作。
创建密钥#
请按照上述 使用无密码 SSH 密钥 的说明开始操作,唯一不同的是,在创建密钥时(以及登录远程计算机时)要输入口令。
向代理添加密钥#
现在向代理提供私人密钥的口令:
ssh-add ~/.ssh/aiida
现在,私钥和相关口令已记录在代理实例中。
备注
密码相位只保存在代理中,直到下一次重新启动。如果你关闭或重新启动 AiiDA 机器,在启动 AiiDA deamon 之前,记得再次运行 ssh-add
命令。
启动 ssh 代理#
在大多数现代 Linux 安装中, ssh-agent
会在登录时自动启动(例如 Ubuntu 16.04 及更高版本或 MacOS 10.5 及更高版本)。如果收到 Could not open a connection to your authentication agent
错误,则需要手动启动代理。
检查能否在当前shell中启动 ssh-agent
:
eval `ssh-agent`
为了在所有地方重复使用同一个代理实例(包括 AiiDA 守护进程), ssh-agent
的环境变量需要在 ** shell 中重复使用。下载脚本 load-singlesshagent.sh
并将其放在 ~/bin
中。然后在 ~/.bashrc
文件中添加以下几行:
if [ -f ~/bin/load-singlesshagent.sh ]; then
. ~/bin/load-singlesshagent.sh
fi
检查是否正常工作:
打开一个新的 shell(
~/.bashrc
文件来源)。运行
ssh-add
。关闭 shell。
打开一个新的 shell,尝试登录远程计算机。
尝试登录远程计算机;它应该不再需要口令。
密钥及其相应的口令现在由代理保存,直到其停止。重启后,请记得在启动 AiiDA 守护进程前再次运行 ssh-add ~/.ssh/aiida
。
在 OSX 上将 ssh 代理与钥匙串整合在一起#
在 OSX Sierra 及更高版本中,使用本地 ssh-add
client allows passphrases to be stored persistently in the OSX keychain。使用 OSX 特有的 -k
参数将口令存储到钥匙串中:
ssh-add -k ~/.ssh/aiida
要指示 ssh 在 OSX 钥匙串中查找密钥口令,请在 ~/.ssh/config
中添加以下几行:
Host *
UseKeychain yes
AiiDA 配置#
当 配置计算服务器 时,只需确保将 Allow ssh agent
设置为 true
(默认值)即可。
通过代理服务器连接远程计算机#
某些计算集群要求您连接到中间服务器 PROXY ,然后再从该服务器连接到运行计算的集群 TARGET 。本节将介绍如何使用 ssh
的 ProxyJump
或 ProxyCommand
功能来自动完成这一跳转。
小技巧
如果你在代理/Jumphost 服务器上有一个 SSH 账户,可以从当前网络***访问该服务器,并***从该服务器直接访问 目标 机器,那么也可以使用这种方法来避免启动虚拟专用网络(VPN)客户端。
SSH 配置#
要决定使用 ProxyJump
(推荐)还是 ProxyCommand
指令,请先用 ssh -V
检查 SSH 客户端的版本。 ProxyJump
指令是在 OpenSSH 7.3 版本中添加的,因此如果您使用的是旧版本的 SSH(在您的计算机或 PROXY 上),则必须使用旧版本的 ProxyCommand
。
要使用 ProxyJump
设置代理配置,请编辑安装 AiiDA 的计算机上的 ~/.ssh/config
文件(如果没有,请创建),并添加以下行::
Host SHORTNAME_TARGET
Hostname FULLHOSTNAME_TARGET
User USER_TARGET
IdentityFile ~/.ssh/aiida
ProxyJump USER_PROXY@FULLHOSTNAME_PROXY
Host FULLHOSTNAME_PROXY
IdentityFile ~/.ssh/aiida
用相应服务器的主机/用户名替换 ..._TARGET
和 ..._PROXY
变量。
使用 ProxyCommand
的替代设置
要使用
ProxyCommand
代替 设置代理配置,请编辑安装 AiiDA 的计算机上的~/.ssh/config
文件(如果没有,请创建),并添加以下行::Host SHORTNAME_TARGET Hostname FULLHOSTNAME_TARGET User USER_TARGET IdentityFile ~/.ssh/aiida ProxyCommand ssh -W %h:%p USER_PROXY@FULLHOSTNAME_PROXY Host FULLHOSTNAME_PROXY IdentityFile ~/.ssh/aiida
用相应服务器的主机/用户名替换 ..._TARGET
和 ..._PROXY
变量。
在这两种情况下,您都可以使用以下命令直接连接到 TARGET 服务器
$ ssh SHORTNAME_TARGET
备注
如果用户目录不在 PROXY 和 TARGET 之间共享(在大多数超级计算设施中,用户目录在机器之间共享),则需要遵循 instructions for a passwordless connection 两次 :一次是从您的计算机连接到 PROXY 服务器,另一次是从 PROXY 服务器连接到 TARGET 服务器(例如,公钥必须同时列在 PROXY 和 TARGET 服务器的 ~/.ssh/authorized_keys
文件中)。例如,公钥必须同时列在 PROXY 和 TARGET 服务器的 ~/.ssh/authorized_keys
文件中)。
AiiDA 配置#
当 配置计算服务器 时,AiiDA 将自动解析 ~/.ssh/config
文件中的大部分所需信息。值得注意的例外是 proxy_jump
指令,必须手动指定。
只需复制并粘贴与 ~/.ssh/config
中 ProxyJump
相同的指令,即可输入 proxy_jump
:
$ verdi computer configure core.ssh SHORTNAME_TARGET
...
Allow ssh agent [True]:
SSH proxy jump []: USER_PROXY@FULLHOSTNAME_PROXY
备注
代理链可以逗号分隔的列表形式指定。如果需要指定不同的用户名,可以使用 USER_PROXY@...
。如果没有为代理指定用户名,则使用与 TARGET 相同的用户名。
重要
手动指定 proxy_command
通过 verdi computer configure ssh
指定或更新 proxy_command
选项时,请 不要使用占位符 %h
和 %p
,而是提供 实际 主机名和端口。AiiDA 仅在解析 ~/.ssh/config
文件时替换它们。
使用 kerberos 令牌#
如果远程计算机需要通过 Kerberos 令牌进行身份验证(使用 ssh 之前需要获取该令牌),则通常需要
安装
libffi
(Ubuntu 下为sudo apt-get install libffi-dev
)。在安装 aiida-core 时额外安装
ssh_kerberos
(参见 设置 )。
如果您在 ~/.ssh/config
文件中提供了所有必要的 GSSAPI
选项, verdi computer configure
应该已经为所有与 gss 相关的选项获取了适当的值。