gpt4 book ai didi

Java 和 SSH : maintaining a connection

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:43 25 4
gpt4 key购买 nike

目标:通过一个连接和多个 session 或一个持久 session 远程控制 ssh 服务器。

问题 1:我目前使用 sshj 通过 SSH 进行一些远程控制,它运行良好,但我似乎无法让它正确处理提示。 (主机不提供真正的root权限,只提供sudo -i,所以我需要先登录)。问题 2:我下载了 ExpectJ 来处理提示,但我无法弄清楚如何在登录并通过 root 身份验证后维持 session 。

当前的 Hack 解决方案要求我每次都重新登录:

public class Expect {
Spawn shell;
ExpectJ exp;
String host;
int port;
String username;
String passwd;
boolean sudo = false;
public Expect(String host,int port,String username,String passwd) throws IOException, TimeoutException, ExpectJException{

exp = new ExpectJ(5);
this.host = host;
this.port = port;
this.username = username;
this.passwd = passwd;
shell = exp.spawn(host, port, username, passwd);
shell.send("sudo netstat -natvp | grep Xtightvnc\n");
System.out.println(shell.getCurrentStandardOutContents());
try{
shell.expect("[sudo] password for #######:");
shell.send(passwd+"\n");
}
catch (IOException ex){
String err = ex.toString();
if(!err.equals("java.io.IOException: End of stream reached, no match found")){
throw new IOException(ex);
}
}
}

问题1:sshj可以用来“期待”密码提示吗?我找不到任何暗示此类控制的文档。

问题 2:如何修改上述 Expect 代码以维持可以多次调用的持久连接?我希望在达到 root 身份验证状态后能够继续交互,但一旦发送初始命令,Spawn 总是会关闭。

最佳答案

Question 1: can sshj be used to "expect" password prompts? I couldnt find any documentation alluding to that type of control.

sshj 提供的主要是 shell 或命令的 I/O 流的句柄,以及获取退出状态等信息的方法。

Quetsion 2: How can I modify the above Expect code to maintain a persistent connection that I can make multiple calls to? I want to be able to continue to interact once I have reached the state of authenticating as root but the Spawn always closes once the initial command has been sent.

支持多路复用 session ,甚至支持通过单个 SSH 连接的并发 session 。但请注意,一个 shell/命令/子系统只能有一个 session 。

您使用哪种类型的 session ,即Session.Shell(通过session.startShell)或Session.Command(通过session.exec)?在后一种情况下,一旦执行完命令, session 就会关闭,这是预期的行为。

通常不会推荐使用 Shell 而不是 Command,但由于您配备了 ExpectJ,我猜它可以处理提示等,因此您可能会想走这条路。如果存在字符回显等问题,请使用 PTY 选项(而不是 session.allocateDefaultPTY 调用 session.allocatePTY ,它需要一大堆参数,请查看 source for allocateDefaultPTY )。

代码示例:Shell , Command

此外,如果您将问题范围缩小到 sshj 的错误,请在问题跟踪器上报告它:)

关于Java 和 SSH : maintaining a connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3395754/

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