java在远程服务器上执行终端命令并获得返回结果

最近经常会用到java到指定机器上执行终端命令并且获得返回结果,所以借此机会来记录一下

1.首先通过ip,用户名,密码链接到远程服务器上,然后执行终端命令

userName:主机的用户名,password:密码,ipAddr:主机ip地址,cmd:你要执行的命令

    public String execute(String userName, String password, String ipAddr, String cmd) {
        String result = "";
        boolean isAuthed = false;
        try {
            if (InetAddress.getByName(ipAddr).isReachable(1500)) {
                Connection conn = new Connection(ipAddr);
                conn.connect();
                isAuthed = conn.authenticateWithPassword(userName, password);
                if (isAuthed) {
                    Session session = conn.openSession();//打开一个会话
                    session.execCommand(cmd);
                    result = processStdout(session.getStdout());
                    //如果为得到标准输出为空,说明脚本执行出错了
                    if (StringUtils.isBlank(result)) {
                        log.info("得到标准输出为空,链接conn:" + conn + ",执行的命令:" + cmd);
                        result = processStdout(session.getStderr());
                    } else {
                        log.info("执行命令成功,链接conn:" + conn + ",执行的命令:" + cmd);
                    }

                    session.close();
                    conn.close();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

2.获取终端命令的返回结果

    private static String processStdout(InputStream in) {
        InputStream stdout = new StreamGobbler(in);
        StringBuilder buffer = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout, StandardCharsets.UTF_8));
            String line;
            while ((line = br.readLine()) != null) {
                buffer.append(line).append("\n");
            }
        } catch (IOException e) {
            log.error("解析脚本出错:" + e.getMessage());
        }
        return buffer.toString();
    }

需要注意的是,如果想输入多条命令,命令之间可以用" && "连接,比如 "cd /home && ls"

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
使用Java JSch可以在远程机器上切换用户并执行命令,具体步骤如下: 1. 创建JSch实例 ``` JSch jsch = new JSch(); ``` 2. 连接到远程服务器 ``` Session session = jsch.getSession(username, host, port); session.setPassword(password); session.connect(); ``` 3. 切换用户 ``` ChannelExec channel = (ChannelExec) session.openChannel("exec"); channel.setCommand("sudo -u newuser bash"); channel.connect(); ``` 4. 执行命令 ``` channel = (ChannelExec) session.openChannel("exec"); channel.setCommand("ls -l"); channel.connect(); InputStream in = channel.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } channel.disconnect(); ``` 5. 关闭连接 ``` session.disconnect(); ``` 需要注意的是,在切换用户时需要输入新用户的密码,可以使用`channel.setPty(true)`来开启一个伪终端,从而可以输入密码。 完整代码示例: ``` import com.jcraft.jsch.*; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public class JSchDemo { public static void main(String[] args) { String host = "remote_host"; int port = 22; String username = "olduser"; String password = "oldpassword"; try { JSch jsch = new JSch(); Session session = jsch.getSession(username, host, port); session.setPassword(password); session.connect(); ChannelExec channel = (ChannelExec) session.openChannel("exec"); channel.setCommand("sudo -u newuser bash"); channel.connect(); channel = (ChannelExec) session.openChannel("exec"); channel.setCommand("ls -l"); channel.connect(); InputStream in = channel.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } channel.disconnect(); session.disconnect(); } catch (JSchException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值