Erlang客户端设置ssh密钥

时间:2015-11-29 18:52:11

标签: ssh erlang elixir otp rsh

我使用: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文档for :client对我来说有点难以理解(我可以看到它在某个地方使用:ssh,这可以采用一个" user_dir"参数,它可以包含一个密钥文件,但是我不确定如何从:client

设置

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

-rsh选项为intended to point to a different executable

%% 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命令似乎也是合乎逻辑的。但是,the code假定传递的字符串是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选项。我发现,由于连接逻辑停留在一个地方,因此包装技术也使将来的维护更加容易。


this comment from Martin S.的帽子提示