如何使用java从unix中的windows运行bash程序

时间:2016-01-27 20:08:04

标签: java linux windows

我正在尝试运行一个程序,该程序使用Unix中的jcraft库从窗口处理文件。我在建立频道后发现它总是尝试在主目录中运行该程序,但我需要在一个单独的目录中运行。请看看我到目前为止尝试了什么,让我知道我错过了什么。

String strRemoteDir =“/ home / process / input” channel = session.openChannel(“sftp”);

    channel.connect();
    System.out.println("sftp channel opened and connected.");
    channelSftp = (ChannelSftp) channel;
    // Printing Home Directory in Unix Server
    System.out.println(channelSftp.getHome());
    channelSftp.cd(strRemoteDir);
   System.out.println(channelSftp.pwd());

  // for uploading a file where i need to run the program
    File f = new File(fileName);
    channelSftp.put(new FileInputStream(f), f.getName());
    System.out.println("File transfered successfully to host.");
    fileTransfer = true;

    channel=session.openChannel("exec");
    InputStream in=channel.getInputStream();
    // it is printing the desired directory where i want to go
    System.out.println(channelSftp.pwd());
    ((ChannelExec)channel).setCommand("sh process.ksh "a.txt");
    channel.setInputStream(null);
    ((ChannelExec)channel).setErrStream(System.err);
     channel.connect();

输出:找不到process.ksh

但是通过腻子,我能够运行该程序。只是为了让你知道process.ksh不在输入目录中,但是能够从带参数的任何地方运行。 ((ChannelExec)信道).setcommand( “LS”) 打印出主目录中的所有文件。我相信我正在建立一个到主目录的频道,我只是不知道如何在一个理想的位置使用jcraft运行bash程序。请让我知道我错过了什么或者是否有可能实现它。

提前致谢。 诺尔

2 个答案:

答案 0 :(得分:1)

其他人提供了如何设置工作目录的示例。然而,更具防御性的编程风格是不承担任何责任并明确指定所有内容。因此,为了指定要执行的命令,例如:

/bin/sh /path/to/bin/process.ksh /path/to/data/ "a.txt"

请注意,我已经为您的命令添加了新的第一个参数,即您要从中运行它的目录。

现在,在继续之前,更改脚本以使其更改为此目录(以参数$ 1给出)。

这可以通过在开头添加cd来完成,例如:

cd $1
shift

shift命令会移动所有其他参数,因此$ 2变为$ 1,依此类推,以便脚本的其余部分找到它所期望的参数。

答案 1 :(得分:1)

" SFTP" channel不能执行shell命令,只能执行sftp命令。

    Channel channel = session.openChannel("shell");
    cmdSend = channel.getOutputStream();
    InputStream cmdRcv = channel.getInputStream();
    // Start a Thread reading and displaying cmdRcv

    channel.connect(3000);
    Thread.sleep(1000);

    cmdSend.write("cd /to/the/right/dir\n".getBytes());
    cmdSend.flush();
    cmdSend.write("sh process.ksh \"a.txt\"\n".getBytes());
    cmdSend.flush();