Bash 스크립트에서 루트로 명령을 실행하고 싶습니다.
이 명령은 STDIN에서 읽을 수 있어야 합니다.
Bash 스크립트에 로컬 변수로 루트 비밀번호가 있는데 수동으로 입력하고 싶지 않습니다.
내가 시도했을 때 :
초기 스크립트를 루트로 실행하는 방법을 알고 있지만(실제로 사용하지만 더 나은 방법을 찾고 있음) 복잡한 논리, 다양한 사용자 및 환경 변수와 관련하여 한계가 있습니다.
sudo-NOPASSWD 방법을 알고 있지만 보안상의 이유로 사용하고 싶지 않습니다.
방법은 알고 있지만
su -c
매번 루트 비밀번호를 입력해야 합니다.
su - -c "adduser new_user"
- 나는 heredoc 방법에 대해 알고 있지만 내 STDIN을 차단합니다.
read -sp "Please, enter root password: " ROOT_PASSWD
echo
su - <<EOI
$ROOT_PASSWD
echo "<This password input is handled automatically based on previously asked password>"
# Do NOT asks user password and data as supposed to:
adduser new_user
EOI
답변1
당신은 이것을 할 수 있습니다,
echo $PASSWORD | su -c "tac <<_EOF
1
2
3
_EOF"
그러나 다른 사람들이 응답했듯이 이는 안전하지 않거나 권장되지 않습니다. 귀하의 접근 방식이 작동하지 않는 이유는 su가 실행하는 명령에 stdin을 전달하려고 할 때 su가 전체 스크립트를 덮어쓰기 때문입니다. 또한 대부분의 adduser 명령을 사용하면 표준 입력이 아닌 명령줄을 통해 비밀번호를 지정할 수 있으므로 그렇게 해야 할지 잘 모르겠습니다. su의 -c 옵션만 사용하면 충분합니다.
답변2
파일에 루트 비밀번호를 저장하는 것은 발에 총을 쏘는 것과 같습니다. 위험이 너무 높습니다.
가장 좋은 방법은 전용 작업에 대한 스크립트를 작성하고 이를setuid 비트권한(예: chmod4755) 이 작업 전용 그룹에 대한 그룹 권한을 사용하여 루트로 실행합니다. 그 스크립트습관스크립트 소유자인 루트를 제외한 모든 사람에게 쓰기 권한을 할당합니다.
그런 다음 전용 사용자 ID를 생성하여 전용 공간(예를 들어 cron, sync, daemon, lp, mail, sys 등이 있습니다.). 그런 다음 필요할 때 해당 사용자가 작업을 실행하도록 합니다. 이 접근 방식을 사용하면 제한된 작업을 수행할 수 있는 알려진 권한이 있는 구성 기능이 됩니다. 이것이 가장 깨끗한 방법입니다.
sudo의 전체 목적은 사전 정의된 프로세스를 "우회"하려고 하기 때문에 슈퍼유저 권한을 얻으려는 사용자가 실제적이고 합법적인지 확인하기 위해 대화형 인증을 강제하는 것입니다. 쉽지 않습니다.
비활성 상태를 표시하기 위해 사용하려는 시도 없이 setuid가 비활성화된 것 같습니다. 그건 코셔가 아니야!
setuid 기능을 보여주는 작은 스크립트는 다음과 같습니다.비활성:
#!/bin/sh
BASE=`basename "$0" ".sh" `
TEST="${BASE}.testor"
touch "${TEST}"
실행 중인 스크립트의 스냅샷: