2016-01-24 151 views
0
private String user = "root", 
      newPassword = "test123"; 

private int port = 22; 

public SSHConnection(String host, String password) { 
    try { 
     JSch jsch = new JSch(); 

     Session session = jsch.getSession(user, host, port); 
     session.setPassword(password); 
     Properties config = new Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 
     session.connect(); 

     ChannelExec channel = (ChannelExec)session.openChannel("exec"); 
     OutputStream out = channel.getOutputStream(); 
     ((ChannelExec)channel).setErrStream(System.err); 
     channel.connect(); 

     out.write(password.getBytes()); 
     out.flush(); 
     out.write(newPassword.getBytes()); 
     out.flush(); 
     out.write(newPassword.getBytes()); 
     out.flush(); 

     channel.disconnect(); 
     session.disconnect(); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

我被要求在第一次登錄服務器時更改密碼。我正在嘗試使用JSch來做到這一點,但我不知道該如何實現。據我瞭解,我可以不使用任何命令,我被迫做任何事情之前更改密碼,所以我不能用Java SSH在登錄時更改密碼

(echo old_password; echo new_password; echo new_password) | passwd username 
+0

'passwd'從tty獲取輸入,而不是從stdin輸入。 – EJP

+0

什麼樣的更改密碼提示是?它是一種工具,像'passwd'嗎?或者它是一個內置的SSH「更改密碼」請求? –

+0

這是您輸入當前登錄詳細信息後得到的內容。 「您需要立即更改密碼(root執行)」,並且您被要求輸入「(當前)UNIX密碼」並且重複兩次新密碼 – user2821023

回答

0

我解決我的問題,通過調用channel.setPty(真);

private String user = "root", 
      newPassword = "test123"; 

private int port = 22; 

public SSHConnection(String host, String password) { 
    try { 
     JSch jsch = new JSch(); 

     Session session = jsch.getSession(user, host, port); 
     session.setPassword(password); 
     Properties config = new Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 
     session.connect(); 

     ChannelExec channel = (ChannelExec)session.openChannel("exec"); 
     OutputStream out = channel.getOutputStream(); 

     ((ChannelExec)channel).setErrStream(System.err); 
     channel.setPty(true); 
     channel.connect(); 

     out.write((password + "\n").getBytes()); 
     out.flush(); 
     Thread.sleep(1000); 

     out.write((newPassword + "\n").getBytes()); 
     out.flush(); 
     Thread.sleep(1000); 

     out.write((newPassword + "\n").getBytes()); 
     out.flush(); 
     Thread.sleep(1000); 

     channel.disconnect(); 
     session.disconnect(); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

我每個輸入的一致性前加入睡覺,通常你會想要進入每個密碼之前必須等待輸出,但對於我的用途,這將做。

+1

您是否介意在答案中明確指出通過調用'setPty'解決了這個問題? –