2015-06-11 114 views
1

我想写一个Java代码,可以ssh到Unix服务器并重置用户的密码。所以我试图实现一些在SO中找到的代码。我的JSch会话不执行命令

例如,

使用JSch ,我跟着this link得到适当的命令重置用户的密码。

当我试着运行这个代码,好像它不会重置用户的密码。所以我试着直接从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) Level: INFO Message: userName is anne 
Method: executeSetPassword(UnixConnector.java:231) Level: INFO Message: password is [email protected] 
Method: executeSetPassword(UnixConnector.java:232) Level: INFO Message: command is echo anne:[email protected] | 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 

这是JSch日志:

INFO: Connecting to 192.168.1.62 port 22 
INFO: Connection established 
INFO: Remote version string: SSH-2.0-OpenSSH_5.3 
INFO: Local version string: SSH-2.0-JSCH-0.1.53 
INFO: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256 
INFO: aes256-ctr is not available. 
INFO: aes192-ctr is not available. 
INFO: aes256-cbc is not available. 
INFO: aes192-cbc is not available. 
INFO: CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521 
INFO: CheckSignatures: ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521 
INFO: SSH_MSG_KEXINIT sent 
INFO: SSH_MSG_KEXINIT received 
INFO: kex: server: 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 
INFO: kex: server: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected] 
INFO: kex: server: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected] 
INFO: kex: server: hmac-md5,hmac-sha1,[email protected],hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96 
INFO: kex: server: hmac-md5,hmac-sha1,[email protected],hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96 
INFO: kex: server: none,[email protected] 
INFO: kex: server: none,[email protected] 
INFO: kex: server: 
INFO: kex: server: 
INFO: kex: client: 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 
INFO: kex: client: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521 
INFO: kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc 
INFO: kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc 
INFO: kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96 
INFO: kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96 
INFO: kex: client: none 
INFO: kex: client: none 
INFO: kex: client: 
INFO: kex: client: 
INFO: kex: server->client aes128-ctr hmac-md5 none 
INFO: kex: client->server aes128-ctr hmac-md5 none 
INFO: SSH_MSG_KEXDH_INIT sent 
INFO: expecting SSH_MSG_KEXDH_REPLY 
INFO: ssh_rsa_verify: signature true 
WARN: Permanently added '192.168.1.62' (RSA) to the list of known hosts. 
INFO: SSH_MSG_NEWKEYS sent 
INFO: SSH_MSG_NEWKEYS received 
INFO: SSH_MSG_SERVICE_REQUEST sent 
INFO: SSH_MSG_SERVICE_ACCEPT received 
INFO: Authentications that can continue: gssapi-with-mic,publickey,keyboard-interactive,password 
INFO: Next authentication method: gssapi-with-mic 
INFO: Authentications that can continue: publickey,keyboard-interactive,password 
INFO: Next authentication method: publickey 
INFO: Authentications that can continue: password 
INFO: Next authentication method: password 
INFO: Authentication succeeded (password). 
INFO: Disconnecting from 192.168.1.62 port 22 
INFO: Caught an exception, leaving main loop due to Socket closed 
+0

向我们展示[JSch日志](http://www.jcraft.com/jsch/examples/Logger.java.html)。 –

+0

@MartinPrikryl。我已经添加了JSch日志。这是你要求的吗? –

回答

2

我认为问题是,你关闭连接的命令甚至开始之前。

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

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