Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssh Clojure-如何远程连接到正在运行的REPL进程_Ssh_Clojure_Remote Access_Leiningen_Nrepl - Fatal编程技术网

Ssh Clojure-如何远程连接到正在运行的REPL进程

Ssh Clojure-如何远程连接到正在运行的REPL进程,ssh,clojure,remote-access,leiningen,nrepl,Ssh,Clojure,Remote Access,Leiningen,Nrepl,如何连接到运行在远程服务器上的REPL会话,例如通过SSH访问该会话?这对网络专家来说可能是显而易见的,但我花了一段时间才找到答案,所以在这里对其进行了记录 在远程服务器上,当启动REPL应用程序而不仅仅是lein REPL强制绑定到端口时: lein repl :start :port 40000 在您的计算机上,以正常方式(例如通过ssh)连接到远程服务器。然后通过以下方式连接到应用程序: lein repl :connect localhost:40000 就这样 可能是ssh隧道(如

如何连接到运行在远程服务器上的REPL会话,例如通过SSH访问该会话?

这对网络专家来说可能是显而易见的,但我花了一段时间才找到答案,所以在这里对其进行了记录

在远程服务器上,当启动REPL应用程序而不仅仅是
lein REPL
强制绑定到端口时:

lein repl :start :port 40000
在您的计算机上,以正常方式(例如通过ssh)连接到远程服务器。然后通过以下方式连接到应用程序:

lein repl :connect localhost:40000
就这样

可能是ssh隧道(如果repl作为本地主机在远程主机上运行:6666)

在本地计算机上ssh-L:6666:localhost:6666remoteuser@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>
    
    ssh-l7888::7888@
    

    现在,打开Emacs,调用
    M-x cider connect RET LOCAL HOST 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]
    

    此处有更多信息

    连接到远程clojure repl的安全方法

  • 在远程计算机上的本地主机上启动repl
  • 在本地计算机上创建ssh隧道
  • 在本地计算机上启动repl并通过ssh连接到远程repl:

  • 这对我来说不起作用-我打开了隧道,然后在本地机器上启动了一个单独的终端会话,键入
    nc localhost 6666
    ,但什么都没有发生。你需要使用你的repl端口号anks-但是一旦你创建了隧道,你如何连接到端口40000与repl进行交互?顺便问一下,nREPL 0.2.13在这一点上是古老的。当前版本是0.4.5(它有新的部署工件
    nrepl/nrepl
    )。对,只需从旧项目复制粘贴即可。
    $ 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