java channelexec_Java ChannelExec.setPty方法代码示例

import com.jcraft.jsch.ChannelExec; //导入方法依赖的package包/类

private void createTCPProxy() {

try {

final String cleanCommand = String.format("sudo docker ps -a | grep 'hours ago' | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm",

containerName,

this.targetHost,

this.targetPort,

sourceIPs,

ImageRegistry.get().tcpProxy());

LOGGER.info("Establishing SSH shell");

ssh = SshUtil.getInstance()

.createSshSession(TestConfiguration.proxyHostUsername(), getProxyHost());

ssh.connect();

LOGGER.debug("Connected to ssh console");

final ChannelExec cleanChannel = (ChannelExec) ssh.openChannel("exec");

cleanChannel.setPty(true);

cleanChannel.setCommand(cleanCommand);

cleanChannel.setInputStream(null);

cleanChannel.setOutputStream(System.err);

LOGGER.debug("Executing command: '{}'", cleanCommand);

cleanChannel.connect();

cleanChannel.disconnect();

final String command = String.format("sudo docker run -it --name %s --net=host --rm -e AB_OFF=true -e TARGET_HOST=%s -e TARGET_PORT=%s -e TARGET_VIA=%s %s",

containerName,

this.targetHost,

this.targetPort,

sourceIPs,

ImageRegistry.get().tcpProxy());

LOGGER.info("Establishing SSH shell");

ssh = SshUtil.getInstance()

.createSshSession(TestConfiguration.proxyHostUsername(), getProxyHost());

ssh.connect();

LOGGER.debug("Connected to ssh console");

final ChannelExec channel = (ChannelExec) ssh.openChannel("exec");

channel.setPty(true);

channel.setCommand(command);

channel.setInputStream(null);

channel.setOutputStream(System.err);

LOGGER.debug("Executing command: '{}'", command);

channel.connect();

final LineIterator li = IOUtils.lineIterator(new InputStreamReader(channel.getInputStream()));

final Pattern portLine = Pattern.compile(".*Listening on port ([0-9]*).*$");

listenPort = 0;

while (li.hasNext()) {

final String line = li.next();

LOGGER.trace("Shell line: {}", line);

final Matcher m = portLine.matcher(line);

if (m.matches()) {

listenPort = Integer.parseInt(m.group(1));

LOGGER.info("Connection listening on port {}", listenPort);

break;

}

}

channel.disconnect();

} catch (final JSchException | IOException e) {

LOGGER.debug("Error in creating SSH connection to proxy host", e);

throw new IllegalStateException("Cannot open SSH connection", e);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
com.jcraft.jsch.RequestShell.class com.jcraft.jsch.RequestAgentForwarding.class com.jcraft.jsch.Random.class com.jcraft.jsch.RequestSignal.class com.jcraft.jsch.Compression.class com.jcraft.jsch.SignatureDSA.class com.jcraft.jsch.Logger.class com.jcraft.jsch.RequestEnv.class com.jcraft.jsch.UserAuthPublicKey.class com.jcraft.jsch.RequestX11.class com.jcraft.jsch.RequestSftp.class com.jcraft.jsch.Session.class com.jcraft.jsch.SignatureRSA.class com.jcraft.jsch.JSchAuthCancelException.class com.jcraft.jsch.Cipher.class com.jcraft.jsch.UserAuth.class com.jcraft.jsch.ChannelX11.class com.jcraft.jsch.RequestPtyReq.class com.jcraft.jsch.jce.HMACMD596.class com.jcraft.jsch.jce.Random.class com.jcraft.jsch.jce.SignatureDSA.class com.jcraft.jsch.jce.TripleDESCBC.class com.jcraft.jsch.jce.MD5.class com.jcraft.jsch.jce.SignatureRSA.class com.jcraft.jsch.jce.AES128CBC.class com.jcraft.jsch.jce.AES192CBC.class com.jcraft.jsch.jce.AES256CBC.class com.jcraft.jsch.jce.HMACSHA196.class com.jcraft.jsch.jce.SHA1.class com.jcraft.jsch.jce.HMACSHA1.class com.jcraft.jsch.jce.KeyPairGenRSA.class com.jcraft.jsch.jce.HMACMD5.class com.jcraft.jsch.jce.BlowfishCBC.class com.jcraft.jsch.jce.KeyPairGenDSA.class com.jcraft.jsch.jce.DH.class com.jcraft.jsch.DHGEX.class com.jcraft.jsch.jcraft.HMACMD596.class com.jcraft.jsch.jcraft.Compression.class com.jcraft.jsch.jcraft.HMACSHA196.class com.jcraft.jsch.jcraft.HMACSHA1.class com.jcraft.jsch.jcraft.HMACMD5.class com.jcraft.jsch.jcraft.HMAC.class com.jcraft.jsch.HostKeyRepository.class com.jcraft.jsch.JSch.class com.jcraft.jsch.MAC.class com.jcraft.jsch.Request.class com.jcraft.jsch.ChannelAgentForwarding.class com.jcraft.jsch.UserAuthGSSAPIWithMIC.class com.jcraft.jsch.Channel.class com.jcraft.jsch.ForwardedTCPIPDaemon.class com.jcraft.jsch.SftpProgressMonitor.class com.jcraft.jsch.UserAuthKeyboardInteractive.class com.jcraft.jsch.ChannelExec.class com.jcraft.jsch.SocketFactory.class com.jcraft.jsch.ProxySOCKS5.class com.jcraft.jsch.Buffer.class com.jcraft.jsch.ProxyHTTP.class com.jcraft.jsch.GSSContext.class com.jcraft.jsch.IO.class com.jcraft.jsch.Identity.class com.jcraft.jsch.JSchException.class com.jcraft.jsch.CipherNone.class com.jcraft.jsch.SftpATTRS.class com.jcraft.jsch.KeyPairRSA.class com.jcraft.jsch.Packet.class com.jcraft.jsch.RequestExec.class com.jcraft.jsch.KeyPairGenRSA.class com.jcraft.jsch.ChannelShell.class com.jcraft.jsch.IdentityFile.class com.jcraft.jsch.RequestSubsystem.class com.jcraft.jsch.Proxy.class com.jcraft.jsch.KnownHosts.class com.jcraft.jsch.RequestWindowChange.class com.jcraft.jsch.ChannelSubsystem.class com.jcraft.jsch.HASH.class com.jcraft.jsch.KeyPairDSA.class com.jcraft.jsch.ChannelSftp.class com.jcraft.jsch.HostKey.class com.jcraft.jsch.KeyPairGenDSA.class com.jcraft.jsch.UserAuthNone.class com.jcraft.jsch.UserInfo.class com.jcraft.jsch.ServerSocketFactory.class com.jcraft.jsch.KeyPair.class com.jcraft.jsch.JSchPartialAuthException.class com.jcraft.jsch.DH.class com.jcraft.jsch.KeyExchange.class com.jcraft.jsch.ChannelDirectTCPIP.class com.jcraft.jsch.Util.class com.jcraft.jsch.SftpException.class com.jcraft.jsch.DHG1.class com.jcraft.jsch.ChannelForwardedTCPIP.class com.jcraft.jsch.ChannelSession.class com.jcraft.jsch.PortWatcher.class com.jcraft.jsch.ProxySOCKS4.class com.jcraft.jsch.UserAuthPassword.class com.jcraft.jsch.UIKeyboardInteractive.class
您好!针对您的问题,我可以给出以下解答: Java JSch 是一个用于远程执行命令和传输文件的 Java 库,通过 JSch,我们可以在 Java 应用程序中连接到远程主机,并执行远程主机上的命令。 针对您的问题,如果您在使用 Java JSch 调用 shell 脚本时,脚本执行后立即退出,可能是因为您的 Java 程序没有等待 shell 脚本执行完毕就立即退出了。 为了解决这个问题,您可以在调用 shell 脚本的代码中,使用 `ChannelExec.setPty(true)` 方法启用伪终端模式,并使用 `ChannelExec.setCommand(command + ";echo finished")` 方法在 shell 脚本执行完毕后输出一个 "finished" 的标识符。然后您可以使用 `ChannelExec.getInputStream()` 方法获取 shell 脚本的输出流,并等待输出流中包含 "finished" 标识符,表示 shell 脚本已经执行完毕,然后再关闭连接。 以下是一个示例代码: ``` JSch jsch = new JSch(); Session session = jsch.getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); ChannelExec channelExec = (ChannelExec) session.openChannel("exec"); channelExec.setPty(true); channelExec.setCommand(command + ";echo finished"); channelExec.setInputStream(null); channelExec.setErrStream(System.err); InputStream inputStream = channelExec.getInputStream(); channelExec.connect(); byte[] tmp = new byte[1024]; while (true) { while (inputStream.available() > 0) { int i = inputStream.read(tmp, 0, 1024); if (i < 0) break; System.out.print(new String(tmp, 0, i)); } if (channelExec.isClosed()) { if (inputStream.available() > 0) continue; System.out.println("exit-status: " + channelExec.getExitStatus()); break; } try { Thread.sleep(1000); } catch (Exception ee) {} } channelExec.disconnect(); session.disconnect(); ``` 希望这个解答能够帮到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值