2016-01-20 5 views
2

Я создаю простую программу, которая выполняет одну команду на Linux-сервере, используя Ganymed для библиотеки SSH2. Вот мой код ...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 и в той же строке при использовании print.

Я хочу, чтобы они сначала попросили имя пользователя, а затем пароль, поместив ввод пользователя рядом с выходом. Однако, когда я запрашиваю имя хоста и номер порта, они печатаются индивидуально/в порядке, как я этого хочу. Что я делаю не так?

ответ

1

После выполнения port = reader.nextInt();, вам нужно поместить reader.nextLine() прочитать остальную часть строки (и символ новой строки), который имеет внутр.

//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

Я также закрыл сканер слишком рано, мне все еще нужно было его получить, чтобы получить команду ввода –

Смежные вопросы