我正在尝试运行一个程序,该程序使用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程序。请让我知道我错过了什么或者是否有可能实现它。
提前致谢。 诺尔
答案 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();