2015-06-11 4 views
1

Я пытаюсь написать код Java, который может передать ssh на сервер Unix и сбросить пароль пользователя. Поэтому я попытался реализовать некоторый код, найденный в SO.Мой сеанс JSch не выполняет команду

Например.

Использование JSch , я последовал this link, чтобы получить соответствующую команду для сброса пароля пользователя.

Когда я попытался запустить этот код, кажется, что он не сбрасывает пароль пользователя. Поэтому я попытался запустить команду непосредственно из оболочки Unix, и команда работает отлично. Я предполагаю, что exec не работал вообще. Я изменил 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 Log:

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 log] (http://www.jcraft.com/jsch/examples/Logger.java.html). –

+0

@MartinPrikryl. Я добавил журнал JSch. Это то, что вы просили? –

ответ

2

Я предполагаю, что проблема заключается в том, что вы закрыть соединение до того, как команда началась.

Все примеры, на которые вы указали, чтобы прочитать выход команды, до конца (следовательно, пока команда не закончится). Вы не читаете вывод, чтобы не дождаться завершения команды.

Либо следует использовать выходной сигнал команды, как это делают другие примеры. Или (если вы не заинтересованы в выходе) до тех пор, пока channel.isClosed() не будет истинным до выхода.

Смежные вопросы