当前位置: 首页 > 知识库问答 >
问题:

如何执行sudo命令与密码与给定的用户ID在linux服务器使用Java程序?

祁博涛
2023-03-14

我想使用Java程序执行如下类似的linux命令:

sudo-su(用户ID)

然后提示输入密码

(userid)的[sudo]密码:

我有一个java程序,它使用我的有效凭据连接到linux服务器,并且能够执行/返回基本的linux命令,例如“ls-ltd r, pwd...”。但是,我被卡住了,并且面临着执行sudo命令的问题,如上所述。

请建议我需要向程序中添加什么代码来使用给定的用户ID执行/运行sudo。要求是在给定目录中运行脚本,并且它只能由具有运行权限的特定用户运行,因此需要sudo-su。

这是我的代码:

    String host="IP";
    String user="myusername";
    String password="mypassword";
    String command1="ls -ltr";


    try{

        java.util.Properties config = new java.util.Properties(); 
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();
        Session session=jsch.getSession(user, host, 22);
        session.setPassword(password);
        session.setConfig(config);
        session.connect();
        System.out.println("Connected");

        Channel channel=session.openChannel("exec");
        ((ChannelExec)channel).setCommand(command1);

        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()){
            System.out.println("exit-status: "+channel.getExitStatus());
            break;
          }
          try{Thread.sleep(1000);}catch(Exception ee){}
        }
        channel.disconnect();
        session.disconnect();
        System.out.println("DONE");
    }

    catch(Exception e)
    {
        e.printStackTrace();
    }

我尝试按照之前发布的问题之一中的建议添加以下代码。

public static void main(String[] args) throws IOException {

String[] cmd = {"/bin/bash","-c","echo password| sudo -S ls"};
Process pb = Runtime.getRuntime().exec(cmd);

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

我得到以下错误:

>java.io.IOException: Cannot run program "/bin/bash": CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at java.lang.Runtime.exec(Runtime.java:485)
    at com.fedex.sample.LeanFtTest.test(LeanFtTest.java:82)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
    at org.testng.TestNG.run(TestNG.java:1031)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)
    Caused by: java.io.IOException: CreateProcess error=2, The system cannot 
    find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
    at java.lang.ProcessImpl.start(ProcessImpl.java:137)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 27 more

共有1个答案

周兴朝
2023-03-14

我使用以下方法添加了与我希望在给定服务器中执行的sudo用户相关联的密钥。并确保键位置作为输入字符串给定。成功了!

jsch.addIdentity(key);
 类似资料:
  • 问题内容: 嗨,我正在使用ganymed-ssh2 Java库在Linux工作站中成功执行远程命令。 但是现在有一种情况,我需要执行命令,但这需要我输入一些密码…,例如: 我曾经以这种方式实现远程cmd执行: 恐怕无法使用此库执行需要密码的命令。 有人可以给我解决方案或替代方案,以允许这样做? 谢谢! 问题答案: 假设有一个,您应该能够将密码输入sudo命令。

  • 我正在使用ProcessBuilder执行bash命令: 编辑 gksudo带着最后一次更新回到了Ubuntu13.04。

  • 问题内容: 我试图便宜一些,并在Java中执行本地系统命令()。我想从中获取输出并将其存储在String中。最好的方法是什么?当前代码: 问题答案: 你的方法与我可能要做的事情并不遥远: 当然,请处理你关心的任何异常情况。

  • 如果我执行plink命令 当提示输入密码时,我将获得 Sudo:没有tty存在,也没有指定askpass程序 Sudo:3次错误的密码尝试 如何从执行sudo?或者有其他选择吗?

  • 问题内容: 给定XX的进程iD,我想有一个任何窗口ID的列表,其中_NET_WM_PID = XX。如果可能的话,最好的办法是最旧的仍处于活动状态的窗口ID。 我对linux还是很陌生,但是我想做的是创建一个使用命令行的脚本,并查看是否有一个窗口已经打开,该窗口属于使用同一命令行调用的进程。如果是这样,只需将焦点设置在该窗口上,否则执行命令行以进行新的处理。我的意图是在我的ubuntu桌面上使用此

  • 我正在从ubuntu创建一个docker文件:仿生图像。 我想要一个具有sudo权限的ubuntu用户。 这是我的文件 但是有了这个密码,我需要写下ubuntu用户的密码。 有一种方法可以通过命令行将NOPASSWD子句添加到sudoers文件中的sudo组?