
私は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'
少なくとも次のような問題があります。
この
exec ssh-agent
セクションでは、現在のシェル(sshで始まるリモートシェル)を[ssh-agent]に置き換えるため、次のコマンドは実行されません。[ssh-add]が[ssh-agent]と通信するには、エージェントにソケットの場所を知らせるいくつかの環境変数を定義する必要があります。
したがって、ssh-agentを起動する一般的な方法は、シェルeval
コマンドを使用することです。
eval $(ssh-agent -s)
したがって、スクリプトの最後の行を次のように変更します。
ssh M 'exec $(ssh-agent); ...(keep the rest unchaged)'
'
ここでは一重引用符を使用する必要があります。それ以外の場合は、$(...)
スクリプトを実行するシェルによって拡張されます。つまり、SSH エージェントがローカルシステムで起動されます。
または、エージェントの配信を許可し、エージェントをローカルで実行するようにすべてのEC2ホスト(MおよびM1 + M2)とローカルSSHクライアントを設定できます。次に、ローカルに追加したキーが各リモートホストで認証されていることを確認するだけです。
答え2
以下を使用して問題全体を簡素化する方法SSHエージェント配信代わりに?リモートシステムで使用するためにローカルで資格情報を渡すことができるため、新しいssh-agent
エージェントを実行してここにキーを追加することを心配する必要はありません。