目标:通过一个连接和多个会话或一个持久会话远程控制 ssh 服务器。
问题 1:我目前使用 sshj 通过 SSH 进行一些远程控制,它运行良好,但我似乎无法让它正确处理提示。 (主机不提供真正的root权限,只提供sudo -i,所以我需要先登录)。
问题 2:我下载了 ExpectJ 来处理提示,但我无法在登录并以 root 身份进行身份验证后弄清楚如何维护会话。
目前的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:ssh可以用来“期待”密码提示吗?我找不到任何暗示此类控制的文档。
问题2:如何修改上面的Expect代码来维持一个可以多次调用的持久连接?我希望在达到 root 身份验证状态后能够继续交互,但一旦发送初始命令,Spawn 总是会关闭。
问题1:ssh可以用来“期待”密码提示吗?我找不到任何暗示此类控制的文档。
sshj 提供的主要是 shell 或命令的 I/O 流的句柄,以及获取退出状态等信息的方法。
问题2:如何修改上面的Expect代码来维持一个可以多次调用的持久连接?我希望在达到 root 身份验证状态后能够继续交互,但一旦发送初始命令,Spawn 总是会关闭。
支持多路复用会话,甚至支持单个 SSH 连接上的并发会话。但请注意,一个 shell/命令/子系统只能有一个会话。
您使用哪种类型的会话,即Session.Shell(通过session.startShell)或Session.Command(通过session.exec)?在后一种情况下,一旦执行完命令,会话就会meant to关闭,这是预期的行为。
通常不会推荐使用 Shell 而不是 Command,但由于您配备了 ExpectJ,我猜它可以处理提示等,您可能会想走这条路。如果存在字符回显等问题,请使用 PTY 选项(而不是 session.allocateDefaultPTY 调用 session.allocatePTY ,它需要一大堆参数,请查看allocateDefaultPTY 的来源).
代码示例:Shell, Command
另外,如果您将问题范围缩小到 sshj 的错误,请在问题跟踪器上报告它:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)