Reputation: 17
I'm able to successfully connect to the remote host using the JSch, however, there's a prompt set by the IT team on that host with some general warning message something like "This is a private system, unauthorized access is not permitted" etc.. I have to manually press the ENTER key to proceed further. I've tried to automate this key press using the Robot but that does not seem to be working. Prompt takes few seconds to show up so I'm using the Thread.sleep(5000)
, I've also tried using the Robot.delay(5000)
. Appreciate any pointers. I've tried for any existing answers on this topic but could not find.
Here is my code snippet.
Session session = jsch.getSession("userName", "hostNmae", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("Password");
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.connect();
Thread.sleep(5000);
// Press ENTER
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
Here is the MyUserInfo class:
public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{
public String getPassword(){ return passwd; }
public boolean promptYesNo(String str){
Object[] options={ "yes", "no" };
int foo=JOptionPane.showOptionDialog(null,
str,
"Warning",
JOptionPane.DEFAULT_OPTION,
JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
return foo==0;
}
String passwd;
JTextField passwordField=(JTextField)new JPasswordField(20);
public String getPassphrase(){ return null; }
public boolean promptPassphrase(String message){ return true; }
public boolean promptPassword(String message){
Object[] ob={passwordField};
int result=
JOptionPane.showConfirmDialog(null, ob, message,
JOptionPane.OK_CANCEL_OPTION);
if(result==JOptionPane.OK_OPTION){
passwd=passwordField.getText();
return true;
}
else{ return false; }
}
public void showMessage(String message){
JOptionPane.showMessageDialog(null, message);
}
final GridBagConstraints gbc =
new GridBagConstraints(0,0,1,1,1,1,
GridBagConstraints.NORTHWEST,
GridBagConstraints.NONE,
new Insets(0,0,0,0),0,0);
private Container panel;
public String[] promptKeyboardInteractive(String destination,
String name,
String instruction,
String[] prompt,
boolean[] echo){
panel = new JPanel();
panel.setLayout(new GridBagLayout());
gbc.weightx = 1.0;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.gridx = 0;
panel.add(new JLabel(instruction), gbc);
gbc.gridy++;
gbc.gridwidth = GridBagConstraints.RELATIVE;
JTextField[] texts=new JTextField[prompt.length];
for(int i=0; i<prompt.length; i++){
gbc.fill = GridBagConstraints.NONE;
gbc.gridx = 0;
gbc.weightx = 1;
panel.add(new JLabel(prompt[i]),gbc);
gbc.gridx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weighty = 1;
if(echo[i]){
texts[i]=new JTextField(20);
}
else{
texts[i]=new JPasswordField(20);
}
panel.add(texts[i], gbc);
gbc.gridy++;
}
if(JOptionPane.showConfirmDialog(null, panel,
destination+": "+name,
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE)
==JOptionPane.OK_OPTION){
String[] response=new String[prompt.length];
for(int i=0; i<prompt.length; i++){
response[i]=texts[i].getText();
}
return response;
}
else{
return null; // cancel
}
}
}
Upvotes: 2
Views: 669
Reputation: 202088
What you are seeing is most probably SSH authentication banner.
By default JSch handles that by passing it to showMessage
method of your implementation of UserInfo
interface.
Your implementation of the method is most probably what displays the prompt. Change the implementation the way you like. Though make sure you still handle the message reasonably, like logging it. As the method is used for other important messages.
Another possibility is that you are seeing a keyboard-interactive message with no prompts. That message is handled by UIKeyboardInteractive
interface and its UIKeyboardInteractive.promptKeyboardInteractive
method.
Both these methods are implemented by your MyUserInfo
class to show some GUI.
For details, see How to read the SSH key-sig pair banner (for generating SSH password) after connecting to host in java?
Upvotes: 1