当前位置: 首页 > article >正文

Java 远程执行服务器上的命令

在Java中使用JSch库执行远程服务器上的命令是一种常见的做法,特别是在需要自动化运维任务或者进行远程文件操作时。以下是基于Codekru网站提供的示例,展示如何使用JSch库在远程服务器上执行单个或多个命令。

准备工作

首先,确保您的项目中已经包含了JSch库的依赖。如果您使用Maven作为构建工具,可以在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

连接到远程服务器

在执行命令之前,需要先建立与远程服务器的SSH连接。以下是一个简单的连接示例:

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

public class SSHConnectionExample {

    public static void main(String[] args) {
        try {
            JSch jsch = new JSch();
            String user = "codekru"; // 您的用户名
            String host = "127.0.0.1"; // 您的远程服务器地址
            int port = 22; // 默认SSH端口
            String key = "/path/to/your/privatekey.pem"; // 您的私钥路径

            jsch.addIdentity(key);
            
            Session session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setTimeout(15000); // 设置超时时间
            session.connect();

            System.out.println("Connected");

            // 在这里您可以执行其他操作,如执行命令或传输文件
            
            session.disconnect(); // 断开连接
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }
}

执行单个命令

一旦建立了SSH连接,您就可以使用JSch库执行远程命令。以下是一个简单的示例:

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

public class ExecuteSingleCommandExample {

    public static void main(String[] args) {
        try {
            JSch jsch = new JSch();
            String user = "codekru"; // 您的用户名
            String host = "127.0.0.1"; // 您的远程服务器地址
            int port = 22; // 默认SSH端口
            String key = "/path/to/your/privatekey.pem"; // 您的私钥路径

            jsch.addIdentity(key);
            
            Session session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setTimeout(15000); // 设置超时时间
            session.connect();

            String command = "ls -l"; // 您要执行的命令
            Channel channel = session.openChannel("exec");
            ((ChannelExec) channel).setCommand(command);
            channel.setInputStream(null); // 这个方法必须在connect之前调用
            ((ChannelExec) channel).setErrStream(System.err);

            InputStream inputStream = channel.getInputStream();
            channel.connect();

            byte[] byteObject = new byte[10240];
            while (true) {
                while (inputStream.available() > 0) {
                    int readByte = inputStream.read(byteObject, 0, 1024);
                    if (readByte < 0)
                        break;
                    String result = new String(byteObject, 0, readByte);
                    System.out.print(result);
                }
                if (channel.isClosed())
                    break;
            }
            channel.disconnect();
            System.out.println("Disconnected channel " + channel.getExitStatus());

            session.disconnect(); // 断开连接
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }
}

执行多个命令

如果您需要在同一个SSH连接中执行多个命令,可以将这些命令使用分号(;)隔开。以下是一个执行多个命令的示例:

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

public class ExecuteMultipleCommandsExample {

    public static void main(String[] args) {
        try {
            JSch jsch = new JSch();
            String user = "codekru"; // 您的用户名
            String host = "127.0.0.1"; // 您的远程服务器地址
            int port = 22; // 默认SSH端口
            String key = "/path/to/your/privatekey.pem"; // 您的私钥路径

            jsch.addIdentity(key);
            
            Session session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setTimeout(15000); // 设置超时时间
            session.connect();

            String command = "cd /Users/codekru/jsch-tutorial/; cd ..; ls -l"; // 多个命令
            Channel channel = session.openChannel("exec");
            ((ChannelExec) channel).setCommand(command);
            channel.setInputStream(null); // 这个方法必须在connect之前调用
            ((ChannelExec) channel).setErrStream(System.err);

            InputStream inputStream = channel.getInputStream();
            channel.connect();

            byte[] byteObject = new byte[10240];
            while (true) {
                while (inputStream.available() > 0) {
                    int readByte = inputStream.read(byteObject, 0, 1024);
                    if (readByte < 0)
                        break;
                    String result = new String(byteObject, 0, readByte);
                    System.out.print(result);
                }
                if (channel.isClosed())
                    break;
            }
            channel.disconnect();
            System.out.println("Disconnected channel " + channel.getExitStatus());

            session.disconnect(); // 断开连接
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }
}

处理无效命令

当您尝试执行一个无效的命令时,JSch库会捕获错误并将错误信息输出到标准错误流。以下是一个执行无效命令的示例:

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

public class HandleInvalidCommandExample {

