2013-08-19 2 views
0

여기 내가실행 2

./execSudoScript.sh --sudoUser root --sudoPwd pass --cmd ls 
된 직후 명령을 실행할 때 sudo

#! /bin/sh 

# Initialize values of arguments 
SUDO_USER="" 
SUDO_PWD="" 
CMD_OR_SCRIPT="" 

if ! options=$(getopt -u -o : -l sudoUser:,sudoPwd:,cmd: -- [email protected]) 
then 
    echo "Wrong option given :: $1" 
    exit 1 
fi 

set -- $options 

while [ $# -gt 0 ] 
do 
    case $1 in 
     --sudoUser) 
       SUDO_USER="$2" 
       shift 
       ;; 

     --sudoPwd) 
       SUDO_PWD="$2" 
       shift 
       ;; 

     --cmd) 
       CMD_OR_SCRIPT="$2" 
       shift 
       ;; 

    esac 
    shift 
done 

if [ "$CMD_OR_SCRIPT" != "" ]; then 
    if [ "$SUDO_USER" != "" ]; then 
     if [ "$SUDO_PWD" != "" ]; then 
      echo $SUDO_PWD | sudo -k -S -u $SUDO_USER $CMD_OR_SCRIPT 
     else 
      sudo -u $SUDO_USER -k -S $CMD_OR_SCRIPT 
     fi 
    else 
     if [ "$SUDO_PWD" != "" ]; then 
      echo $SUDO_PWD | sudo -k -S $CMD_OR_SCRIPT 
     else 
      sudo $CMD_OR_SCRIPT 
     fi 
    fi 
fi 

같은 명령을 실행하기 위해 노력하고있어 내 쉘 스크립트 같은 정확한 출력을 제공 sudo를를 사용하는 명령

예상대로 현재 디렉터리의 내용을 출력으로 가져옵니다. 내가

./execSudoScript.sh --sudoUser root --sudoPwd pass --cmd ls /opt 

된 직후 명령을 실행하면하지만 난 여전히 대신 /opt의 내용을 얻는, 현재 디렉토리의 내용을 얻는다. htis를 일으키는 것이 ls 이후의 공간입니까? 이 문제를 어떻게 해결할 수 있습니까?

답변

1

스크립트는 --cmd 뒤에 하나의 인수 만 허용하는 것이 문제입니다. 즉, 명령에 하나의 토큰 만있을 수 있습니다.

모든 위치 지정 인수를 실행 명령으로 사용하고 에 "[email protected]"을 전달하는 것이 좋습니다. 그것이 작동하려면 현재하고있는 것처럼 옵션이 아닌 모든 인수를 이동하지 않아야합니다.

예를 들어,이 작업을 수행 할 수 있습니다

while [ "$#" -gt 0 ]; do 
    case "$1" in 
    --sudoUser) 
     SUDO_USER="$2" 
     shift 2;; 
    --sudoPwd) 
     SUDO_PWD="$2" 
     shift 2;; 
    *) 
     break;; 
    esac 
done 

다음, 스크립트의 나머지 부분에 대한, "[email protected]"$CMD_OR_SCRIPT모든 인스턴스를 장착합니다 (따옴표가 필요합니다). 또한 스크립트를 실행할 때 --cmd을 지정하지 마십시오. 따라서, 샘플 사용을 위해, 당신은 사용해야합니다

#!/bin/sh 

# Initialize values of arguments 
SUDO_USER="" 
SUDO_PWD="" 

while [ "$#" -gt 0 ]; do 
    case "$1" in 
    --sudoUser) 
    SUDO_USER="$2" 
    shift 2;; 
    --sudoPwd) 
    SUDO_PWD="$2" 
    shift 2;; 
    *) 
    break;; 
    esac 
done 

if [ -n "$SUDO_USER" ]; then 
    if [ -n "$SUDO_PWD" ]; then 
    echo "$SUDO_PWD" | sudo -k -S -u "$SUDO_USER" "[email protected]" 
    else 
    sudo -u "$SUDO_USER" "[email protected]" 
    fi 
else 
    if [ -n "$SUDO_PWD" ]; then 
    echo "$SUDO_PWD" | sudo -k -S "[email protected]" 
    else 
    sudo "[email protected]" 
    fi 
fi 
:

./execSudoScript.sh --sudoUser root --sudoPwd pass ls /opt 
영업의 요청에

, 여기에 전체 스크립트의 편집 된 버전입니다