我正在使用Ubuntu 14.04,我试图从java以sudo用户的身份执行logname命令,但它返回空值。我尝试的代码如下:
try {
Process p = Runtime.getRuntime().exec("logname");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String sa = br.readLine();
System.out.println("Logged User: "+sa);
} catch (IOException ex) {
System.out.println(ex);
}
我得到的结果是
记录用户:空
我也试过了
字符串[]temp={“/bin/sh”,“-c”,“logname”}exec(temp);
字符串[]temp={“/bin/sh”,“-c”,“sudo logname”}exec(temp);
exec(“sudo logname”);
更新1:
我试过whoami | awk{print$1}来查找日志名。但那没用。如果我以根用户身份登录,则显示根用户。
最佳答案
是否尝试使用要执行的应用程序的完整路径?
/usr/bin/logname
或
/usr/bin/whoami
那么使用:
"echo $SUDO_USER"
这似乎有效:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class runlogname {
public static void main(String[] args)
{
try
{
ProcessBuilder pb = new ProcessBuilder();
pb.command("/bin/bash", "-c", "/usr/bin/logname").start();
Process p = pb.start();
int retValue = p.waitFor();
System.out.println("retValue = " + Integer.toString(retValue));
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuffer output = new StringBuffer();
String line = "";
while ((line = br.readLine())!= null) {
output.append(line + "\n");
}
String sa = output.toString();
System.out.println("Logged User: "+sa);
}
catch (IOException ex)
{
System.out.println(ex);
}
catch (InterruptedException ex)
{
System.out.println(ex);
}
}
}
但返回代码1由logname命令返回,该命令根据手册页指示错误。所以这意味着java代码是正确的,但是logname命令不起作用。
运行我提供的示例的strace(带有-f标志)将给出失败的原因。
在我的盒子上是:
[pid 29925] write(2, "/usr/bin/logname: ", 18) = 18
[pid 29925] write(2, "no login name", 13) = 13
[pid 29925] write(2, "\n", 1) = 1