我的JSch会话不执行命令

时间:2015-06-11 07:14:23

标签: java unix jsch

我正在尝试编写一个可以ssh到Unix服务器并重置用户密码的Java代码。所以我试着实现SO中的一些代码。

例如

使用JSch gettimeofday(),我跟着this link获取了重置用户密码的正确命令。

当我尝试运行此代码时,似乎它没有重置用户的密码。所以我尝试直接从Unix的shell运行命令,命令工作正常。我认为执行官根本不起作用。我更改了exec以运行一个简单的命令,如ChannelExec,然后证明我的假设,看到该目录未创建。

这是我的代码:

mkdir /home/fikrie/testingjsch

实际上我错过了什么?会话和通道似乎仍然存在,但它不执行命令。这是代码的日志:

public void executeSetPassword(final String userName, final GuardedString password)  {
    JSch jsch = new JSch();
    String host = configuration.getHost();
    String remoteUser = configuration.getRemoteUser();
    GuardedString passwd = configuration.getPassword();
    String command = "echo " + userName + ":" + password + " | chpasswd";
    Boolean sessionStatus, channelStatus;

    logger.info("userName is " + userName);
    logger.info("password is " + password);
    logger.info("command is " + command);

    final Session session;
    try {
        session = jsch.getSession(remoteUser, host, 22);

        passwd.access(new Accessor(){
            @Override
            public void access(char[] clearChars) {
                session.setPassword(new String(clearChars));
            }});
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();

        sessionStatus = session.isConnected();
        logger.info("sessionStatus is " + sessionStatus);
        ChannelExec channel=(ChannelExec) session.openChannel("exec");
        channel.setCommand(command);

        channel.connect();
        channelStatus = channel.isConnected();

        logger.info("channelStatus is " + channelStatus);
        logger.info("Exit status = " + channel.getExitStatus());

        channel.disconnect();
        session.disconnect();
    }
    catch (Exception e) {
        throw new RuntimeException(e);
    }
}

这是JSch日志:

Method: executeSetPassword(UnixConnector.java:230)  Level: INFO Message: userName is anne
Method: executeSetPassword(UnixConnector.java:231)  Level: INFO Message: password is org.identityconnectors.common.security.GuardedString@e492109
Method: executeSetPassword(UnixConnector.java:232)  Level: INFO Message: command is echo anne:org.identityconnectors.common.security.GuardedString@e492109 | chpasswd
Method: executeSetPassword(UnixConnector.java:249)  Level: INFO Message: sessionStatus is true
Method: executeSetPassword(UnixConnector.java:257)  Level: INFO Message: channelStatus is true
Method: executeSetPassword(UnixConnector.java:258)  Level: INFO Message: Exit status = -1

1 个答案:

答案 0 :(得分:2)

我认为问题是在命令启动之前关闭了连接。

您指向的所有示例都会读取命令输出,直到结束(因此直到命令完成)。您没有读取输出,因此您无法等待命令完成。

使用命令输出,如其他示例所示。或者(如果您对输出不感兴趣)请等到channel.isClosed()为真,然后退出。