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