0

こんにちは、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) {

    }
}

ここでは、コードの一部の行のみをファイルを読み取ることができません。これについて助けてください。viの代わりにtailコマンドを使用すると、動作しますが処理に時間がかかります.viコマンドを使用すると、一部の行しか印刷できません。

これについて助けてください...

4

1 に答える 1

1

viewvi端末を raw モードで使用するため、通常、実際の端末または端末エミュレータ コンソールが必要なエイリアスが付けられます。

非端末出力に直面するとvi、警告を出力し、制御文字が混在するファイル コンテンツの最初の「画面全体」を吐き出し始めます。ほとんどの自動処理では、この出力はほとんど役に立ちません。

リモートファイルの内容を読み込みたい場合は、おそらくcatの代わりに使用する必要がありviます。

于 2013-01-26T12:31:24.557 に答える