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