Клиент Erlang устанавливает ключ ssh

Я использую :client API для подключения к внешнему узлу и удаленного использования там кода, однако дело в том, что я использую Dokku для развертывания, и было бы очень неплохо, если бы я мог указать ключ ssh во время выполнения.

Прямо сейчас мой код выглядит примерно так:

def start(host) do
  allow_boot to_char_list(host)
  {:ok, slave} = :slave.start(to_char_list(host), :slave, inet_loader_args)
  load_paths(slave)
  {:ok, slave}
end

inet_loader_args == ' -rsh ssh -loader inet -hosts #{master_node_ip} -setcookie #{:erlang.get_cookie}'

Я пробовал что-то вроде установки аргумента -rsh равным "-rsh ssh -i /path/to/id_rsh", но, похоже, он полностью игнорирует это, я не совсем уверен, как это реализовано, и документы Erlang для :client мне немного сложно понять (я вижу это использует :ssh где-то внизу, и это может принимать аргумент «user_dir», который может содержать файл ключа, но я не уверен, как установить это из :client)

Есть идеи?


person Zen    schedule 29.11.2015    source источник
comment
Извините, это inet_loader_args == буквальный код? Если это неправильно. Но я предполагаю, что вы имеете в виду, что это эквивалентно.   -  person Onorio Catenacci    schedule 30.11.2015
comment
Вы правильно предполагаете :)   -  person Zen    schedule 30.11.2015
comment
Я также прав, предполагая, что вы используете одинарные кавычки вокруг значения, которое вы назначаете для inet_loader_args? Это важная деталь.   -  person Onorio Catenacci    schedule 30.11.2015
comment
Да, я трансформирую его с помощью to_char_list/1   -  person Zen    schedule 30.11.2015
comment
Чтобы было ясно, код работает. Проблема в том, что я хотел бы установить собственный путь для ключевого файла, а не по умолчанию ~/.ssh/id_rsa   -  person Zen    schedule 30.11.2015
comment
Глядя на slave.erl аргумент -rsh передается в :os.find_executable, который в вашем примере будет искать исполняемый файл ssh -i /path/to/id_rsh, которого, очевидно, не существует. Я думаю, что вам лучше всего сделать что-то вроде -rsh /path/to/my/ssh-wrapper и сделать ssh-wrapper скриптом оболочки, который делает exec ssh -i /path/to/id_rsh $@.   -  person Martin S.    schedule 24.12.2015
comment
@МартинС. ???? Это даже не пришло мне в голову, и полностью решает эту проблему. Спасибо. Если вы хотите превратить это в ответ, я приму это :)   -  person Zen    schedule 26.12.2015


Ответы (1)


Параметр -rsh предназначен для указать на другой исполняемый файл:

%% Alternative, if the master was started as
%% 'erl -sname xxx -rsh my_rsh...', then 'my_rsh' will be used instead
%% of 'rsh' (this is useful for systems where the rsh program is named
%% 'remsh').

В наши дни люди используют ssh вместо rsh. (Около 10 лет назад команде безопасности на предыдущей работе требовалось ssh, даже если обе машины находятся в одной и той же изолированной сети.) Поскольку интерфейс командной строки совместим, простое указание на новый исполняемый файл обычно работает, если вы правильно настроили ключи. . Поэтому имеет смысл использовать параметр -rsh, чтобы вместо этого указывать на ssh.

Также кажется логичным, что этот аргумент можно использовать для передачи других параметров команде ssh, как вы пытались. Однако код предполагает, что переданная строка является именем исполняемого файла в вашем PATH. Он использует os:find_executable для поиска исполняемого файла и ssh -i /path/to/id_rsh, вероятно, не существует.

Однако вы можете воспользоваться этой функцией, чтобы указать на любой исполняемый файл, включая сценарий оболочки. Например, вы можете написать ssh-wrapper, который выглядит примерно так:

#!/usr/bin/env ksh
exec ssh -i /path/to/id_rsh $@

Затем используйте -rsh /path/to/my/ssh-wrapper, чтобы :slave.start использовал вашу оболочку с правильными указанными параметрами ssh. Я обнаружил, что метод оболочки также упрощает дальнейшее обслуживание, поскольку логика соединения остается в одном месте.


Подсказка к этому комментарию Мартина С.

person Jon Ericson    schedule 27.11.2019