2013-09-22 43 views
0

我的新的问题是执行的bash shell脚本,Java的要求sudo的权限root权限bash脚本。我想要做的我使用命令行,这是与NS-的slapd的db2ldif命令导出完成DS-389数据库转换为LDIF格式是什么。这是我简单的Java代码,主要用于执行此操作:执行需要从Java版本(NetBeans)

ProcessBuilder p = new ProcessBuilder("/bin/bash", "example.sh"); 
final Process process = p.start(); 

其中example.sh位于项目目录,并有一个与访问它没有问题。我还添加了脚本以执行chmod 777的权限。 Example.sh只有这个:

#!/bin/bash 
ns-slapd db2ldif -D /etc/dirsrv/slapd-localhost -n userRoot -s "ou=Group,dc=localdomain" -a /tmp/file.ldif 

我怎么努力,到目前为止是visudo命令,添加此行:

nobody ALL=(ALL) NOPASSWD: /usr/sbin/ns-slapd 
myUSER ALL=(ALL) NOPASSWD: /usr/sbin/ns-slapd 
root ALL=(ALL) NOPASSWD: /usr/sbin/ns-slapd 
bin ALL=(ALL) NOPASSWD: /usr/sbin/ns-slapd 
myUSER ALL = NOPASSWD: /usr/bin/java 
root ALL= NOPASSWD: /usr/bin/java 
nobody ALL= NOPASSWD: /usr/bin/java 
bin ALL= NOPASSWD: /usr/bin/java 

但没有结果..而且是这种变化让我执行例子.sh没有问我密码,但在命令行。当我从java中尝试这样做时,它不起作用,并且在/ tmp中没有创建file.ldif。欢迎任何帮助。 感谢您的时间:)

回答

0

尝试使用sudo -S -p

其他方式我用位于jsch-0.1.38.jarJSch类。

的想法是从控制台sudo输入重定向到Java代码。

SudoExec类

public abstract class SudoExec { 

private String mHost; 
private static String passwd; 
private SSHObserverItf mObserver = null; 
protected boolean isForceStop = false; 
protected boolean isAsIs = false; 
protected Timer mTimer = null; 



//default constructor 
public SudoExec(String hostName,String userName,String password){ 
    setHost(userName+"@"+hostName); 
    setPassword(password); 
} 

public void init(int timeToWait) { 

    mTimer = new Timer(); 


    new Thread(){  
     public void run(){ 
      execCMD(); 
     }   
    }.start(); 

    mTimer.doWait(timeToWait); 

    isForceStop = true; 
} 


private void execCMD(){ 

    isForceStop = false;   

    try{ 
     JSch jsch=new JSch(); 

     String host=getHost(); 


     String user=host.substring(0, host.indexOf('@')); 
     host=host.substring(host.indexOf('@')+1); 

     Session session=jsch.getSession(user, host, 22); 



     // username and password will be given via UserInfo interface. 
     UserInfo ui=new MyUserInfo(); 
     session.setUserInfo(ui); 
     session.connect(); 

     String command=getCmd(); 

     Channel channel=session.openChannel("exec"); 

     ((ChannelExec)channel).setPty(true); 

     if(isAsIs == true){ 
      ((ChannelExec)channel).setCommand(command); 
      } 
     else{ 
      ((ChannelExec)channel).setCommand("sudo -S -p '' " + command); 
     } 

     InputStream in=channel.getInputStream(); 
      OutputStream out=channel.getOutputStream(); 
      ((ChannelExec)channel).setErrStream(System.err); 

      channel.connect(); 

      out.write((passwd+"\n").getBytes()); 
      out.flush(); 

     byte[] tmp=new byte[1024]; 
     while(true && isForceStop == false){     
      while(in.available()>0){ 
       int i=in.read(tmp, 0, 1024); 
       if(i<0)break; 

       mObserver.onResponse((new String(tmp, 0, i))); 

      } 
      if(channel.isClosed()){ 
       mObserver.onResponse("exit-status: "+channel.getExitStatus()); 
       mTimer.doNotify(); 
       break; 
      } 


      try{Thread.sleep(100);}catch(Exception ee){} 
     } 

     mObserver.onResponse("close channel ... ");   
     channel.disconnect(); 
     mObserver.onResponse("close session ... "); 
     session.disconnect(); 
    } 
    catch(Exception e){ 
     System.out.println(e); 
     mObserver.onErrorResponse(e.getMessage()); 
    } 



} 



public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{ 
    public String getPassword(){ 
     return passwd; 
    } 

    public boolean promptYesNo(String str){ 
     return true; 
    } 



    public String getPassphrase(){ return null; } 
    public boolean promptPassphrase(String message){ return true; } 
    public boolean promptPassword(String message){ 
     return true; 
    } 

    public void showMessage(String message){ 
    } 

    @Override 
    public String[] promptKeyboardInteractive(String arg0, String arg1, 
      String arg2, String[] arg3, boolean[] arg4) { 
     return null; 
    } 
} 

public void setPassword(String password){ 
    passwd=password; 
} 

public void setHost(String hostname){ 
    mHost=hostname; 
} 

public String getPassword(){ 
    return passwd; 
} 


public String getHost(){ 
    return mHost; 
} 

protected abstract String getCmd(); 

public void setObserver(SSHObserverItf observer) { 
    mObserver = observer; 
} 
} 

SSHObserverItf接口

public interface SSHObserverItf { 
public void onResponse(String line); 
public void onErrorResponse(String line); 
} 

SomeTask

public class SomeTask extends SudoExec implements SSHObserverItf{ 

private static String command = ""; 
private static String hostname = ""; 
private static String user = ""; 
private static String pass = ""; 
private static Boolean isError=false; 

private static String wait = "300"; 



static public void main(String args[]) throws IOException, ParseException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { 


    new SomeTask(hostname,user,pass); 

    if (isError == true){ 
     System.out.println("Test failed"); 
    } 
    else{ 
     System.out.println("\nSucceeded to invoke command : " + command); 
    } 

} 



public CopyPeriodMergeToExternal(String hostName, String userName, String password) throws IOException, ParseException { 

    super(hostName, userName, password); 

    SSHObserverItf observer = this; 

    super.setObserver(observer); 

    super.init(Integer.parseInt(wait) * 1000); 

} 




@Override 
protected String getCmd() { 

    isAsIs = true; 


    command="rm -f somescript.sh"; 


    System.out.println("Run followed command : " + command); 

    return command; 
} 

@Override 
public void onResponse(String line) { 
    System.out.println(line);  
} 

@Override 
public void onErrorResponse(String line) { 
    System.out.println(line); 
    System.out.println("Error has occured");   
    isError = true; 
} 
} 

SudoExec类中的主要部分是:

public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{ 
    public String getPassword(){ //  <--- 
     return passwd; 
    } 

    public boolean promptYesNo(String str){ 
     return true; //  <--- 
    } 

希望这本书能解决你的问题

+0

我尝试须藤-S -p,但没有成功。随着jsch-0.1.38.jar我会稍后尝试,但我有点迷路。让我们看看是否有人提供其他解决方案。无论如何谢谢你的帮助。 – user1260255

0

我解决问题,使用visudo命令行注释

默认requiretty