我使用: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
)
有什么想法吗?
答案 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
选项。我发现,由于连接逻辑停留在一个地方,因此包装技术也使将来的维护更加容易。