使用java执行unix命令

时间:2013-01-26 11:29:55

标签: java unix

您好我需要从java执行vi命令并需要存储到本地文件中。我正在使用jcraft.jsch

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class ViDAO {

    public boolean mergeLogs(String hostName, String logFile, String userName,
            String password) {
        System.out.println("in VIdao" + hostName);
        String command = null;
        final int MAXREAD = 131072 * 100;

        try {

            command = "cd /dr/logs/sonic/dmbain1;view " + logFile;
            JSch jsch = new JSch();
            Session session = jsch.getSession(userName, hostName, 22);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.setPassword("Janu$113");

            session.connect();
            /* System.out.println("Connected to******* " + host+"*********");*/
            Channel channel = session.openChannel("exec");
            ((ChannelExec) channel).setCommand(command);

            channel.setXForwarding(true);
            channel.connect();


            InputStream in = channel.getInputStream();

            byte[] tmp = new byte[MAXREAD];
            File dir = new File("C:\\Documents and Settings\\" + 
                        System.getProperty("user.name") + 
                        "\\Desktop\\LogFiles");
            dir.mkdir();

            File f;
              f=new File("C:\\Documents and Settings\\" + 
                           System.getProperty("user.name") +
                           "\\Desktop\\LogFiles\\" +
                           logFile + ".txt");

              if(!f.exists()){

              f.createNewFile();
              }

              BufferedWriter out = new BufferedWriter(new FileWriter(f));



            while (true) {
                while (in.available() > 0) {

                    int i = in.read(tmp, 0, MAXREAD);

                    if (i < 0)
                        break;
                    String strResult = new String(tmp, 0, i);

                    out.write(strResult+"\n");
                    System.out.println(strResult);

                }
                if (channel.isClosed()) {
                    in.close();

                    break;
                }

            }

            System.out.println("completed");

            channel.disconnect();
            session.disconnect();
            out.close();


        } catch (Exception e) {
            e.printStackTrace();
        }

return true;
    }

    public static void main(String[] args) {

    }
}

在这里,我无法只阅读一些代码行,我能够阅读请帮忙。 当我使用tail命令而不是vi工作但处理很长时间。如果我使用vi命令只有一些线能够打印。

请帮忙...

1 个答案:

答案 0 :(得分:1)

view通常别名为vi,这需要实际的终端或终端仿真器控制台才能工作,因为它在原始模式下使用终端。

当面对非终端输出时,vi将打印一个警告,然后开始喷出与控制字符混合的第一个“screenfull”文件内容 - 对于大多数自动处理用途,该输出几乎无用。 / p>

如果您想要读取远程文件的内容,您应该使用cat而不是vi