【发布时间】:2018-04-10 09:10:24
【问题描述】:
我正在尝试运行 shell 脚本 (/sasdata/sasconfig/Lev1/Applications/SASEnterpriseGRCAdminTools/6.1/dbscripts/addxlsdata.sh -t /sasdata/Data/Loaders/IFT_tst_loader2.xls) 在带有java的远程服务器上,使用jcraft,但在回答我有退出状态127。我尝试用我的方法运行简单的命令“date” - 一切都很好。然后我尝试通过在终端中输入命令来运行这个脚本,一切都很好。我也尝试使用 addxlsdata.sh 执行“cd”到路径并运行 ./addxlsdata.sh -t /sasdata/Data/Loaders/IFT_tst_loader2.xls 再次出现 127 退出状态。 这可能是什么问题?
这是我的方法:
public static void executeShell(String shellScriptCommand, String userName, String password, String server) {
List<String> result = new ArrayList<String>();
try {
LOG.info("Creating session, user: " + userName);
JSch jSch = new JSch();
Session session = jSch.getSession(userName, server, sshPort);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(password);
session.connect();
LOG.info("Opening exec channel");
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
LOG.info("Creating InputStream");
InputStream in = channelExec.getInputStream();
channelExec.setCommand("sh " + shellScriptCommand);
LOG.info("Executing the shell script: " + shellScriptCommand);
channelExec.connect();
LOG.info("Reading the output from the input stream");
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
CommonFunctions.freeze(3);
while (reader.ready()) {
String line = reader.readLine();
result.add(line);
}
reader.close();
LOG.info("OUTPUT is " + result);
LOG.info("Getting exit status");
int exitStatus = channelExec.getExitStatus();
LOG.info("Exit status is [" + exitStatus + "]");
channelExec.disconnect();
session.disconnect();
} catch (JSchException | IOException e) {
LOG.error(Arrays.toString(e.getStackTrace()));
throw new AutotestError("Ошибка при выпонении shell скрипта", e);
}
}
我发现一件事。这个 *.sh 文件在“./runjava.sh”中有另一个脚本。也许这就是问题
连接错误的服务器似乎是我的错。尽管我在 java 和 winscp 中使用相同的地址,但当我在目录中使用 ls 与 java 和终端中的脚本时,我有不同的结果
我想我已经找到了问题所在。当我在java中执行“cd /”然后执行“pwd”时,输出是“/home/username”。我无法从主目录退出到 java 中的根目录。在终端中,我可以对同一个用户执行此操作
【问题讨论】: