- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个有趣的情况,重点关注 erlang ssh 模块的行为。我花了几个小时对一个问题进行故障排除,结果发现 Erlang ssh_connection *exec/4* 函数异步运行。
如果您发出 ssh_connection:exec/4函数来运行一个需要几秒钟才能完成的脚本,然后在你的erlang程序中关闭ssh连接,脚本执行将终止。我的期望是 ssh_connection:exec 是同步而不是异步。
因为完成 ssh_connection:exec 调用的远程脚本的时间未知,所以我选择不发出关闭 ssh:close()。我想了解这样做的后果:
这是我用来验证此问题的测试 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/
所以在 RedHat Linux 上... 我有一个非常独特的应用程序,我需要在其中确定 telnet 连接发生在哪个地址上。应用程序将使用环回地址 Telnet 到它自己,并将根据它连接到的环回地址
我是一名优秀的程序员,十分优秀!