通过java | Jcraft-Jsch运行多个unix命令

通过java | Jcraft-Jsch运行多个unix命令,java,session,unix,putty,jsch,Java,Session,Unix,Putty,Jsch,我正在尝试通过Java运行一系列unix命令。基本上,无论我在Putty上做什么,我都想在java程序上做 我写了2节课 连接到服务器并执行Unix命令 将unix命令发送到列表中的Class1 如果Class2列表中只有1个值,我就能够连接到服务器并执行。但是,当列表中存在多个值时,代码只执行最新的命令(列表中的值),并跳过所有其他值 我想执行Class2列表中的每个值(unix命令)。请帮忙。 我正在使用JCraft的JSch类 Class1 package package1; impor

我正在尝试通过Java运行一系列unix命令。基本上,无论我在Putty上做什么,我都想在java程序上做

我写了2节课

  • 连接到服务器并执行Unix命令
  • 将unix命令发送到列表中的Class1
  • 如果Class2列表中只有1个值,我就能够连接到服务器并执行。但是,当列表中存在多个值时,代码只执行最新的命令(列表中的值),并跳过所有其他值

    我想执行Class2列表中的每个值(unix命令)。请帮忙。 我正在使用JCraft的JSch类

    Class1

    package package1;
    
    import java.io.InputStream;
    import java.util.List;
    
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    
    
    public class ConnExec 
    {
        static InputStream in;
        static byte[] tmp;
        static int flag = 0;
        public void connExec(List<String> commandLst)
        {
            String host="serverName.host.dev";
            String user="UserName";
            String password="PWD";
    
            try
            {
                java.util.Properties config = new java.util.Properties(); 
                config.put("StrictHostKeyChecking", "no");
                JSch jsch = new JSch();
                Session session=jsch.getSession(user, host, 22);
                session.setPassword(password);
                session.setConfig(config);
                session.connect();
                System.out.println("Connected to the server.....\n");
    
                Channel channel=session.openChannel("exec");
                channel.setInputStream(null);
    
                for (int x = 0; x < commandLst.size();x++)
                {
                    ((ChannelExec)channel).setCommand(commandLst.get(x));
    
                    in=channel.getInputStream();
                    channel.connect();
                    tmp=new byte[1024];
    
                    while(true)
                    {
                        while(in.available()>0)
                        {
                            int i=in.read(tmp, 0, 1024);
                            if(i<0)break;
                            System.out.print(new String(tmp, 0, i));
                            System.out.println("\nExecuted.....");
                        }
    
                        if(channel.isClosed())
                        {
                            break;
                        }
                   }
                }
    
                channel.disconnect();
                session.disconnect();
                System.out.println("Terminated.....\n");
                flag = 1;
            }
            catch(Exception e)
            {
                e.printStackTrace();
                flag = 1;
            }
    
        }
    
    }
    
    package1;
    导入java.io.InputStream;
    导入java.util.List;
    导入com.jcraft.jsch.Channel;
    导入com.jcraft.jsch.ChannelExec;
    导入com.jcraft.jsch.jsch;
    导入com.jcraft.jsch.Session;
    公共类ConnExec
    {
    静态输入流;
    静态字节[]tmp;
    静态int标志=0;
    public void connExec(List commandLst)
    {
    String host=“serverName.host.dev”;
    字符串user=“UserName”;
    字符串密码=“PWD”;
    尝试
    {
    java.util.Properties config=new java.util.Properties();
    配置放置(“检查”、“否”);
    JSch JSch=新的JSch();
    Session Session=jsch.getSession(用户,主机,22);
    session.setPassword(密码);
    session.setConfig(config);
    session.connect();
    System.out.println(“已连接到服务器…\n”);
    Channel=session.openChannel(“exec”);
    channel.setInputStream(空);
    对于(int x=0;x0)
    {
    inti=in.read(tmp,0,1024);
    
    如果(iAt Class2,我现在为每个unix命令创建一个新的实例变量。 它工作得很好

    for(String cmd:lst)
    {
        new ConnExec().connExec(cmd);
    }
    

    如果您计划一个接一个地运行命令,您可以在多个命令上使用“&&&”和openChannel(“shell”)而不是exec。然后,在前一个命令完成后,每个命令都将工作

    Channel channel=session.openChannel("shell");
    OutputStream ops = channel.getOutputStream();
    PrintStream ps = new PrintStream(ops, true);
    
    channel.connect();
    ps.println("cd /abc/def" + "&&" + "ls -lrt");
    

    正如前面所说,您必须在自己的“exec”通道中执行每个命令。因此只需移动
    通道=session.openChannel(“exec”);通道.setInputStream(null);
    通道.disconnect();
    for
    循环。@MartinPrikryl尝试过-不起作用。我得到了与上面代码相同的结果。不过,我现在为每个unix命令创建了一个新的实例变量,并得到了所需的结果。不过,感谢您的帮助:)实际上,
    &&
    对于exec通道很有用。对于shell通道,您可以简单地使用多个
    println
    调用发送命令。
    Channel channel=session.openChannel("shell");
    OutputStream ops = channel.getOutputStream();
    PrintStream ps = new PrintStream(ops, true);
    
    channel.connect();
    ps.println("cd /abc/def" + "&&" + "ls -lrt");