我试图运行一个程序,在Unix中使用jcraft库处理文件。 我在build立频道后发现它总是试图运行在主目录中的程序,但我需要运行在一个单独的目录。请看看我到目前为止,并让我知道我失踪。
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未find
但通过腻子,我能够运行该程序。 只是为了让你知道process.ksh不在input目录中,但有能力从任何地方运行参数。 ((ChannelExec)频道).setcommand(“ls”)输出主目录中的所有文件。 我相信我正在build立一个通道到主目录,我只是不知道如何使用jcraft在所需的位置运行bash程序。请让我知道我失踪或是否有可能使其发生。
提前致谢。 努尔
“sftp”通道不是用来执行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();
其他人提供了如何设置工作目录的例子。 然而,更具防御性的编程风格是不承担任何责任,并明确规定一切。 所以为了指定要执行的命令,像这样:
/bin/sh /path/to/bin/process.ksh /path/to/data/ "a.txt"
注意,我已经添加了一个新的第一个参数给你的命令,你想从中运行它的目录。
现在,在继续之前,改变你的脚本,使它改变到这个目录(作为参数$ 1给出)。
这可以通过在开始时添加cd完成,如下所示:
cd $1 shift
shift命令移动所有其他的参数,所以$ 2变成$ 1等等,这样脚本的其余部分将会找到它所期望的参数。