    public static void main(String[] args) {
        try {
            JSch jsch = new JSch();
            String user = "codekru"; // 您的用户名
            String host = "127.0.0.1"; // 您的远程服务器地址
            int port = 22; // 默认SSH端口
            String key = "/path/to/your/privatekey.pem"; // 您的私钥路径

            jsch.addIdentity(key);
            
            Session session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setTimeout(15000); // 设置超时时间
            session.connect();

            String command = "qwerty"; // 无效命令
            Channel channel = session.openChannel("exec");
            ((ChannelExec) channel).setCommand(command);
            channel.setInputStream(null); // 这个方法必须在connect之前调用
            ((ChannelExec) channel).setErrStream(System.err);

            InputStream inputStream = channel.getInputStream();
            channel.connect();

            byte[] byteObject = new byte[10240];
            while (true) {
                while (inputStream.available() > 0) {
                    int readByte = inputStream.read(byteObject, 0, 1024);
                    if (readByte < 0)
                        break;
                    String result = new String(byteObject, 0, readByte);
                    System.out.print(result);
                }
                if (channel.isClosed())
                    break;
            }
            channel.disconnect();
            System.out.println("Disconnected channel " + channel.getExitStatus());

            session.disconnect(); // 断开连接
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }
}

在执行无效命令时,控制台将输出错误信息,例如:

connected
bash: qwerty: command not found
Disconnected channel 127

总结

通过上述示例,您可以了解如何使用JSch库在远程服务器上执行单个或多个命令。无论是执行有效的命令还是处理无效命令,都可以按照上述步骤实现。记得在实际使用中替换示例中的占位符为真实的用户名、IP地址、端口号、私钥路径以及命令。


http://www.kler.cn/a/298955.html

相关文章:

  • 一道Delphi的面试题
  • OpenResty、Lua介绍认识
  • 【数据安全】如何保证其安全
  • ROS1入门教程3:自定义消息
  • 【AI知识】为什么激活值过大/过小,初始权重过大/过小,可能导致梯度爆炸/消失?具体例子举例
  • 关于使用拓扑排序算法实现解析勾稽关系优先级的研究和实现
  • HP电脑如何启动硬件检测
  • 数据结构应用实例(六)——最短路径
  • CCF刷题计划——坐标变换(其二)(前缀和)
  • Dubbo 与 Zookeeper 在项目中的应用:原理与实现详解
  • 深入理解Java虚拟机:Jvm总结-垃圾收集器与内存分配策略
  • 【C++】list的使用与简单模拟实现
  • 通过Python调用Excel VBA宏:扩展自动化能力的深度探索
  • 深入理解java并发编程之aqs框架
  • ABB机器人教程:外部调用例行程序功能介绍与使用方法
  • 流媒体之HLS协议(其三)
  • 动态规划-最长回文子序列
  • Android自动化1️⃣环境搭建【基于Appium】-基于python
  • 在执行django定时任务中,遇到的celery woker生命周期问题
  • 【区块链 + 基层治理】基层党建投票应用“We 投票” | FISCO BCOS应用案例
  • 掌握python-pptx:打造专业PPT表格
  • MIT6.824 课程-GFS
  • PyCharm修改背景颜色、修改字体大小+Python常用快捷键+Python常见的运算符
  • 【PyQt6 应用程序】一键视频解说克隆字幕切割版
  • Linux命令分享 三 (ubuntu 16.04)
  • flink程序 轻松测试