Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的JSch会话没有';不执行命令_Java_Unix_Ssh_Jsch - Fatal编程技术网

Java 我的JSch会话没有';不执行命令

Java 我的JSch会话没有';不执行命令,java,unix,ssh,jsch,Java,Unix,Ssh,Jsch,我正在尝试编写一个Java代码,该代码可以通过ssh连接到Unix服务器并重置用户密码。因此,我尝试实现So中的一些代码 例如 我使用JSchChannelExec,获得重置用户密码的正确命令 当我试着运行这段代码时,它似乎没有重置用户的密码。因此,我尝试直接从Unix的shell运行该命令,该命令工作得非常好。我猜那个执行官根本不工作。我将exec改为运行一个简单的命令,如mkdir/home/fikrie/testingjsch,这证明了我的假设,因为没有创建目录 这是我的代码: p

我正在尝试编写一个Java代码,该代码可以通过ssh连接到Unix服务器并重置用户密码。因此,我尝试实现So中的一些代码

例如

我使用JSch
ChannelExec
,获得重置用户密码的正确命令

当我试着运行这段代码时,它似乎没有重置用户的密码。因此,我尝试直接从Unix的shell运行该命令,该命令工作得非常好。我猜那个执行官根本不工作。我将exec改为运行一个简单的命令,如
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);
    }
}
我到底错过了什么?会话和通道似乎处于活动状态,但它不执行命令。这是代码的日志:

Method:executeSetPassword(UnixConnector.java:230)级别:信息消息:用户名为anne
方法:executeSetPassword(UnixConnector.java:231)级别:信息消息:密码为org.identityconnectors.common.security。GuardedString@e492109
方法:executeSetPassword(UnixConnector.java:232)级别:信息消息:命令为echo-anne:org.identityconnectors.common.security。GuardedString@e492109| chpasswd
方法:executeSetPassword(UnixConnector.java:249)级别:INFO消息:sessionStatus为true
方法:executeSetPassword(UnixConnector.java:257)级别:信息消息:channelStatus为true
方法:executeSetPassword(UnixConnector.java:258)级别:信息消息:退出状态=-1
这是JSch日志:

INFO:连接到192.168.1.62端口22
信息:已建立连接
信息:远程版本字符串:SSH-2.0-OpenSSH_5.3
信息:本地版本字符串:SSH-2.0-JSCH-0.1.53
信息:校验密码:aes256 ctr、aes192 ctr、aes128 ctr、aes256 cbc、aes192 cbc、aes128 cbc、3des ctr、arcfour、arcfour128、arcfour256
信息:aes256 ctr不可用。
信息:aes192 ctr不可用。
信息:aes256 cbc不可用。
信息:aes192 cbc不可用。
信息:复选框:diffie-hellman-group14-sha1、ecdh-sha2-nistp256、ecdh-sha2-nistp384、ecdh-sha2-nistp521
信息:检查签名:ecdsa-sha2-nistp256、ecdsa-sha2-nistp384、ecdsa-sha2-nistp521
信息:SSH\u MSG\u KEXINIT已发送
信息:收到SSH_MSG_KEXINIT
信息:kex:服务器:diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
INFO:kex:server:ssh-rsa,ssh-dss
信息:kex:服务器:aes128 ctr、aes192 ctr、aes256 ctr、arcfour256、arcfour128、aes128 cbc、3des cbc、河豚cbc、cast128 cbc、aes192 cbc、aes256 cbc、arcfour、rijndael-cbc@lysator.liu.se
信息:kex:服务器:aes128 ctr、aes192 ctr、aes256 ctr、arcfour256、arcfour128、aes128 cbc、3des cbc、河豚cbc、cast128 cbc、aes192 cbc、aes256 cbc、arcfour、rijndael-cbc@lysator.liu.se
信息:kex:服务器:hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
信息:kex:服务器:hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
信息:kex:服务器:无,zlib@openssh.com
信息:kex:服务器:无,zlib@openssh.com
信息:kex:服务器:
信息:kex:服务器:
信息:kex:客户:ecdh-sha2-nistp256、ecdh-sha2-nistp384、ecdh-sha2-nistp521、diffie-hellman-group14-sha1、diffie-hellman-group-exchange-sha256、diffie-hellman-group-exchange-sha1、diffie-hellman-group1-sha1
信息:kex:客户端:ssh rsa、ssh dss、ecdsa-sha2-nistp256、ecdsa-sha2-nistp384、ecdsa-sha2-nistp521
信息:kex:客户:aes128中心、aes128 cbc、3des中心、3des cbc、河豚cbc
信息:kex:客户:aes128中心、aes128 cbc、3des中心、3des cbc、河豚cbc
信息:kex:客户:hmac-md5、hmac-sha1、hmac-sha2-256、hmac-sha1-96、hmac-md5-96
信息:kex:客户:hmac-md5、hmac-sha1、hmac-sha2-256、hmac-sha1-96、hmac-md5-96
信息:kex:客户:无
信息:kex:客户:无
信息:kex:客户:
信息:kex:客户:
信息:kex:服务器->客户端aes128 ctr hmac-md5无
信息:kex:客户端->服务器aes128 ctr hmac-md5无
信息:SSH\u MSG\u KEXDH\u INIT已发送
信息:期待SSH\u MSG\u KEXDH\u回复
信息:ssh\u rsa\u验证:签名为真
警告:已将“192.168.1.62”(RSA)永久添加到已知主机列表中。
信息:SSH\u MSG\u已发送新密钥
信息:收到SSH\u MSG\u新密钥
信息:SSH\u消息\u服务\u请求已发送
信息:SSH\u消息\u服务\u接收
信息:可以继续的身份验证:带麦克风的gssapi、公钥、键盘交互、密码
信息:下一个身份验证方法:带麦克风的gssapi
信息:可以继续的身份验证:公钥、键盘交互、密码
信息:下一个身份验证方法:公钥
信息:可以继续的身份验证:密码
信息:下一个身份验证方法:密码
信息:身份验证成功(密码)。
信息:从192.168.1.62端口22断开连接
信息:捕获到异常,由于套接字关闭而离开主循环

我假设问题是您在命令启动之前就关闭了连接

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

或者像其他示例一样使用命令输出。或者(如果您对输出不感兴趣)等到
channel.isClosed()
为true后退出