使用不同的解释器执行shell脚本

时间:2015-07-21 19:27:57

标签: java python jsch

我正在尝试使用JSch执行python脚本,我想要的是使用不同的解释器(shebang)从 .sh 文件运行python脚本。

以下是我的shell脚本文件( fileExec.sh )的内容:

#!/usr/bin/env python
print 'hello from python'

看起来自从我得到了shebang后不能改变:

  

bash:找不到打印命令

这是我的Java代码:

session = newSessionFor(user, host, port);
Channel channel = session.openChannel("exec");

File shFile = new File("fileExec.py");
FileWriter writer = new FileWriter(shFile);
writer.write(shebang + "\n");
writer.write(command);
writer.close();

PrintWriter printWriter = new PrintWriter(shFile);
printWriter.println(shebang);
printWriter.println(command);
printWriter.close();

((ChannelExec) channel).setCommand(FileUtils.readFileToByteArray(shFile));

3 个答案:

答案 0 :(得分:1)

shebang仅在执行文件时由操作系统使用。

您没有执行文件,基本上是将python文件的内容复制粘贴到shell提示符上。

如果您不想在服务器上存储和执行文件,则可以使用python -c yourcommand从shell运行Python命令。以下是终端的外观,请随时尝试:

user@host ~$ python -c 'print "hello world"'
hello world

要在程序中执行此操作,请添加一个方法来转义shell中的任意字符串:

static String escapeForShell(String s) {
  return "'" + s.replaceAll("'", "'\\\\''") + "'";
}

然后运行

((ChannelExec) channel).setCommand("python -c " + escapeForShell(command));

其中String command = "print 'hello from python'";

答案 1 :(得分:0)

我对Java不太满意,但可能在检查hashbang之前检查文件扩展名。您应该将文件更改为ToCharArray以确保,或仅fileExec.py

(您似乎也在java代码中调用了错误的文件?)

答案 2 :(得分:0)

文件扩展名不应该相关,但为了保持一致性,通常不会调用python脚本fileExec.sh

如果从命令行测试fileExec.sh,假设你设置了执行权限,它应该可以工作:

$ chmod +x fileExec.sh
$ ./fileExec.sh
hello from python

但是,没有必要依赖shebang和更改文件权限,只需执行:

$ python fileExec.sh

从命令行和你的java程序

((ChannelExec)channel).setCommand("/usr/bin/python /path/to/fileExec.sh");