Clojure - 如何远程连接到 运行 REPL 进程
Clojure - how to connect to running REPL process remotely
如何连接到我可以访问的远程服务器上的 REPL 会话 运行,例如通过 SSH?
这对于网络专家来说可能是显而易见的,但我花了一段时间才发现,所以在此处记录下来。
在远程服务器上,当启动您的 REPL 应用程序而不是 lein repl
强制绑定到端口时:
lein repl :start :port 40000
在您的机器上,以正常方式连接到远程服务器(例如通过 ssh)。然后以这种方式连接到您的应用程序:
lein repl :connect localhost:40000
就是这样!
可能是 ssh 隧道(如果 repl 运行 在远程主机上作为 localhost:6666)
在本地机器上 ssh -L :6666:localhost:6666 remoteuser@remotehost -N -v
然后连接到 localhost:6666
我只是想总结一下上面的两个答案。它适用于我的机器:
在远程机器上
lein repl :start :port 40000
在本地机器上
# SSH tunnel on one shell
ssh -NL 40000:localhost:40000 username@host
# Connect to the remote repl on another shell
lein repl :connect localhost:40000
嗯,这很简单。简而言之,有一些步骤需要完成:
nrepl
包应该是生产构建的一部分,而不仅仅是开发依赖;
- 当您的应用程序启动时,它还会在特定端口上的单独线程中生成一个 repl 会话;
- 您的服务器要么公开该端口,要么您通过 SSH 建立隧道。
现在详情:
1) 将这些 dep 添加到主 :dependencies
向量中:
:dependencies [[org.clojure/clojure "1.9.0"]
;; for remote debugging
[cider/cider-nrepl "0.17.0"]
[org.clojure/tools.nrepl "0.2.13"]
如果您使用 Emacs/Cider,则需要 cider-nrepl
。否则,您可以忽略它。
2) 添加一个单独的命名空间来包装 nrepl 服务器:
(ns project.nrepl
(:require [clojure.tools.nrepl.server
:refer (start-server stop-server)]))
(defn nrepl-handler []
(require 'cider.nrepl)
(ns-resolve 'cider.nrepl 'cider-nrepl-handler))
(defonce __server (atom nil))
(def set-server! (partial reset! __server))
(def port 7888)
(defn start
[]
(when-not @__server
(set-server!
(start-server :port port :handler (nrepl-handler)))))
(defn stop
[]
(when-let [server @__server]
(stop-server server)
(set-server! nil)))
(defn init
[]
(start))
在您的核心模块中,只需调用 (project.nrepl/init)
。现在您的应用程序允许通过 nrepl 连接到它。
3) 在远程服务器上,您可能会将 TCP 7888 端口暴露给外部世界,这是不安全的。至少应该限制端口访问某些 IP 地址,例如你的办公室。更好的选择是通过 SSH 转发它,如下所示:
ssh -L 7888:<remote-host>:7888 <user>@<remote-host>
现在,打开 Emacs,调用 M-x cider-connect RET localhost 7888
完成:您已连接到远程应用程序。
顺便说一句,您可以像这样
轻松地从一个 REPL/clojure 应用程序连接到其他 REPL(例如比较开发和 UAT 之间的评估结果)
=> (require '[clojure.tools.nrepl :as repl])
nil
=> (with-open [conn (repl/connect :port 59258)]
(-> (repl/client conn 1000) ; message receive timeout required
(repl/message {:op "eval" :code "(+ 2 3)"})
repl/response-values))
[5]
这里有更多内容https://nrepl.org/nrepl/usage/clients.html#_talking_to_an_nrepl_endpoint_programmatically
连接到远程 clojure repl 的安全方式
- 在远程机器上的本地主机上启动 repl
$ clj "-J-Dclojure.server.repl={:port 5555 :accept clojure.core.server/repl}"
- 在本地机器上创建 ssh 隧道
$ ssh -L :5555:localhost:5555 remoteuser@remotehost -p 22 -N -v
- 在本地机器上启动 repl 并通过 ssh 连接到远程 repl:
$ clj -Sdeps '{:deps {vlaaad/remote-repl {:mvn/version "1.1"}}}'
Downloading: vlaaad/remote-repl/1.1/remote-repl-1.1.pom from clojars <br>
Downloading: vlaaad/remote-repl/1.1/remote-repl-1.1.jar from clojars <br>Clojure 1.10.1 <br>
(require '[vlaaad.remote-repl :as rr])<br>
user=> (rr/repl :port 5555)
- 或者在本地机器上启动 repl 并立即放入远程 repl
clj -Sdeps '{:deps {vlaaad/remote-repl {:mvn/version "1.1"}}}' -m vlaaad.remote-repl :port 5555
如何连接到我可以访问的远程服务器上的 REPL 会话 运行,例如通过 SSH?
这对于网络专家来说可能是显而易见的,但我花了一段时间才发现,所以在此处记录下来。
在远程服务器上,当启动您的 REPL 应用程序而不是 lein repl
强制绑定到端口时:
lein repl :start :port 40000
在您的机器上,以正常方式连接到远程服务器(例如通过 ssh)。然后以这种方式连接到您的应用程序:
lein repl :connect localhost:40000
就是这样!
可能是 ssh 隧道(如果 repl 运行 在远程主机上作为 localhost:6666)
在本地机器上 ssh -L :6666:localhost:6666 remoteuser@remotehost -N -v
然后连接到 localhost:6666
我只是想总结一下上面的两个答案。它适用于我的机器:
在远程机器上
lein repl :start :port 40000
在本地机器上
# SSH tunnel on one shell
ssh -NL 40000:localhost:40000 username@host
# Connect to the remote repl on another shell
lein repl :connect localhost:40000
嗯,这很简单。简而言之,有一些步骤需要完成:
nrepl
包应该是生产构建的一部分,而不仅仅是开发依赖;- 当您的应用程序启动时,它还会在特定端口上的单独线程中生成一个 repl 会话;
- 您的服务器要么公开该端口,要么您通过 SSH 建立隧道。
现在详情:
1) 将这些 dep 添加到主 :dependencies
向量中:
:dependencies [[org.clojure/clojure "1.9.0"]
;; for remote debugging
[cider/cider-nrepl "0.17.0"]
[org.clojure/tools.nrepl "0.2.13"]
如果您使用 Emacs/Cider,则需要 cider-nrepl
。否则,您可以忽略它。
2) 添加一个单独的命名空间来包装 nrepl 服务器:
(ns project.nrepl
(:require [clojure.tools.nrepl.server
:refer (start-server stop-server)]))
(defn nrepl-handler []
(require 'cider.nrepl)
(ns-resolve 'cider.nrepl 'cider-nrepl-handler))
(defonce __server (atom nil))
(def set-server! (partial reset! __server))
(def port 7888)
(defn start
[]
(when-not @__server
(set-server!
(start-server :port port :handler (nrepl-handler)))))
(defn stop
[]
(when-let [server @__server]
(stop-server server)
(set-server! nil)))
(defn init
[]
(start))
在您的核心模块中,只需调用 (project.nrepl/init)
。现在您的应用程序允许通过 nrepl 连接到它。
3) 在远程服务器上,您可能会将 TCP 7888 端口暴露给外部世界,这是不安全的。至少应该限制端口访问某些 IP 地址,例如你的办公室。更好的选择是通过 SSH 转发它,如下所示:
ssh -L 7888:<remote-host>:7888 <user>@<remote-host>
现在,打开 Emacs,调用 M-x cider-connect RET localhost 7888
完成:您已连接到远程应用程序。
顺便说一句,您可以像这样
轻松地从一个 REPL/clojure 应用程序连接到其他 REPL(例如比较开发和 UAT 之间的评估结果)=> (require '[clojure.tools.nrepl :as repl])
nil
=> (with-open [conn (repl/connect :port 59258)]
(-> (repl/client conn 1000) ; message receive timeout required
(repl/message {:op "eval" :code "(+ 2 3)"})
repl/response-values))
[5]
这里有更多内容https://nrepl.org/nrepl/usage/clients.html#_talking_to_an_nrepl_endpoint_programmatically
连接到远程 clojure repl 的安全方式
- 在远程机器上的本地主机上启动 repl
$ clj "-J-Dclojure.server.repl={:port 5555 :accept clojure.core.server/repl}"
- 在本地机器上创建 ssh 隧道
$ ssh -L :5555:localhost:5555 remoteuser@remotehost -p 22 -N -v
- 在本地机器上启动 repl 并通过 ssh 连接到远程 repl:
$ clj -Sdeps '{:deps {vlaaad/remote-repl {:mvn/version "1.1"}}}'
Downloading: vlaaad/remote-repl/1.1/remote-repl-1.1.pom from clojars <br>
Downloading: vlaaad/remote-repl/1.1/remote-repl-1.1.jar from clojars <br>Clojure 1.10.1 <br>
(require '[vlaaad.remote-repl :as rr])<br>
user=> (rr/repl :port 5555)
- 或者在本地机器上启动 repl 并立即放入远程 repl
clj -Sdeps '{:deps {vlaaad/remote-repl {:mvn/version "1.1"}}}' -m vlaaad.remote-repl :port 5555