我正在尝试使用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));
答案 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");