使用java连接linux服务器执行命令。

本文介绍了如何使用Java远程连接Linux(CentOS)服务器并执行命令。首先,文章提到了复习Linux基础知识的重要性,接着详细讲解了在Java项目中添加相关依赖,并提供了工具类代码示例,展示了实际调用过程。

一前言

最近有个文件交换平台功能,需要使用到java连接服务器执行命令。

二复习Linux命令

#添加用户
useradd -d /home/test -m fgb
#-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
创建fgb用户  指定主目录为/home/test

#修改用户密码
 echo password | passwd --stdin username
示例:把root用户的密码修改成123456
 echo "123456" | passwd --stdin root

#删除用户
userdel -r username
示例:把fgb用户删除
userdel -r fgb

#给用户赋予某个文件夹权限
chown 700 fgb /usr/local/test
给fgb用户赋予/usr/local/test目录700权限

三代码部分

首先pom文件导入依赖

<dependency>
	<groupId>ch.ethz.ganymed</groupId>
	<artifactId>ganymed-ssh2</artifactId>
	<version>262</version>
</dependency>

#工具类

package com.eshore.framework.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import ch.ethz.ssh2.log.Logger;
/**
 * shell脚本调用类
 * @author clear
 *
 */
public class SshBasic{

    //连接,登陆
    public Connection login(String hostname,int port,String username,String password){

        //获取连接
        Connection conn = new Connection(hostname, port);
        try {
            //连接
            conn.connect();
            //输入账号密码登陆
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);
            //登陆失败,返回错误
            if(isAuthenticated == false){
                throw new IOException("isAuthentication failed.");
            }
        } catch (IOException e) {

            e.printStackTrace();
        }

        return conn;
    }
    //获取Session
    public Session getSession(Connection conn){
        Session sess = null;
        try {
            sess = conn.openSession();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return sess;
    }
   }

#代码调用

    public static void main(String[] args) {
        SshBasic m = new SshBasic();
        //连接并登陆
        Connection conn = m.login("132.122.1.51", 22, "srglweb", "srglweb123");
        //获取Session
        Session sess = m.getSession(conn);
        //执行命令    下面命令是删除用户fgb
        try{
        	sess.execCommand("userdel -r fgb")
        }catch(IOException e){
        	e.printStackTrace();
        }
        //判断会话是否成功
        int result = sess.getExitStatus();//如果成功返回0
        System.out.println("result:"+result);
        //释放资源  
        sess.close();
        conn.close();
    }
}	
Java中执行远程Linux服务器命令通常可以通过以下几种方式实现: 1. **使用JSch库执行SSH命令** JSch是一个纯Java实现的SSH2库,可以用于连接远程服务器执行命令。以下是使用JSch执行远程命令的基本示例: ```java import com.jcraft.jsch.*; public class RemoteCommandExecutor { public static void main(String[] args) { String host = "192.168.1.3"; String user = "username"; String password = "password"; try { JSch jsch = new JSch(); Session session = jsch.getSession(user, host, 22); session.setPassword(password); // 跳过主机密钥检查 session.setConfig("StrictHostKeyChecking", "no"); session.connect(); String command = "ls -l"; ChannelExec channel = (ChannelExec) session.openChannel("exec"); channel.setCommand(command); channel.setInputStream(null); channel.setErrStream(System.err); InputStream output = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[1024]; while (true) { while (output.available() > 0) { int i = output.read(tmp, 0, 1024); if (i < 0) break; System.out.print(new String(tmp, 0, i)); } if (channel.isClosed()) { if (output.available() == 0) { break; } } Thread.sleep(1000); } channel.disconnect(); session.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } ``` 该方法允许通过SSH协议安全地连接到远程主机并执行命令[^1]。 2. **使用Apache MINA SSHD库** Apache MINA SSHD 是另一个支持SSH协议的Java库,支持更高级的功能,如端口转发、SFTP等。它提供了一个更现代和灵活的API,适合需要更复杂SSH功能的应用。 3. **使用Java的ProcessBuilder执行本地命令** 如果只需要执行本地命令而不是远程命令,可以使用Java的`ProcessBuilder`类。以下是一个简单的示例: ```java public class LocalCommandExecutor { public static void main(String[] args) { try { ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l"); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } int exitCode = process.waitFor(); System.out.println("Exited with code " + exitCode); } catch (Exception e) { e.printStackTrace(); } } } ``` 该方法适用于执行本地命令,而不是远程命令。 4. **使用RMI(Remote Method Invocation)** Java RMI 允许一个Java虚拟机上的对象调用另一个Java虚拟机上的对象的方法。这种方法适用于需要在远程Java环境中执行特定代码的场景,但不适用于直接执行Linux shell命令。 5. **使用REST API或自定义服务** 如果远程服务器上运行了自定义服务或REST API,可以通过HTTP请求与远程服务器交互。可以使用Java中的`HttpURLConnection`或第三方库如Apache HttpClient来发送请求并处理响应。 ### 相关问题 1. 如何在Java使用JSch库上传和下载文件? 2. Apache MINA SSHD与JSch相比有哪些优势? 3. 如何在Java使用ProcessBuilder执行带有参数的命令? 4. 如何在Java RMI中设置安全策略? 5. 如何在Java使用HttpClient发送HTTP请求?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值