7

我正在使用:clientAPI 连接到外部节点并在那里远程使用代码,但问题是我正在使用 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 参数设置为 be 之类的方法,"-rsh ssh -i /path/to/id_rsh"但它似乎完全忽略了这一点,我不确定它是如何实现的,而且 Erlang 文档对:client我来说有点难以理解(我可以看到它:ssh在下面使用某处,并且可以采用“user_dir”参数,该参数可以包含一个密钥文件,但我不确定如何设置它:client

有任何想法吗?

4

1 回答 1

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可能不存在。

但是,您可以利用此功能指向任何可执行文件,包括 shell 脚本。例如,你可以写一个ssh-wrapper看起来像这样的:

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

然后使用-rsh /path/to/my/ssh-wrapper以便:slave.start使用您的包装器并ssh指定适当的选项。我发现包装技术还使将来的维护更容易,因为连接逻辑保留在一个地方。


Martin S. 对此评论的提示。

于 2019-11-27T17:57:35.563 回答