내 목표는 슈퍼유저 권한이 필요한 파일에 무언가를 작성하는 것이며 한 줄의 코드로 이를 수행하고 싶습니다. 내가 시도한 단계:
다음을 통해 비밀번호를 전달할 수 있습니다.표준 입력sudo
해당 옵션을 사용 하여 -S
:
printf 'password\n' | sudo -S cat /etc/test.txt
문자열을 전달할 수도 있습니다.표준 입력뭔가를 하기 위해 sudo
:
echo 'hello' | sudo tee /etc/test.txt
그러나 같은 줄에 문자열과 비밀번호를 전달할 수는 없습니다. 가능합니까? 이 목표를 어떻게 달성할 수 있나요?
답변1
당신이 쓴
내 목표는 슈퍼유저 권한이 필요한 파일에 무언가를 쓰는 것입니다.
한 가지 방법은 그룹 쓰기 권한 등을 갖도록 파일에 대한 권한을 완화하는 것입니다. 그런 다음 관련 사용자를 그룹에 추가합니다. 로그아웃/로그인한 후에는 sudo
.
또 다른 "올바른" 방법 은 쓰기 프로세스를 관리하는 스크립트를 만든 다음 선택한 사용자가 비밀번호를 제공할 필요가 없도록 sudo
스크립트에 권한을 부여하는 것입니다 . /etc/sudoers
이것의 가장 큰 장점은 대상 사용자라도 대상 파일에 무료로 액세스할 수 없다는 것입니다. 스크립트는 입력을 파일에 쓰기 전에 검증하고 정리할 수 있습니다.
루트 쉘을 얻으십시오. 이것을 켜놓고 sudo
작동이 확실할 때까지 닫지 마십시오.
sudo -s
이제 스크립트를 작성해 보세요.
cat >/usr/local/bin/write-to-file <<'EOF'
#!/bin/bash
#
export PATH=/usr/local/bin:/usr/bin:/bin # Only necessary for a non-standard PATH
# Restart with sudo if we are not already root
[[ $(id -u) != 0 ]] && exec sudo "$0" "$@"
# Read just one line into the target file
head -n1 >/etc/test.txt
EOF
이 루트 셸을 계속 사용하여 스크립트를 실행 가능하게 만든 다음 에 줄을 추가합니다 . 암호 없이 실행할 수 있는 사용자 계정 또는 허용되는 경우 모든 사용자 에 대한 sudoers
초기 값을 변경합니다 .user
write-to-file
ALL
chown root /usr/local/bin/write-to-file # Ensure no-one else can modify the script
chmod a+rx,go-w /usr/local/bin/write-to-file # Make it executable
echo 'user ALL = NOPASSWD: /usr/local/bin/write-to-file' >/etc/sudoers.d/write-to-file
아직 루트 셸을 닫지 마세요.
루트가 아닌 다른 터미널에서 새 스크립트를 테스트합니다. 당신이 write-to-file: command not found
당신 /usr/local/bin
의 경로에 없다면 (실행 export PATH="$PATH:/usr/local/bin"
)
echo hello | write-to-file # Should not prompt for password
cat /etc/test.txt # Should contain "hello"
write-to-file < /etc/passwd # Multiline input
cat /etc/test.txt # Contains only the first line from passwd
sudo
를 사용할 필요도 없다는 점에 유의하세요 . 무슨 일이 일어나는지는 스크립트가 루트로 실행되고 있지 않고 sudo
.
답변2
서브쉘을 사용하세요:
(echo "password"; cat /some/file ) | sudo -S tee /etc/test.txt
여기서 cat /some/file
출력을 생성하는 모든 명령이 될 수 있습니다.
답변3
이는 보조 파일을 사용하여 대상 파일을 작성한다는 @roaima의 아이디어를 따릅니다.
루트로 로그인하고
write-to-file
다음 코드로 호출되는 간단한 스크립트를 만듭니다.echo $1 > /etc/test.txt
(/usr/local/bin에 있어야 하며뿌리실행 권한).
일반 사용자는 다음을 통해 어디서나 실행할 수 있습니다.
echo 'password' | sudo -S write-to-file "hello!"
이런 방식으로 한 문자열은 표준 입력으로 전달되고 다른 문자열은 인수로 전달됩니다.
노트:이 솔루션이 보안 허점으로 이어질지는 모르겠습니다. 제 생각에는 평소처럼 안전해야 한다고 생각합니다 sudo
.