我正在尝试从我的java GUI应用程序执行SH脚本。我正在使用jsch连接到机器。
我可以执行“ls
”或“pwd
”等命令。当我尝试执行我的SH时,我只从它获得所有输出,如果我直接在机器中执行它需要几次(这是预期的)并且工作正常。
脚本以
开头“#!/斌/庆典”
并且调用它的代码是:
String command= "cd /opt/app/ordersync/scripts/RE-INJEC;sh ./proc_reinjec.sh"; // enter any command you need to execute
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
in = channel.getInputStream();
channel.connect();
当我执行它时
我没有设置TERM环境变量
我无法弄清楚问题是什么。我在php中使用shell_exec
尝试了同样的问题(结果)是一样的。
答案 0 :(得分:0)
这只是一个猜测。因此,请考虑主要作为(长)评论。但是你假设你的"命令"实际上将由中间 shell 解析,甚至可能负责设置适当的环境。但是,ChannelExec
真的启动了一个shell吗?或者它直接执行命令?
无论如何,请尝试:
String command= "sh -l -c 'cd /opt/app/ordersync/scripts/RE-INJEC;sh ./proc_reinjec.sh'";
// ^^^^^^^^^^ ^
// explicit sub-shell don't forget the closing quote >-->-->----/
// '-l' is for login shell: reads /etc/profile, ... at startup
// I don't know if this is required here
但实际上你可能正在寻找ChannelShell而已?
来自RFC 4254, section 6.5. Starting a Shell or a Command:
6.5。启动Shell或命令
一旦设置了会话,就会启动一个程序 远程端。该程序可以是shell,应用程序或 具有独立于主机的名称的子系统。只有其中一个 请求可以在每个频道成功。
byte SSH_MSG_CHANNEL_REQUEST uint32 recipient channel string "shell" boolean want reply
此消息将请求用户的默认shell (通常是 在UNIX系统中的/ etc / passwd中定义)在另一端启动。
byte SSH_MSG_CHANNEL_REQUEST uint32 recipient channel string **"exec"** boolean want reply string command
此消息将请求服务器启动执行 给定的命令。 '命令'字符串可能包含路径。 必须采取正常的预防措施以防止执行 未经授权的命令。