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

时间:2016-10-20 12:16:48

标签: java session unix putty jsch

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

我写了两个课程。

  1. 连接服务器并执行Unix命令。
  2. 将unix命令发送到列表中的Class1。
  3. 如果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;
            }
    
        }
    
    }
    

    的Class2

    package package1;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ReadCommands 
    {
    
    
        public static void main(String a[])
        {
            List<String> lst = new ArrayList<String>();
    
            String command1="ls /local/dev/source/folder";
            String command2="ls /local/dev/source/folder/inbound";
    
            lst.add(command1);
            lst.add(command2);
    
            ConnExec ce = new ConnExec();
            ce.connExec(lst);
        }
    
    }
    

2 个答案:

答案 0 :(得分:0)

如果您打算逐个运行命令,可以使用“&amp;&amp;”使用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");

答案 1 :(得分:-1)

在Class2中,我现在为每个unix命令创建一个新的实例变量。 效果很好。

1.0