gpt4 book ai didi

erlang - 如何使用ssh_connection :exec in Erlang?

转载 作者:行者123 更新时间:2023-12-03 02:48:34 25 4
gpt4 key购买 nike

这是一个有趣的情况,重点关注 erlang ssh 模块的行为。我花了几个小时对一个问题进行故障排除,结果发现 Erlang ssh_connection *exec/4* 函数异步运行。

如果您发出 ssh_connection:exec/4函数来运行一个需要几秒钟才能完成的脚本,然后在你的erlang程序中关闭ssh连接,脚本执行将终止。我的期望是 ssh_connection:exec 是同步而不是异步。

因为完成 ssh_connection:exec 调用的远程脚本的时间未知,所以我选择不发出关闭 ssh:close()。我想了解这样做的后果:

  • gc 会在某个时候清除它吗?
  • 在整个节点存在期间它会永远保持开放状态吗?
  • 有没有办法让 ssh_connection:exec 同步,正如我认为应该的那样。

这是我用来验证此问题的测试 erl 程序的示例。作为脚本,您可以运行简单的 sleep 10( sleep 10 秒)来模拟运行缓慢的程序。

-module(testssh).
-export([test/5]).

test (ServerName, Port, Command, User, Password) ->

crypto:start(),
ssh:start(),
{ok, SshConnectionRef} = ssh:connect(ServerName, Port, [ {user, User}, {password, Password} , {silently_accept_hosts, true} ], 60000 ),
{ok, SshConnectionChannelRef} = ssh_connection:session_channel(SshConnectionRef, 60000),
Status = ssh_connection:exec(SshConnectionRef, SshConnectionChannelRef, Command, 60000),
ssh:close(SshConnectionRef).

远程脚本:

#!/bin/sh
sleep 10

最佳答案

我自己从未使用过 ssh 应用程序,但您应该读到一些错误的内容,文档中清楚地表明结果将作为消息传递给调用者:

[...] the result will be several messages according to the following pattern. Note that the last message will be a channel close message, as the exec request is a one time execution that closes the channel when it is done[...]

参见http://www.erlang.org/doc/man/ssh_connection.html#exec-4

因此,在调用 ssh_connection:exec/4 后,使用如下循环进行测试:

wait_for_response(ConnectionRef) ->
receive
{ssh_cm, ConnectionRef, Msg} ->
case Msg of
{closed, _ChannelId} ->
io:format("Done");
_ ->
io:format("Got: ~p", [Msg]),
wait_for_response(ConnectionRef)
end
end.

您应该收到命令输出和其他 ssh 消息,最后是一条“关闭”消息,这是 ssh 命令已正确完成的信号。

关于erlang - 如何使用ssh_connection :exec in Erlang?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16975083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com