如何连接到远程服务器上运行的REPL会话,例如通过SSH访问?
如何连接到远程服务器上运行的REPL会话,例如通过SSH访问?
对于网络专家来说这可能是显而易见的,但我花了一段时间才发现,所以在此记录下来。
在远程服务器上启动REPL应用程序时,不要仅使用lein repl
,而是强制绑定到一个端口:
lein repl :start :port 40000
在您的计算机上,以正常方式连接到远程服务器(例如通过ssh)。 然后以以下方式连接到应用程序:
lein repl :connect localhost:40000
就是这样!
nrepl
包应该是生产版本的一部分,而不仅仅是开发时的依赖;现在详细说明:
1) 将这些deps添加到主要的 :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连接。ssh -L 7888:<remote-host>:7888 <user>@<remote-host>
M-x cider-connect RET localhost 7888
,就完成了:你已经连接到远程应用程序。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
连接到远程Clojure REPL的安全方式
$ clj "-J-Dclojure.server.repl={:port 5555 :accept clojure.core.server/repl}"
$ ssh -L :5555:localhost:5555 remoteuser@remotehost -p 22 -N -v
$ 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)
clj -Sdeps '{:deps {vlaaad/remote-repl {:mvn/version "1.1"}}}' -m vlaaad.remote-repl :port 5555
顺便说一句,您可以轻松地从一个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
如果 repl 在远程主机上以 localhost:6666 运行,则可能需要使用 ssh 隧道。
在本地机器上,使用 ssh -L :6666:localhost:6666 remoteuser@remotehost -N -v 命令进行连接。
然后只需连接到 localhost:6666 即可。
nc localhost 6666
,但什么也没有发生。 - alex314159
nrepl/nrepl
)。 - Bozhidar Batsov