【问题标题】:Erlang client set ssh keyErlang 客户端设置 ssh 密钥
【发布时间】:2016-03-03 09:10:31
【问题描述】:

我正在使用: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 ==" 是文字代码吗?如果是这样,那就错了。但我假设你的意思是这就是它的等价物。
  • 你猜对了:)
  • 我是否也正确假设您在分配给inet_loader_args 的值周围使用单引号?这是一个重要的细节。
  • 是的,我正在用 to_char_list/1 转换它
  • 查看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 $@ 的shell 脚本。

标签: ssh erlang elixir erlang-otp rsh


【解决方案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 可能不存在。

但是,您可以利用此功能来指向任何 可执行文件,包括一个shell 脚本。例如,您可以编写一个类似于以下内容的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.的帽子提示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多