두 명령 모두 작동합니다. ( -S
in 은 sudo
sudo에게 stdin에서 비밀번호를 읽도록 지시합니다.)
echo 'mypassword' | sudo -S tee -a /etc/test.txt &> /dev/null
echo -e '\nsome\nmore\ntext' | sudo tee -a /etc/test.txt &> /dev/null
이제 두 가지를 결합하고 싶습니다. 즉, 모든 것을 한 줄에 구현하고 싶습니다. 하지만 물론 다음과 같은 것은 작동하지 않습니다.
echo -e '\nsome\nmore\ntext' | echo 'mypassword' | sudo -S tee -a /etc/test.txt &> /dev/null
무엇이 효과가 있을까요? 감사합니다 :) - 로드
추신: 관련 없는 작은 질문: 1> >과 동일합니까? 나는 그들이...
답변1
이렇게 하면 됩니다:
{ echo 'mypassword'; echo 'some text'; } | sudo -k -S tee -a /etc/test.txt &>/dev/null
요점은 동일한 표준 입력을 sudo
사용하므로 tee
둘 다 동일한 소스에서 읽힌다는 것입니다. 에 전달하려는 항목 앞에 "mypassword" + "\n"을 입력해야 합니다 tee
.
명령을 설명하십시오.
- 그룹 명령을 중괄호로 묶습니다. 우리는 그것을
{...}
명령 이라고 생각할 수 있습니다 . 콘텐츠가{...}
파이프에 어떻게 기록되는지는 중요하지 않습니다. echo 'mypassword'
파이프에 "mypassword\n"을 씁니다.sudo
나중에 읽을 내용 입니다 .echo 'some text'
파이프에 "일부 텍스트\n"을 씁니다. 이것이tee
궁극적으로 달성되는 것입니다.sudo -k -S
"\n"에 도달할 때까지 표준 입력(즉, 파이프)에서 비밀번호를 읽습니다. 따라서 "mypassword\n"은 여기에서 사용됩니다. 이 스위치는 암호를 묻는 메시지가 표시되고 사용자가 최근에 사용한 캐시된 자격 증명이 무시되도록-k
하기 위한 것입니다 .sudo
tee
표준 입력에서 읽고 남은 부분인 "일부 텍스트\n"을 가져옵니다.
추신: I/O 리디렉션 정보: 예 1>filename
, 맞습니다 >filename
. 둘 다 stdout을 .파일 이름. 그리고 0<filename
및 <filename
모두 동일하며 둘 다 표준 입력을 리디렉션합니다.
답변2
조금 늦었지만 이것이 잘 작동하는 것으로 나타났습니다.
sudo -k && echo -e "password\ntext" | sudo -S tee file > /dev/null 2>&1
여러 파이프가 필요하지 않으며 이해하기 쉽습니다.
> /dev/null 2>&1
그러면 모든 출력(암호를 묻는 출력 포함)이 /dev/null로 리디렉션됩니다.
답변3
주석에 넣을 수는 없지만 이 -k
옵션을 기존 명령과 함께 사용할 수 있습니다 sudo
.
sudo -k && echo 'some text' | { echo 'mypassword'; cat -; } | sudo -S tee -a /etc/test.txt &>/dev/null
-k
원본 에 직접 넣을 수도 있습니다 sudo
. "더 안전"할 수도 있습니다.
echo 'some text' | { echo 'mypassword'; cat -; } | sudo -k -S tee -a /etc/test.txt &>/dev/null