我正在开发一个使用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'
有没有办法mpirun
在ssh-add
正在运行的会话中执行(远程)执行?
我认为问题出在这一行:
ssh M 'exec ssh-agent bash;ssh-add my_rsa_key;mpirun --hostfile .hosts -np 10 sample'
至少有两个问题:
该exec ssh-agent
部件将用[ssh-agent]替换当前的shell(由ssh启动的远程shell),因此永远不会运行以下命令。
为了使[ssh-add]与[ssh-agent]进行对话,必须定义一些环境变量,以告知代理套接字的位置。
因此,启动ssh-agent的通常方法是通过shelleval
命令:
eval $(ssh-agent -s)
因此,我将脚本的最后一行更改为:
ssh M 'exec $(ssh-agent); ...(keep the rest unchaged)'
请注意,您必须在'
这里使用单引号,否则$(...)
运行脚本的外壳将扩展,即在本地计算机上启动ssh-agent。
或者,您可以配置所有EC2主机(M和M1 + M2)和本地ssh客户端以允许代理转发,而您只需在本地运行代理即可。然后,您只需要确保在每个远程主机上对在本地添加的密钥进行身份验证即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句