2016-04-05 110 views
0

爲什麼沒有輸出?我們的目標是要管的telnet通過tee用這個命令:如何通過Java管道通過tee管道telnet

sh -c telnet rainmaker.wunderground.com 3000 | tee weather.txt

對於看到的telnet輸出和記錄與Java服務器響應的目的。 (雖然有遠程登錄庫我試圖使用該系統的telnet以exec,或類似的,而不是庫)。

命令被正確地迴盪在下面,但沒有輸出顯示:

[email protected]:~$ 
[email protected]:~$ java -jar NetBeansProjects/T/dist/T.jar 
Apr 05, 2016 4:36:56 AM net.bounceme.mordor.telnet.Main run 
INFO: starting.. 
Apr 05, 2016 4:36:56 AM net.bounceme.mordor.telnet.Telnet <init> 
INFO: connecting.. 
Apr 05, 2016 4:36:56 AM net.bounceme.mordor.telnet.PropertiesReader getConnection 
INFO: starting.. 
Apr 05, 2016 4:36:56 AM net.bounceme.mordor.telnet.PropertiesReader getConnection 
INFO: {weather.port=3000, weather.host=rainmaker.wunderground.com} 
Apr 05, 2016 4:36:56 AM net.bounceme.mordor.telnet.Telnet getAddress 
INFO: sh -c telnet rainmaker.wunderground.com 3000 | tee weather.txt 
a 
b 
c 
^CApr 05, 2016 4:37:01 AM net.bounceme.mordor.telnet.Telnet read 
SEVERE: exiting.. 130 
[email protected]:~$ 

而且,也沒有創建weather.txt

[email protected]:~$ 
[email protected]:~$ nl weather.txt 
nl: weather.txt: No such file or directory 
[email protected]:~$ 

代碼:

package net.bounceme.mordor.telnet; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Properties; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Telnet { 

    private final static Logger LOG = Logger.getLogger(Telnet.class.getName()); 

    public Telnet() { 
     LOG.info("connecting.."); 
    } 

    private String getAddress() { 
     Properties props = PropertiesReader.getConnection(); 
     String host = props.getProperty("weather.host"); 
     String port = props.getProperty("weather.port"); 
     String tee = " | tee weather.txt"; 
     String address = "sh -c telnet " + host + " " + port + tee; 
     LOG.info(address); 
     return address; 
    } 

    private void read(Process process) throws IOException, InterruptedException { 
     BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String line = null; 
     while ((line = input.readLine()) != null) { 
      System.out.println(line); 
     } 
     int exitVal = process.waitFor(); 
     LOG.log(Level.SEVERE, "exiting.. {0}", exitVal); 
    } 

    private void useProcessBuilder() throws IOException, InterruptedException { 
     LOG.info("using ProcessBuilder.."); 
     ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", getAddress()); 
     Process process = processBuilder.start(); 
     BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String line = null; 
     while ((line = input.readLine()) != null) { 
      System.out.println(line); 
     } 
     int exitVal = process.waitFor(); 
     LOG.log(Level.SEVERE, "done {0}", exitVal); 
    } 

    public void tryProcessBuilder() { 
     try { 
      useProcessBuilder(); 
     } catch (IOException | InterruptedException ex) { 
      Logger.getLogger(Telnet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private void connect() throws IOException, InterruptedException { 
     Runtime runtime = Runtime.getRuntime(); 
     Process process = runtime.exec(getAddress()); 
     read(process); 
    } 

    public void tryConnect() { 
     try { 
      connect(); 
     } catch (IOException | InterruptedException ex) { 
      Logger.getLogger(Telnet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

儘管可以通過將管道留給三通來生成輸出,但這並不能解決與telnet一起使用tee的問題。

也參見:

到陷阱的解決方案是簡單地通過 控制重定向從 所述的Runtime.exec()方法單獨處理外部進程的標準輸出流。

http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2

+0

你可以試試[Runtime.html#exec](https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec(java.lang.String []) ) –

+0

@KarthikeyanVithithilingam非常好奇的評論在這裏:http://stackoverflow.com/a/19383655/262852我做了一個後續問題:http://stackoverflow.com/questions/36429067/sending-a-cmdarray-for-exec -to-process-hello-world,但沒有直接檢查「exec」的源代碼。你能詳細說明嗎? – Thufir

回答

1

能夠理解|的唯一事情是一個外殼。你需要執行一個shell來理解這個管道命令。

+0

「exec shell」是什麼意思? – Thufir

+0

將'sh -c'添加到命令的前面。 – EJP