如何设置 SSH 连接#

AiiDA 通过 SSH 协议与远程计算机通信。为 AiiDA 设置 SSH 连接有两种方法:

  1. 使用无密码 SSH 密钥(更简单,但不安全)

  2. 通过 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 的 ProxyJumpProxyCommand 功能,请参阅 通过代理服务器连接远程计算机

现在,您应该可以通过*访问远程计算机(无需输入密码):

$ ssh YOURCLUSTERADDRESS
# this connection is used to copy files
$ sftp YOURCLUSTERADDRESS

连接关闭失败

如果 ssh 命令有效,但 sftp 命令打印出 Connection closed ,则可能是集群**上的 ~/.bashrc 文件中有一行产生了文本输出或错误。删除/注释该文件中的行,直到不产生输出或错误:这样 sftp 就能重新工作。

最后,如果您打算在远程计算机上使用批处理调度程序,也可以试试:

$ ssh YOURCLUSTERADDRESS QUEUE_VISUALIZATION_COMMAND

QUEUE_VISUALIZATION_COMMAND 替换为 squeue (SLURM)、 qstat (PBSpro) 或调度程序的相应命令,并检查它是否能无差错地打印作业队列列表。

调度程序出错?

如果之前的命令出现 command not found 错误,而通过 SSH 登录后,同样的 QUEUE_VISUALIZATION_COMMAND 却能正常运行,则可能是集群上的 .bashrc 文件中存在防护措施,导致无法加载必要的模块。

寻找类似的台词:

[ -z "$PS1" ] && return

case $- in
    *i*) ;;
    *) return;;
esac

会阻止执行后面的任何指令。

您可以将相关指令移到这些行之前,或者完全删除这些保护。如果你想知道 PATH 环境变量的设置是否正确,可以使用以下命令检查其值:

$ ssh YOURCLUSTERADDRESS 'echo $PATH'

通过 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 。本节将介绍如何使用 sshProxyJumpProxyCommand 功能来自动完成这一跳转。

小技巧

如果你在代理/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

备注

如果用户目录不在 PROXYTARGET 之间共享(在大多数超级计算设施中,用户目录在机器之间共享),则需要遵循 instructions for a passwordless connection 两次 :一次是从您的计算机连接到 PROXY 服务器,另一次是从 PROXY 服务器连接到 TARGET 服务器(例如,公钥必须同时列在 PROXYTARGET 服务器的 ~/.ssh/authorized_keys 文件中)。例如,公钥必须同时列在 PROXYTARGET 服务器的 ~/.ssh/authorized_keys 文件中)。

AiiDA 配置#

配置计算服务器 时,AiiDA 将自动解析 ~/.ssh/config 文件中的大部分所需信息。值得注意的例外是 proxy_jump 指令,必须手动指定。

只需复制并粘贴与 ~/.ssh/configProxyJump 相同的指令,即可输入 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 相关的选项获取了适当的值。