Java远程连接Linux服务器执行shell脚本

Java远程连接Linux服务器执行shell脚本

1.准备工作

1.搭建maven工程

2.引入jsch依赖

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

3.在linux服务器或虚拟机中编写shell脚本

#!/bin/bash 
echo "hello world~"

2.执行sh脚本代码

示例代码如下,如果是boot项目可以将配置信息编写在配置文件中,从配置文件中获取服务器连接信息已经需要执行的脚本文件

/**
 * @param host    主机ip
 * @param user    用户名
 * @param pass    用户密码
 * @param port    端口
 * @param command 要执行的指令
 */
public static void sshCommand(String host, String user, String pass, int port, String command) {
    JSch jsch = new JSch();
    Session session = null;
    Channel channel = null;
    InputStream in = null;
    try {
        session = jsch.getSession(user, host, port);
        session.setPassword(pass);
        session.setTimeout(5000);
        Properties config = new Properties();
        //严格的主机key检查
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        channel = session.openChannel("exec");
        ChannelExec execChannel = (ChannelExec) channel;
        execChannel.setCommand(command);
        in = channel.getInputStream();
        channel.connect();

        StringBuffer sb = new StringBuffer();
        int c = -1;
        while ((c = in.read()) != -1) {
            sb.append((char) c);
        }
        System.out.println("输出结果是:" + sb.toString());
    } catch (JSchException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (channel != null) {
            channel.disconnect();
        }
        if (session != null) {
            session.disconnect();
        }
    }
}

3.上传文件到linux服务器

/**
 * sftp文件上传
 *
 * @param host       主机
 * @param username   用户名
 * @param password   用户密码
 * @param port       端口
 * @param location   上传文件路径
 * @param uploadFile 要上传的文件
 * @return
 */
public static boolean upload(String host, String username, String password, int port, String location, File uploadFile) {
    Session session = null;
    Channel channel = null;
    ChannelSftp sftp = null;
    JSch jsch = new JSch();
    try {
        session = jsch.getSession(username, host, port);
        session.setPassword(password);

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);

        //建立连接
        session.connect();
        channel = session.openChannel("sftp");
        channel.connect();
        sftp = (ChannelSftp) channel;
        sftp.cd(location);
        sftp.put(new FileInputStream(uploadFile), uploadFile.getName());
        return true;
    } catch (JSchException e) {
        e.printStackTrace();
    } catch (SftpException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (channel != null) {
            channel.disconnect();
        }
        if (sftp != null) {
            sftp.disconnect();
        }
        if (session != null) {
            session.disconnect();
        }
    }
    return false;
}

4.测试案例

image-20221010104852336

如果上传相同文件名的文件,文件会被覆盖

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要通过Java 1.8连接Linux服务器执行shell脚本,可以使用Java的SSH库,如JSch。下面是一种可能的实现方式: 首先,你需要在你的Java项目中导入JSch库。你可以在Maven中添加以下依赖项: ```xml <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency> ``` 然后,你需要使用JSch创建一个SSH会话并连接到远程服务器。以下是一个简单的示例代码: ```java import com.jcraft.jsch.*; public class SSHExample { public static void main(String[] args) { String host = "your_host"; int port = 22; String username = "your_username"; String password = "your_password"; try { JSch jsch = new JSch(); Session session = jsch.getSession(username, host, port); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword(password); session.connect(); Channel channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand("your_shell_command"); channel.setInputStream(null); ((ChannelExec) channel).setErrStream(System.err); InputStream in = channel.getInputStream(); channel.connect(); // 读取命令输出 byte[] tmp = new byte[1024]; while (true) { while (in.available() > 0) { int i = in.read(tmp, 0, 1024); if (i < 0) break; System.out.print(new String(tmp, 0, i)); } if (channel.isClosed()) { if (in.available() > 0) continue; System.out.println("exit-status: " + channel.getExitStatus()); break; } } channel.disconnect(); session.disconnect(); } catch (JSchException | IOException e) { e.printStackTrace(); } } } ``` 在上述代码中,你需要将"your_host"替换为远程服务器的IP地址或域名,"your_username"和"your_password"替换为你的用户名和密码。然后,将"your_shell_command"替换为你想要在远程服务器执行shell命令。 此代码将连接到远程服务器执行shell命令并打印输出流中的结果。你还可以根据需要进行进一步的修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值