gpt4 book ai didi

java - 如何使用 JSch 运行并显示 shell 命令 ssh 的结果?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:07 25 4
gpt4 key购买 nike

我尝试使用库 JSch - Java Secure Channel 在我的 Android 应用程序中建立 ssh 连接,它有效。

现在我想执行一个命令并检索结果。

我尝试了几种方法,效果最好的是这个。但是,此方法仅部分有效,因为某些我无法解释的原因,我的程序在我的 while 循环结束时停止,但我是出现在我的日志中的命令的结果。

这是我的代码:

public static String executeRemoteCommand(String username, String password, String hostname, int port) throws Exception {     
JSch jsch = new JSch();
Session session = jsch.getSession(username, hostname, port);
session.setPassword(password);

// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);

session.connect();

Channel channel = session.openChannel("shell");
channel.connect();

DataInputStream dataIn = new DataInputStream(channel.getInputStream());
DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream());

// send ls command to the server
dataOut.writeBytes("ls\r\n");
dataOut.flush();

// and print the response
String line = dataIn.readLine();
String result = line + "\n";

while ((line = dataIn.readLine()) != null) {
result += line + "\n";
Log.i("TAG", "Line: "+line);
}

dataIn.close();
dataOut.close();
channel.disconnect();
session.disconnect();

return result;
}

有没有其他人有更好的方法来使用 JSch 运行命令面板?

提前致谢!

最佳答案

您的方法在循环中停止(而不是结束它),因为远程 shell 没有关闭输出流。它没有理由这样做,因为您可以在那里发送更多命令。

如果您只想执行单个命令(或之前已知的一系列命令),则不应使用 Shell channel ,而应使用“exec” channel 。

这样,远程 shell(执行您的命令)将在您的命令完成时完成,然后服务器将关闭流。所以您的循环将结束,然后您可以关闭流。

如果您认为您需要一个 shell channel (例如,如果您需要在同一上下文中启动多个命令,并在决定下一个命令之前对一个命令的输出使用react),您将需要一些方法来知道一个命令何时完成(例如通过识别提示),然后发送下一个命令。要退出,要么关闭输出流,要么发送“注销”或“退出”命令(均适用于任何标准 unix shell,其他 shell 可能需要不同的命令),然后远程站点也应关闭其他流。

顺便说一句,虽然禁用严格的主机 key 检查很方便,但它也会打开您与中间人攻击的连接,并且在密码验证的情况下,攻击者可以获取您的密码。执行此操作的正确方法是设置正确初始化的主机 key 存储库以识别远程主机的 key 。

关于java - 如何使用 JSch 运行并显示 shell 命令 ssh 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16860244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com