Запуск mpirun и ssh-add удаленно на той же сессии

Я разрабатываю программу, которая работает на нескольких машинах с использованием 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' 

Есть, по крайней мере, несколько вопросов:

  1. часть exec ssh-agent заменит текущую оболочку (удаленную оболочку, запущенную ssh) с помощью [ssh-agent], поэтому следующие команды никогда не будут выполняться.

  2. для того, чтобы [ssh-add] поговорить с [ssh-agent], необходимо определить несколько переменных среды, указав расположение сокета агента.

Таким образом, обычным способом запуска ssh-agent является команда оболочки eval :

 eval $(ssh-agent -s) 

Поэтому я бы изменил последнюю строку вашего скрипта на:

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

Обратите внимание, что здесь вы должны использовать одинарные кавычки, иначе $(...) будет расширяться оболочкой, запускающей скрипт, т. Е. Ssh-agent будет запущен на вашем локальном компьютере.

Кроме того, вы можете настроить все хосты EC2 (M и M1 + M2) и локальный клиент ssh, чтобы разрешить перенаправление агентов, и вы просто запускаете агент локально. Тогда вам нужно будет только убедиться, что ключ, который вы добавляете локально, авторизуется на каждом удаленном хосте.

Как упростить всю эту проблему, используя вместо этого ssh-agent-forwarding ? Вы можете передавать учетные данные из локального ssh-agent для использования на удаленном компьютере, поэтому вам не нужно беспокоиться о запуске нового агента и добавлении там ключей.