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

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

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

  • 컨텍스트가 다른 사용자(이 경우 루트)로 전환됩니다.
  • 일련의 명령을 실행하여나.사용자를 생성한 다음(호출자에게 사용자 이름을 대화식으로 묻는 메시지 표시)ii.해당 사용자의 비밀번호를 설정합니다.
  • 반환 값을 얻습니다
  • 그런 다음 해당 반환 값을 사용하여 작업을 계속합니다.

나는 지금까지 << 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

해야합니다. 귀하의 필요에 맞게 이를 조정하십시오. 그러나 상황이 전환되고 $?작업이 끝나면 쉘의 반환 상태가 표시됩니다 .

관련 정보