Erlang客户端设置SSH密钥

7
我正在使用: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",但它似乎完全忽略了这一点。我不确定它是如何实现的,对于:client的Erlang文档对我来说有些难以理解(我可以看到它在某个地方使用:ssh,并且可以接受一个“user_dir”参数,其中可以包含一个密钥文件,但我不知道如何从:client设置它)。

有什么想法吗?


抱歉,"inet_loader_args ==" 是字面上的代码吗?如果是,那就是错误的。但我猜你的意思是它等同于什么。 - Onorio Catenacci
你猜对了 :) - Zen
我猜你在给inet_loader_args赋值时使用了单引号,我的理解也是正确的吗?这是一个重要的细节。 - Onorio Catenacci
2
查看slave.erl-rsh参数被传递给:os.find_executable,在您的示例中,它将寻找一个可执行文件ssh -i /path/to/id_rsh,但显然不存在。 我认为你最好做一些像-rsh /path/to/my/ssh-wrapper这样的事情,并让ssh-wrapper成为一个shell脚本,执行exec ssh -i /path/to/id_rsh $@ - Martin S.
@MartinS。这甚至没有出现在我的脑海中,完全解决了这个问题。谢谢。如果你想把它变成一个答案,我会接受的 :) - Zen
显示剩余2条评论
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.的评论,

感谢 Martin S. 的评论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接