目标:通过一个连接和多个会话或一个持久会话远程控制ssh服务器。
问题1:我目前使用sshj通过SSH进行一些远程控制,它工作得很好,但我似乎不能让它正确地处理提示。(主机不提供真正的根目录,只提供sudo -i,所以我需要先登录)。问题2:我下载了ExpectJ来处理提示符,但在我登录并以根用户身份进行身份验证后,我无法弄清楚如何维护会话。
当前的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身份进行身份验证的状态后能够继续交互,但是一旦发送了初始命令,派生进程就会始终关闭。
发布于 2010-08-12 19:32:03
问题1: sshj可以用于“期望”密码提示吗?我找不到任何提到这类控件的文档。
sshj提供的主要是shell或命令的I/O流上的句柄,以及获取退出状态等内容的方法。
Quetsion2:我如何修改上面的Expect代码来维护一个我可以进行多次调用的持久连接?我希望在达到以root身份进行身份验证的状态后能够继续交互,但是一旦发送了初始命令,派生进程就会始终关闭。
支持多路复用会话,甚至支持单个SSH连接上的并发会话。但请注意,一个shell/命令/子系统只能有一个会话。
您使用哪种类型的会话,即Session.Shell (通过session.startShell)还是Session.Command (通过session.exec)?在后一种情况下,一旦执行完命令,会话就会关闭,这是预期的行为。
通常不会推荐Shell over Command,但既然你配备了ExpectJ,我猜它可以处理提示之类的事情,你可能会想走那条路。如果出现字符回显之类的问题,可以使用PTY选项(而不是使用一大堆参数的session.allocateDefaultPTY调用session.allocatePTY,看看source for allocateDefaultPTY)。
代码示例:Shell、Command
此外,如果您使用sshj将问题缩小为bug,请务必在问题跟踪器上报告它:)
https://stackoverflow.com/questions/3395754
复制相似问题