sudo에 두 개의 표준 입력을 전달하는 방법은 무엇입니까?

sudo에 두 개의 표준 입력을 전달하는 방법은 무엇입니까?

내 목표는 슈퍼유저 권한이 필요한 파일에 무언가를 작성하는 것이며 한 줄의 코드로 이를 수행하고 싶습니다. 내가 시도한 단계:

다음을 통해 비밀번호를 전달할 수 있습니다.표준 입력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초기 값을 변경합니다 .userwrite-to-fileALL

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의 아이디어를 따릅니다.

  1. 루트로 로그인하고 write-to-file다음 코드로 호출되는 간단한 스크립트를 만듭니다.

    echo $1 > /etc/test.txt
    

(/usr/local/bin에 있어야 하며뿌리실행 권한).

  1. 일반 사용자는 다음을 통해 어디서나 실행할 수 있습니다.

    echo 'password' | sudo -S write-to-file "hello!"
    

이런 방식으로 한 문자열은 표준 입력으로 전달되고 다른 문자열은 인수로 전달됩니다.

노트:이 솔루션이 보안 허점으로 이어질지는 모르겠습니다. 제 생각에는 평소처럼 안전해야 한다고 생각합니다 sudo.

관련 정보