java执行linux命令切换用户

fiy 其他 73

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Java可以通过执行Shell命令来实现切换用户。下面是一个示例代码:

    “`java
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;

    public class SwitchUserCommand {
    public static void main(String[] args) {
    String command = “sudo su – username”;
    try {
    Process process = Runtime.getRuntime().exec(command);

    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
    System.out.println(line);
    }

    process.waitFor();
    reader.close();

    } catch (IOException | InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    “`

    在这个示例代码中,执行了一个`sudo su – username`的命令,其中`username`是要切换到的用户的用户名。`Runtime.getRuntime().exec(command)`方法可以执行Shell命令,返回一个Process对象。通过获取此Process对象的输入流并读取输出,就可以获取到执行命令的输出结果。

    需要注意的是,执行`sudo`命令需要输入超级用户的密码。如果想要在Java代码中自动输入密码,可以使用`Process.getOutputStream()`方法获取到输出流,然后通过输出流写入密码。

    以上代码仅仅是一个示例,实际使用时需要根据具体的需求进行修改和完善。同时,在执行Shell命令时需要特别注意安全性,确保只执行信任的命令。

    2年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    要在Java程序中执行Linux命令并切换用户,可以使用Java的ProcessBuilder类。

    1. 引入ProcessBuilder类:
    “`java
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    “`

    2. 创建ProcessBuilder对象并设置命令:
    “`java
    ProcessBuilder processBuilder = new ProcessBuilder();
    List command = new ArrayList<>();
    command.add(“/bin/bash”);
    command.add(“-c”);
    command.add(“su – username -c \”command\””); // 在此处将username替换为要切换到的用户,将command替换为要执行的命令
    processBuilder.command(command);
    “`

    3. 执行命令并处理输出结果:
    “`java
    try {
    Process process = processBuilder.start();
    int exitCode = process.waitFor(); // 等待命令执行完成
    if (exitCode == 0) {
    // 命令执行成功
    InputStream inputStream = process.getInputStream();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String line;
    while ((line = bufferedReader.readLine()) != null) {
    System.out.println(line); // 将命令输出打印出来
    }
    bufferedReader.close();
    } else {
    // 命令执行失败
    InputStream errorStream = process.getErrorStream();
    BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream));
    String line;
    while ((line = errorReader.readLine()) != null) {
    System.out.println(line); // 将错误信息打印出来
    }
    errorReader.close();
    }
    } catch (IOException e) {
    e.printStackTrace();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    “`

    4. 注:在执行切换用户命令时,需要输入用户的密码。如果想要在Java程序中自动输入密码而不需要手动输入,可以使用以下代码示例:
    “`java
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.redirectErrorStream(true);
    processBuilder.command(“su”, “-c”, “command”);
    Process process = processBuilder.start();
    OutputStream outputStream = process.getOutputStream();
    BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
    bufferedWriter.write(“password\n”); // 将password替换为用户的密码
    bufferedWriter.flush();
    bufferedWriter.close();
    int exitCode = process.waitFor();
    “`

    注意:在执行切换用户命令的同时,需要确保Java程序运行的用户具有切换到目标用户的权限,并且目标用户的密码是正确的。

    2年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Java中执行Linux命令并切换用户可以使用Java的`ProcessBuilder`类和`sudo`命令。下面是一种使用该方法的操作流程:

    1. 创建一个`ProcessBuilder`对象,用于构建要执行的命令。例如可以使用`ProcessBuilder`的构造函数来传入命令和参数,或者使用`command()`方法设置命令和参数。

    “`java
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command(“sudo”, “-u”, “username”, “command”);
    “`

    2. 设置Linux用户密码。在执行切换用户的命令之前,需要提供目标用户的密码,以进行身份验证。可以使用`echo`命令和Linux的管道符号(|)将密码作为输入传递给`sudo`命令。

    “`java
    processBuilder.environment().put(“userpassword”, “password”);
    processBuilder.command(“echo”, “$userpassword | sudo -S -u username command”);
    “`

    3. 运行命令并接收输出。可以通过调用`start()`方法启动进程,然后使用`waitFor()`方法来等待命令执行完成,并将标准输出和错误输出存储在相应的流中。

    “`java
    Process process = processBuilder.start();
    int exitCode = process.waitFor();

    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
    System.out.println(line);
    }

    BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    String errorLine;
    while ((errorLine = errorReader.readLine()) != null) {
    System.out.println(errorLine);
    }
    “`

    完整的代码示例:

    “`java
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;

    public class LinuxCommandExecutor {

    public static void main(String[] args) {
    String password = “password”;
    String username = “targetusername”;
    String command = “command”;

    try {
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command(“echo”, password, “|”, “sudo”, “-S”, “-u”, username, command);

    Process process = processBuilder.start();
    int exitCode = process.waitFor();

    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
    System.out.println(line);
    }

    BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    String errorLine;
    while ((errorLine = errorReader.readLine()) != null) {
    System.out.println(errorLine);
    }
    } catch (IOException | InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    “`

    上述代码中,`password`变量存储了目标用户的密码,`username`变量存储了要切换的用户,`command`变量存储了要执行的命令。`ProcessBuilder`对象构建了要执行的命令,然后使用`start()`方法启动进程,并使用`waitFor()`方法等待命令执行完成。标准输出和错误输出通过`BufferedReader`对象存储,并逐行读取并输出到控制台。

    2年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部