2013-09-22 5 views
0

내 새로운 문제점은 java에서 sudo 권한을 요청하는 bash 쉘 스크립트를 실행하는 것입니다. 내가 ds-389 데이터베이스를 ldif 형식으로 명령 줄을 사용하여 내보내려면이 작업은 ns-slapd db2ldif 명령으로 수행됩니다. 여기 내 자바 간단한 코드는이 작업을 수행하는 주입니다 :java (netbeans)에서 root 권한이 필요한 bash 스크립트를 실행하십시오.

example.sh이 프로젝트 디렉토리에 위치하고 접근에 문제가되지 않습니다
ProcessBuilder p = new ProcessBuilder("/bin/bash", "example.sh"); 
final Process process = p.start(); 

. 또한 chmod 777로 실행되도록 스크립트에 권한을 추가합니다. Example.sh이있는 경우에만이 :

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 

하지만 결과 ..이없는 그래이 변경 나를 예를 실행할 수 :

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

무엇 내가 지금까지 시도하는이 라인 visudo를 함께 추가입니다 .sh 암호를 묻지 않고 명령 행에서. 내가 자바에서 이것을 시도 할 때 작동하지 않으며/tmp에 file.ldif가 생성되지 않았다. 모든 도움을 환영합니다. 시간 내 주셔서 감사합니다.

답변

0

sudo -S -p을 사용해보세요.

다른 방법으로 JSch 클래스를 사용하여 jsch-0.1.38.jar에 있습니다.

아이디어는 콘솔에서 Java 코드로 sudo 입력을 리디렉션하는 것입니다.

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; //  <--- 
    } 

는 내가 visudo를를 사용하여 라인을

기본 requiretty

을 주석으로 문제를 해결 문제

+0

sudo -S -p를 시도했지만 성공하지 못했습니다. jsch-0.1.38.jar을 사용하면 나중에 시도하지만 조금 잃어 버릴 수 있습니다. 누군가 다른 해결책을 제시하는지 봅시다. 어쨌든 도와 주셔서 감사합니다. – user1260255

관련 문제