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

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

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

我在 Amazon EC2 上有可以启动的机器姆皮伦来自其中一位(大师)。

如果我 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'

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

答案1

我认为问题出在这一行:

ssh M 'exec ssh-agent bash;ssh-add my_rsa_key;mpirun --hostfile .hosts -np 10 sample'

至少存在以下几个问题:

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

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

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

eval $(ssh-agent -s)

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

ssh M 'exec $(ssh-agent); ...(keep the rest unchaged)'

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

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

答案2

如何通过使用来简化整个问题ssh 代理转发反而?您可以从本地传递凭据ssh-agent以在远程计算机上使用,因此您不必担心运行新代理并在其中添加密钥。

相关内容