我正在开发一个使用 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)
有没有办法mpirun
在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)
至少存在以下几个问题:
该exec ssh-agent
部分将用 [ssh-agent] 替换当前 shell(由 ssh 启动的远程 shell),因此永远不会运行以下命令。
为了让 [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 客户端以允许代理转发,并且只需在本地运行代理即可。然后,您只需要确保您在本地添加的密钥在每个远程主机上都得到授权。
归档时间: |
|
查看次数: |
980 次 |
最近记录: |