【问题标题】:Java Serversocket and Bash ConnectionJava Serversocket 和 Bash 连接
【发布时间】:2011-01-27 00:56:05
【问题描述】:

我想知道是否有办法在 java serversocket 和 bash tcp 管道之间打开管道。如果是这样,你会怎么做。我知道如何设置 java 服务器端,但是如何通过 bash 甚至 Windows cmd 提示符打开套接字连接。基本上我想将标准输入通过管道传输到 tcp 连接并从中接收标准输出。

任何例子都可以理解!

-TJ

【问题讨论】:

    标签: java bash tcp connection serversocket


    【解决方案1】:

    ServerSocket 不能做任何事情,除了接受传入的连接,并创建用作端点的新套接字(您不使用 ServerSocket 进行任何发送或接收操作)。这很好,但要注意连接的哪一侧需要接受连接。我假设它会是 Bash,因为这似乎是“拥有”管道,所以你会改用 Socket 并连接它。

    【讨论】:

    • 在收到服务器套接字上的连接后,我会使用一个套接字,它会捕获来自 bash 的请求,然后返回一个用于通信的套接字。我基本上想知道如何以及是否可以从 bash/windows cmd 提示符请求 tcp 连接,如果可以,如何请求。谢谢你:)
    【解决方案2】:

    使用任何 SSH 工具(有很多开源工具,例如 ganymade)参考:

    http://java-source.net/open-source/network-clients/ganymed-ssh-2-for-java

    我没有使用这个特定的,但其他 ssh 客户端可以做你想做的事情。

    PS:你真的不需要一个 ServerSocket,但是使用线程是有帮助的。

    【讨论】:

    • 没有服务器套接字你如何捕捉传入的连接?
    【解决方案3】:

    Netcat 通常用于从 Unix shell 打开 TCP 连接。 Bash(或我知道的任何其他 shell)不直接支持它。 Netcat的windows端口好像也有,不过我没用过。

    但最好只使用 SSH,因为在这种情况下,Java 端不需要特殊设置 - 您只需将标准 I/O 流自动重定向到 SSH 客户端,并使用免费加密和可选压缩 (ssh -C) 作为奖励。缺点是需要在 Java 端安装 SSH 服务器,在连接端安装 SSH 客户端。

    【讨论】:

      【解决方案4】:

      这是一个示例 - 类 Connection、Session 等在导入中定义。 当时我们使用的是 trilead SSH,我认为它不再公开可用,但您可以在网上找到很多其他库,例如,http://linuxmafia.com/ssh/java.html

      关键是,我们不必打开一个 serversocket 来 (1) 建立一个 SSH 会话,(2) 进行密码验证,(3) 在用户的登录 shell 中运行一些命令,以及 (4) 获取它的标准输出。我相信大多数 SSH 库都会为您提供此功能。希望对您有所帮助,-M.S.

      public void runCommand (String uName, String pWord, String cmd) throws Exception {
      
          Connection conn = new Connection ("localhost");
          conn.connect();
          boolean authenticated = conn.authenticateWithPassword (uName, pWord);
      
          if (!authenticated)
              throw new Exception ("Authentication failure");
          Session sess = connection.openSession();
          sess.execCommand (cmd);
      
          BufferedReader br = new BufferedReader (new InputStreamReader (
                      new StreamGobbler (sess.getStdout())));
      
          for (String s = br.readLine() ; s != null ; s = br.readLine()) {
                // do stuff with s
          }
          br.close();
          sess.close();
          conn.close();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        • 1970-01-01
        相关资源
        最近更新 更多