Session 通过SSH会话关闭-这可能吗?

Session 通过SSH会话关闭-这可能吗?,session,ssh,clojure,closures,Session,Ssh,Clojure,Closures,我试图做的是通过SSH反复发出命令。如果我执行以下操作,则效果很好: (ns bla) (:require[clj-ssh.ssh:as-ssh])) (defn poll[func] (虽然是真的 (func) (线程/睡眠1000))) (ssh上的defn exec) “连接到主机,然后执行传递的命令指示的任何操作” [主机命令] (let[agent(ssh/ssh-agent{}) 会话(ssh/会话代理主机{:严格主机密钥检查:否})] (ssh/连接会话) (轮询(fn[](let

我试图做的是通过SSH反复发出命令。如果我执行以下操作,则效果很好:

(ns bla)
(:require[clj-ssh.ssh:as-ssh]))
(defn poll[func]
(虽然是真的
(func)
(线程/睡眠1000)))
(ssh上的defn exec)
“连接到主机,然后执行传递的命令指示的任何操作”
[主机命令]
(let[agent(ssh/ssh-agent{})
会话(ssh/会话代理主机{:严格主机密钥检查:否})]
(ssh/连接会话)
(轮询(fn[](let[result(ssh/ssh会话{:cmd command})])
(println(获取结果:out(()())())))
; 用法:
(ssh上的exec“某些主机”“正常运行时间”| sed s/^.*平均值:\\\/)
但后来我有了一个聪明的想法,返回一个函数,我只是将命令和处理函数传递给它:

(ssh上的defn exec
“连接到主机,然后执行传递的命令指示的任何操作”
[主持人]
(let[agent(ssh/ssh-agent{})
会话(ssh/会话代理主机{:严格主机密钥检查:否})]
(ssh/连接会话)
(fn[指挥过程乐趣]
(虽然是真的
(let[结果(ssh/ssh会话{:cmd命令})]
(过程乐趣(获取结果:out(()()())))
; 用法:
((ssh上的exec“某个主机”)“正常运行时间”sed s/^.*平均值:\\\/”println)
但这会引发以下异常:

JSchException Packet corrupt  com.jcraft.jsch.Session.start_discard (Session.java:1050)
如果我理解正确,它会发生,因为当它执行任何操作时,会话已经结束了。经过一段时间的实验后,这种情况似乎是由于
ssh/ssh
上的闭包造成的


是否有办法保持会话并具有第二种方法提供的灵活性?

您是否尝试过在
fn
中使用连接移动

而且,这可能不是SSH特有的。尝试编写一些代码,在带有open
块中生成并返回函数,文件将在退出带有open
时关闭


我想提请大家注意的是
let
绑定和
with-*
块之间的区别。后者是关于资源的,它们在执行主体后关闭资源。因此,在您的特定示例中,您创建了一个资源对象,您成功地创建了一个函数,并关闭了该对象。然后资源,这里的连接,被关闭。该函数仍有对它的引用。它只是不再打开。

是的,这是我的愚蠢-我没有返回我期望返回的函数。有了你建议的改变,它就行了。