我想使用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
我使用以下方法添加了与我希望在给定服务器中执行的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组?