我有一台虚拟机可以连接多有虚拟机,我在这个虚拟机上写了一个启动服务的shell.,我想通过java连接这个虚拟机执行shell启动远程虚拟机,我想用java代码循环一下连接远程的shell执行多个机器

理解了,你想通过 Java 连接到一台虚拟机,然后执行一个 shell 脚本,这个 shell 脚本负责连接多台其他虚拟机并执行相关操作。

下面是一个简单的 Java 代码示例,演示如何通过 JSch 库连接到一台虚拟机,并执行一个 shell 脚本,该脚本在远程执行其他操作

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class RemoteSSHExecutor {

    public static void main(String[] args) {
        // 远程虚拟机的 SSH 相关信息
        String remoteIp = "your_remote_vm_ip";
        String remoteUser = "your_remote_vm_user";
        String privateKeyPath = "/path/to/your/private-key/id_rsa";

        // 执行的命令,这里是连接到其他虚拟机并执行的脚本
        String remoteCommand = "/path/to/your/script.sh";

        // 创建 JSch 对象
        JSch jsch = new JSch();

        try {
            // 添加私钥
            jsch.addIdentity(privateKeyPath);

            // 创建 Session
            Session session = jsch.getSession(remoteUser, remoteIp, 22);

            // 设置 StrictHostKeyChecking 为 no,用于跳过 known_hosts 文件
            session.setConfig("StrictHostKeyChecking", "no");

            // 连接
            session.connect();

            // 循环远程连接
            for (int i = 0; i < 5; i++) {
                // 打开通道
                ChannelExec channelExec = (ChannelExec) session.openChannel("exec");

                // 设置执行的命令
                channelExec.setCommand(remoteCommand);

                // 获取执行结果
                java.io.InputStream in = channelExec.getInputStream();

                // 连接
                channelExec.connect();

                // 读取执行结果
                byte[] tmp = new byte[1024];
                while (true) {
                    while (in.available() > 0) {
                        int j = in.read(tmp, 0, 1024);
                        if (j < 0) break;
                        System.out.print(new String(tmp, 0, j));
                    }
                    if (channelExec.isClosed()) {
                        if (in.available() > 0) continue;
                        System.out.println("Exit status: " + channelExec.getExitStatus());
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (Exception ee) {
                        // Ignore
                    }
                }

                // 关闭通道
                channelExec.disconnect();

                // 等待一段时间再连接下一台虚拟机
                Thread.sleep(5000);
            }

            // 关闭 Session
            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我使用 JSch 库连接到远程虚拟机,然后循环执行了 5 次连接。每次连接都打开一个通道,执行命令,读取输出,然后关闭通道。在连接之间有 5 秒的等待时间。这个示例仅供参考,具体的时间间隔和循环次数可以根据你的需求进行调整。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值