shell(51) : java执行远程sh命令

文章介绍了如何使用Java库JSch实现SSH连接,包括创建Session、配置连接参数、执行命令以及处理交互式命令执行,还提到了Maven依赖。
摘要由CSDN通过智能技术生成

来源 : GPT4

代码

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

import java.io.InputStream;

public class RemoteShUtil {

    public static String run(String ip, Integer port, String username, String password, String cmd) {
        try {
            // 创建Session
            JSch jsch = new JSch();
            Session session = jsch.getSession(username, ip, port);
            session.setPassword(password);

            // 配置Session
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);

            // 建立连接
            session.connect();

            // 打开执行通道
            Channel channel = session.openChannel("exec");
            ((ChannelExec) channel).setCommand(cmd);

            channel.setInputStream(null);
            ((ChannelExec) channel).setErrStream(System.err);

            // 获取执行输出
            InputStream in = channel.getInputStream();
            channel.connect();
            byte[] tmp = new byte[1024];
            StringBuffer rs = new StringBuffer();
            while (true) {
                while (in.available() > 0) {
                    int i = in.read(tmp, 0, 1024);
                    if (i < 0) break;
                    rs.append(new String(tmp, 0, i)).append("\n");
                }
                if (channel.isClosed()) {
                    if (in.available() > 0) continue;
                    //System.out.println("exit-status: " + channel.getExitStatus());
                    break;
                }
            }
            // 关闭通道和会话
            channel.disconnect();
            session.disconnect();
            return rs.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    // 交互命令,如 top -n 1 > /root/1
    // 好像有点问题 上面的命令可以直接查看 top -bn1
    public static void runInteractive(String ip, Integer port, String username, String password, String cmd) {
        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession(username, ip, port);
            session.setPassword(password);

            // 取消主机密钥检查(注意这可能会导致安全问题,最好在代码中处理主机密钥校验)
            session.setConfig("StrictHostKeyChecking", "no");

            // 连接到 SSH 服务器
            session.connect();

            // 打开 exec 通道
            ChannelExec channel = (ChannelExec) session.openChannel("exec");

            channel.setCommand("bash -c '" + cmd + "'");

            // 连接 exec 通道
            channel.connect();

            // 等待执行完成
            while (!channel.isClosed()) {
                Thread.sleep(100);
            }

            // 检查退出状态
            int exitStatus = channel.getExitStatus();
            if (exitStatus == 0) {
                System.out.println("Command executed successfully.");
            } else {
                System.out.println("Execution failed with status: " + exitStatus);
            }

            // 关闭通道和会话
            channel.disconnect();
            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println(run("127.0.0.1", 22, "root", "123456,  "ls -la"));
    }
}

maven依赖

<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值