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_override
sudo 구성에서 옵션을 활성화해야 하며 기본적으로는 그렇지 않습니다. sudo
stdin, 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
해야 할 것. 필요에 맞게 사용자 정의하세요. 하지만 컨텍스트가 전환되고 $?
작업이 끝나면 셸의 반환 상태가 됩니다.