2012-12-17 126 views
3

使用jschjsch并运行“命令苏 - ”

当我运行下面的CMD“须藤苏 - ”程序挂起

[TestNG] Running: 
C:\Users\brian.crosby\AppData\Local\Temp\testng-eclipse-952620154\testng-customsuite.xml 
[[email protected] ~]# 

它看起来像“须藤苏 - ” becasue的工作输出状态“[root @ tbx2-toy-1〜]#”,但是当我发送另一个cmd时,它没有响应。

继承人的代码:

package com.linux; 

import java.io.InputStream; 
import org.testng.annotations.*; 
import com.jcraft.jsch.*; 
import com.thoughtworks.selenium.*; 

public class LinuxConnection extends SeleneseTestBase{ 
String host = null; 
private StringBuilder strFileData; 
String randomFileName = null; 

public String getFileData() { 
    return strFileData.toString(); 
} 
public String getRandomFileName() { 
    return randomFileName; 
} 

public LinuxConnection() { 
    strFileData = new StringBuilder(); 
} 

@Test 
public void createUpdateTBX2FileData(String command)throws Exception { 

    try { 
     JSch jsch = new JSch(); 
     host = "[email protected]************.net"; 

     String user = host.substring(0, host.indexOf('@')); 
     host = host.substring(host.indexOf('@') + 1); 

     Session session = jsch.getSession(user, host, 22); 

     UserInfo ui = new MyUserInfo(); 
     session.setUserInfo(ui); 
     session.connect(); 

     ChannelExec channel = (ChannelExec)session.openChannel("exec"); 
     ((ChannelExec)channel).setPty(true); 
     ((ChannelExec) channel).setCommand(command); 

     ((ChannelExec) channel).setErrStream(System.err); 

     InputStream in = channel.getInputStream(); 
     channel.connect(); 

     byte[] tmp = new byte[2048]; 

     while (in.read(tmp, 0, 2048) > 0) { 
      String str = new String(tmp); 
      strFileData.append(str); 
      System.out.println(strFileData); 
     } 
     in.close(); 
     channel.disconnect(); 
     session.disconnect(); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

public static class MyUserInfo implements UserInfo { 

    public String getPassword() { 
     return "********"; 
    } 

    public boolean promptYesNo(String str) { 
     str = "Yes"; 
     return true; 
    } 

    String passwd; 

    public String getPassphrase() { 
     return null; 
    } 

    public boolean promptPassphrase(String message) { 
     return true; 
    } 

    public boolean promptPassword(String message) { 
     passwd = "*******"; 
     return true; 
    } 

    public void showMessage(String message) { 

    } 
} 

} 

这里是我发送的CMDS:在谷歌

package com.linux; 

import org.testng.annotations.*; 

public class testLinuxConnection { 

@Test 
public void testLinux() throws Exception{ 
    LinuxConnection obj = new LinuxConnection(); 
    String command = "touch tester1.txt; sudo su -; rm tester1.txt;"; 
    obj.createUpdateTBX2FileData(command); 
} 
} 

我又花了几个小时试图找到一个解决方案,但没有成功

任何帮助表示赞赏

+0

这里“sudo su”命令期待输入密码。这是其他命令滞留的地方。我也在寻找答案,一旦找到解决方案,我会提供并更新。 –

+0

以下是解决方案 - http://stackoverflow.com/a/16499330/1917804 –

回答

1

你是代码缺少剩下的代码需要为此运行。您需要从初始化的会话对象中初始化您需要的通道类型。既然你需要能够在彼此之后运行多个命令,你需要一个Shell类型通道:

您应该检查JSch的例子(即Shell.java),这里是一个快速参考:

/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ 
/** 
* This program enables you to connect to sshd server and get the shell prompt. 
* $ CLASSPATH=.:../build javac Shell.java 
* $ CLASSPATH=.:../build java Shell 
* You will be asked username, hostname and passwd. 
* If everything works fine, you will get the shell prompt. Output will 
* be ugly because of lacks of terminal-emulation, but you can issue commands. 
* 
*/ 
import com.jcraft.jsch.*; 
import java.awt.*; 
import javax.swing.*; 

public class Shell{ 
    public static void main(String[] arg){ 

    try{ 
     JSch jsch=new JSch(); 

     //jsch.setKnownHosts("/home/foo/.ssh/known_hosts"); 

     String host=null; 
     if(arg.length>0){ 
     host=arg[0]; 
     } 
     else{ 
     host=JOptionPane.showInputDialog("Enter [email protected]", 
             System.getProperty("user.name")+ 
             "@localhost"); 
     } 
     String user=host.substring(0, host.indexOf('@')); 
     host=host.substring(host.indexOf('@')+1); 

     Session session=jsch.getSession(user, host, 22); 

     String passwd = JOptionPane.showInputDialog("Enter password"); 
     session.setPassword(passwd); 

     UserInfo ui = new MyUserInfo(){ 
     public void showMessage(String message){ 
      JOptionPane.showMessageDialog(null, message); 
     } 
     public boolean promptYesNo(String message){ 
      Object[] options={ "yes", "no" }; 
      int foo=JOptionPane.showOptionDialog(null, 
               message, 
               "Warning", 
               JOptionPane.DEFAULT_OPTION, 
               JOptionPane.WARNING_MESSAGE, 
               null, options, options[0]); 
      return foo==0; 
     } 

     // If password is not given before the invocation of Session#connect(), 
     // implement also following methods, 
     // * UserInfo#getPassword(), 
     // * UserInfo#promptPassword(String message) and 
     // * UIKeyboardInteractive#promptKeyboardInteractive() 

     }; 

     session.setUserInfo(ui); 

     // It must not be recommended, but if you want to skip host-key check, 
     // invoke following, 
     // session.setConfig("StrictHostKeyChecking", "no"); 

     //session.connect(); 
     session.connect(30000); // making a connection with timeout. 

     Channel channel=session.openChannel("shell"); 

     // Enable agent-forwarding. 
     //((ChannelShell)channel).setAgentForwarding(true); 

     channel.setInputStream(System.in); 
     /* 
     // a hack for MS-DOS prompt on Windows. 
     channel.setInputStream(new FilterInputStream(System.in){ 
      public int read(byte[] b, int off, int len)throws IOException{ 
      return in.read(b, off, (len>1024?1024:len)); 
      } 
     }); 
     */ 

     channel.setOutputStream(System.out); 

     /* 
     // Choose the pty-type "vt102". 
     ((ChannelShell)channel).setPtyType("vt102"); 
     */ 

     /* 
     // Set environment variable "LANG" as "ja_JP.eucJP". 
     ((ChannelShell)channel).setEnv("LANG", "ja_JP.eucJP"); 
     */ 

     //channel.connect(); 
     channel.connect(3*1000); 
    } 
    catch(Exception e){ 
     System.out.println(e); 
    } 
    } 

    public static abstract class MyUserInfo 
          implements UserInfo, UIKeyboardInteractive{ 
    public String getPassword(){ return null; } 
    public boolean promptYesNo(String str){ return false; } 
    public String getPassphrase(){ return null; } 
    public boolean promptPassphrase(String message){ return false; } 
    public boolean promptPassword(String message){ return false; } 
    public void showMessage(String message){ } 
    public String[] promptKeyboardInteractive(String destination, 
               String name, 
               String instruction, 
               String[] prompt, 
               boolean[] echo){ 
     return null; 
    } 
    } 
}