在同一个会话中远程运行 mpirun 和 ssh-add

0xF*_*xFF 5 ssh remote mpi

我正在开发一个使用 MPI 在多台机器上运行的程序。

我在 Amazon EC2 上有机器,我可以从其中一台(主机)启动mpirun

如果我 SSH 到主机,然后触发ssh-agent,然后ssh-add my_rsa_key.

我想要做的是能够在我的本地机器上有一个脚本,我可以在其中mpirun远程触发主控ssh,问题是我得到了Permission denied (Public key)因为ssh-add没有通过该会话接收请求(我想)。

这是我现在正在尝试的部署脚本的一个非常基本的草稿。

#!/bin/bash

MACHINES_LIST="M1
M2"     

echo $MACHINES_LIST | tr " " "\n" | while read fn; do
    echo "$fn"

    echo "deploying and compiling to : $fn ..."
    scp -i key "sample.c" user@$fn:/home/user
    ssh $fn 'mpicc sample.c -o sample' &

done

echo "uploading lists of hosts to master M"
scp -i key .hosts user@M:/home/user

echo "starting mpirun on master M"

##### Here mpirun needs to execute after ssh-add
ssh M 'exec ssh-agent bash;ssh-add my_rsa_key;mpirun --hostfile .hosts -np 10 sample'
Run Code Online (Sandbox Code Playgroud)

有没有办法mpirunssh-add正在运行的会话中执行(远程)?

Ric*_*rri 3

我认为问题出在这一行:

ssh M 'exec ssh-agent bash;ssh-add my_rsa_key;mpirun --hostfile .hosts -np 10 sample'
Run Code Online (Sandbox Code Playgroud)

至少存在以下几个问题:

  1. exec ssh-agent部分将用 [ssh-agent] 替换当前 shell(由 ssh 启动的远程 shell),因此永远不会运行以下命令。

  2. 为了让 [ssh-add] 与 [ssh-agent] 对话,必须定义一些环境变量,告诉代理套接字的位置。

因此启动 ssh-agent 的常用方法是通过 shelleval 命令:

eval $(ssh-agent -s)
Run Code Online (Sandbox Code Playgroud)

因此,我会将脚本的最后一行更改为:

ssh M 'exec $(ssh-agent); ...(keep the rest unchaged)'
Run Code Online (Sandbox Code Playgroud)

请注意,此处必须使用单引号',否则 $(...)将由运行脚本的 shell 展开,即,将在本地计算机上启动 ssh 代理。

或者,您可以配置所有 EC2 主机(M 和 M1+M2)和本地 ssh 客户端以允许代理转发,并且只需在本地运行代理即可。然后,您只需要确保您在本地添加的密钥在每个远程主机上都得到授权。