2016-01-20 122 views
2

我正在构建一个简单的程序,该程序使用Ganymed for SSH2库对Linux服务器执行单个命令。这里是我的代码...System.out.println同时打印

public class Main { 

static Scanner reader = new Scanner(System.in); 


public static void main(String[] args) throws IOException, InterruptedException{   


    String hostname; // = "192.168.1.241"; 
    int port; // = 22 
    String username; // = "root"; 
    String password; 
    String cmd; // = "echo 'Hello World'"; 

    //ask user for hostname/IP 
    System.out.print("Enter hostname or IP: "); 
    hostname = reader.nextLine(); 


    //ask user for port # 
    System.out.print("Enter port number: "); 
    port = reader.nextInt();   

     //create connection 
     Connection connect = new Connection(hostname, port); 

    //ask user for username 
    System.out.println("Enter Username (best to use 'root'): "); 
    username = reader.nextLine(); 

    //ask user for password 
    System.out.println("Enter Password: "); 
    password = reader.nextLine(); 


    System.out.println("Attempting to log in..."); 

    reader.close(); 

     //establish connection 
     connect.connect(); 

     //login using password 
     connect.authenticateWithPassword(username, password); 

     Thread.sleep(1000); 
     if (Thread.interrupted()) // Clears interrupted status! 
       throw new InterruptedException(); 

     Boolean didConnect = connect.isAuthenticationComplete(); 
     if (didConnect==false){ 
      throw new IOException("Authentication Unsucessful \nCheck hostname and port number, then try again."); 
     } 

      //open session 
      Session session = connect.openSession(); 
      System.out.println("Opened session!");    




     System.out.println("Enter a command to execute: "); 
     cmd = reader.nextLine(); 

     //execute command 
     session.execCommand(cmd); 


     //get output 
     InputStream stdout = new StreamGobbler(session.getStdout()); 

     BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); 

     String line = br.readLine(); 
     if (line!=null){ 
      System.out.println("Command sent succesfully!" + "\nOutput: " + "\n" + "\n" + line); 
     }else{ 
      System.out.println("Command sent succesfully!" + "\nNo Output"); 
     } 

     //close buffered reader 
     br.close(); 

     //close session 
     session.close(); 

     //close connection 
     connect.close(); 


    } 



} 

出于某种原因......同时

//ask user for username 
    System.out.println("Enter Username (best to use 'root'): "); 
    username = reader.nextLine(); 

    //ask user for password 
    System.out.println("Enter Password: "); 
    password = reader.nextLine(); 

打印,我不知道为什么!当使用打印ln并且在使用打印时在相同的行上,它也在完全不同的行上获得用户输入。

我希望他们先询问用户名,然后再输入密码,将用户输入放在输出旁边。但是,当我要求他们单独/按顺序打印主机名和端口号时,就像我希望的那样。我究竟做错了什么?

回答

1

你做port = reader.nextInt();后,您需要将一个reader.nextLine()读取线(和换行符),其余它具有INT。

//ask user for port # 
System.out.print("Enter port number: "); 
port = reader.nextInt();   

reader.nextInt()不阅读次数后换行或任何东西。

添加reader.nextLine()然后将代码的其余部分应遵循:

reader.nextLine(); 

//ask user for username 
System.out.println("Enter Username (best to use 'root'): "); 
username = reader.nextLine(); 

//ask user for password 
System.out.println("Enter Password: "); 
password = reader.nextLine(); 
+0

谢谢,这工作,很好的解释 –

-1

您的问题是您多次使用相同的扫描仪对象来读取一行。它跳过代码:

//ask user for username 
System.out.println("Enter Username (best to use 'root'): "); 
username = reader.nextLine(); 

//ask user for password 
System.out.println("Enter Password: "); 
password = reader.nextLine(); 

因为对象已经为您调用的方法赋值。

解决方案:重新实例每次使用它时的对象:

reader = new Scanner(System.in); 
+0

我想是因为它正在执行的代码顺序单线程程序(如果让任何意义...即时通讯新的编程)我好的,重新使用扫描仪。以前的答案工作 –

+0

我也过早关闭扫描仪,我仍然需要它来检索命令输入 –