다른 사용자로 대화형 명령을 실행하는 방법

다른 사용자로 대화형 명령을 실행하는 방법

bash 스크립트를 작성하려고 합니다.

  • 다른 사용자로 컨텍스트 전환(이 경우 루트)
  • 일련의 명령 실행나.사용자를 생성하고(발신자에게 대화형으로 사용자 이름을 묻는 메시지 표시) 다음둘.이 사용자의 비밀번호를 설정하세요
  • 반환 값을 얻으십시오
  • 그런 다음 계속해서 작업을 수행하고 값을 반환합니다.

지금까지 << EOF 입력(그림. 1), 함수(그림 2), 별도의 스크립트를 가져오거나 실행합니다(이미지 3). 하지만 아직 원하는 결과를 얻지 못하고 있습니다.

sudo su - << 'EOF'
# do stuff...
EOF

그림. 1

function myfunc()
{
    local  myresult='some value'
    echo "$myresult"
}

그림 2

sudo su - -c bash <(curl -fksSL https://<my-script-location>.sh)

이미지 3

답변1

sudo su - << 'EOF'
# do stuff...
EOF

이것은 작동하지만 한 가지 제한 사항이 있습니다. 스크립트는 표준 입력을 통해 셸에 전달되므로 생성하려는 사용자 이름을 읽는 것과 같은 다른 목적으로는 표준 입력을 사용할 수 없습니다.

표준 입력을 보존하는 간단한 방법은 쉘 명령을 인수로 전달하는 것입니다.

이는 sudo su중복된다는 점에 유의하세요. sudo지정된 명령을 루트로 실행하는 것이 su유일한 목적입니다. 로그인 쉘을 루트로 실행하거나(여기서는 아마도 불필요함) 루트로 쉘을 실행하려면 대신 사용하십시오 sudo -i.sudo su -sudo sh

sudo sh -c '
  # do stuff...
'

이로 인해 쉘 코드 조각에서 작은따옴표를 사용하는 것이 어색해집니다. '\''작은따옴표로 묶인 텍스트 안에 작은따옴표를 넣을 수 있습니다 . 여기 문서 구조를 유지하려면 여러 가지 방법이 있습니다. 가장 직접적인 방법은 here 문서를 업로드하는 것입니다.다른 설명자에 대해. 그러나 이를 위해서는 closefrom_overridesudo 구성에서 옵션을 활성화해야 하며 기본적으로는 그렇지 않습니다. sudostdin, stdout 및 stderr을 제외한 모든 파일 설명자는 닫힙니다.

sudo -C 3 sh -c '. /dev/fd/3' 3<<'EOF'
# do stuff...
EOF

이 옵션이 활성화되지 않은 시스템에 코드를 이식하려면 heredoc에서 스크립트를 읽고 이를 셸에 인수로 전달할 수 있습니다.

script=$(cat <<'EOF'
# do stuff...
EOF
)
sudo sh -c "$script"

또는 sudoed 스크립트를 터미널에서 읽을 수 있도록 하려면 표준 입력으로 스크립트 본문을 전달할 수 있습니다. 이 접근 방식의 한 가지 제한 사항은 전체 스크립트 입력의 리디렉션을 허용하지 않는다는 것입니다.

sudo sh <<'EOF'
exec </dev/tty
# do stuff...
EOF

답변2

호출 사용자가 다음 sudo을 할당할 수 있다고 가정합니다 tty.

Defaults someuser:requiretty

ans에는 필요한 명령을 루트로 실행할 수 있는 권한이 부여되었습니다.

Cmnd_Alias STUFF = /usr/bin/passwd, /usr/sbin/useradd
someuser ALL = STUFF

호출이 포함된 스크립트 sudo는 대화형입니다. 사용자 이름을 위치 매개변수로 전달할 수 있습니다.

sudo useradd $1
sudo passwd $1

평소대로 사용하여 반품 상태를 확인하세요 $?.

답변3

su -c '. /dev/fd/4' 4<<\SCRIPT
    ...automated stuff here...
    ....then for interactive...
    exec </dev/tty
SCRIPT

해야 할 것. 필요에 맞게 사용자 정의하세요. 하지만 컨텍스트가 전환되고 $?작업이 끝나면 셸의 반환 상태가 됩니다.

관련 정보