我知道这有点具体,我需要通过将问题分成子问题来找到答案。但我想知道做同样事情的最佳方法。
我有一个 linux 服务器,我有自己的登录名。linux服务器上存储了一些TCL脚本。我想编写一个我将从我的 Windows 机器调用的 java 程序,一旦我提供我的登录名、密码和主机名,它应该连接到 linux 服务器,并且应该从存储脚本的目录中执行脚本。
我尝试的是(在网上找到)如下。这样,连接和执行诸如“ls”之类的简单命令需要花费大量时间。此外,为了运行脚本,我需要设置一些我能够设置的环境变量,但即使在我授予脚本执行权限后我也无法执行脚本。
static String executeCommand(Session session, String command)
throws Exception {
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(command);
channel.setInputStream(null);
channel.setErrStream(System.err);
channel.connect();
InputStream in = channel.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
sb.append(line + '\n');
}
channel.disconnect();
return sb.toString();
}
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
try {
JSch jsch = new JSch();
System.out.println("Logging in");
Session session = jsch.getSession("login name", "host name", port);
session.setPassword("password");
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
System.out.println("Logged in");
System.out.println("==>" + executeCommand(session, "ls"));
//System.out.println("==>" + executeCommand(session, "./first"));
Thread.sleep(60000);
session.disconnect();
System.out.println("Disconnected");
} catch (Exception e) {
e.printStackTrace();
}
}
shell脚本“first”只有下面一行
echo "First Script"
sh testscripts/assignment1.scr
如果我从 SSH 终端运行相同的脚本,我会得到所需的输出,并且 TCL 脚本运行正确。但是,如果我尝试从程序中运行它,我将无法运行它并且它会给出错误
testscripts/assignment1.scr:第 3 行:/bin/tclsh:没有这样的文件或目录 testscripts/assignment1.scr:第 3 行:exec:/bin/tclsh:无法执行:没有这样的文件或目录