답변:
tee --append
또는을 사용하십시오 tee -a
.
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list
따옴표 안에 따옴표를 사용하지 마십시오.
콘솔로 데이터를 다시 인쇄하지 않으려면 출력을 / dev / null로 리디렉션하십시오.
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list > /dev/null
( -a
/ --append
) 플래그를 기억하십시오 ! 그냥 tee
작동 >
하고 파일을 덮어 씁니다. 파일의 끝에서 tee -a
작동 >>
하고 작성합니다.
echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstab
할 것
tee -a
대신 이어야합니다 tee --append
.
-a
명령은 파일 을 끝에 추가하는 대신 주어진 문자열로 전체 파일 을 덮어 씁니다 . --append
문제는 쉘이 sudo 또는 echo가 아닌 출력 경로 재 지정을 수행하므로 일반 사용자로 수행된다는 것입니다.
다음 코드 스 니펫을 사용해보십시오.
sudo sh -c "echo 'something' >> /etc/privilegedfile"
sh
echo는 \t
작은 따옴표 안에있는 것처럼 이스케이프 시퀀스를 해석 할 수 있습니다 . printf %s 'something'
대신 사용할 수 있습니다 .
sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"
예를 들어.
문제는 리디렉션을 처리하는 것이 쉘이라는 것입니다. sudo에서 실행중인 프로세스 의 권한이 아닌 권한으로 파일을 열려고합니다 .
아마도 다음과 같은 것을 사용하십시오 :
sudo sh -c "echo 'something' >> /etc/privilegedFile"
sudo
(보안상의 이유로) 환경을 하위 프로세스로 전파하지 않기 때문 입니다. sudo -E
이 제한을 우회 하는 데 사용할 수 있습니다 .
sudo sh -c "echo 'something' >> $FILENAME"
, 큰 따옴표로,이 것 일 - 변수 대체는 외부 쉘이 아닌 sudoed 쉘에 의해 수행된다.
sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
궁금한 점은 heredoc (큰 블록의 경우)을 인용 할 수도 있습니다.
sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<plist version=\"1.0\">
<dict>
<key>Label</key>
<string>com.company.ipfw</string>
<key>Program</key>
<string>/sbin/ipfw</string>
<key>ProgramArguments</key>
<array>
<string>/sbin/ipfw</string>
<string>-q</string>
<string>/etc/ipfw.conf</string>
</array>
<key>RunAtLoad</key>
<true></true>
</dict>
</plist>
EOIPFW"
"
하지 않으면 내부 가 제거 되지만 명령이 실패하지는 않습니다.)
bash에서는 stdout을 깨끗하게 유지하기 위해 tee
와 함께 사용할 수 있습니다 > /dev/null
.
echo "# comment" | sudo tee -a /etc/hosts > /dev/null
유의 대답을 사용하여 다음에 넣으십시오 ~/.bashrc
.
sudoe() {
[[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
echo "$1" | sudo tee --append "$2" > /dev/null
}
이제 당신은 실행할 수 있습니다 sudoe 'deb blah # blah' /etc/apt/sources.list
편집하다:
파일을 입력하거나 파일에서 리디렉션 할 수 있고 -a
추가 기능을 해제 하는 스위치가 포함 된보다 완전한 버전입니다 (기본적으로 켜져 있음).
sudoe() {
if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then
shift &>/dev/null || local failed=1
else
local append="--append"
fi
while [[ $failed -ne 1 ]]; do
if [[ -t 0 ]]; then
text="$1"; shift &>/dev/null || break
else
text="$(cat <&0)"
fi
[[ -z "$1" ]] && break
echo "$text" | sudo tee $append "$1" >/dev/null; return $?
done
echo "Usage: $0 [-a|--no-append] [text] <file>"; return 1
}
패키지 sponge
에서 사용할 수도 moreutils
있고 출력을 리디렉션 할 필요가 없습니다 (즉, tee
숨길 잡음이 없음 ).
echo 'Add this line' | sudo sponge -a privfile
어떻습니까 :
에코 텍스트 | sudo dd status = none of = privilegedfile
/ proc / sys / net / ipv4 / tcp_rmem을 변경하고 싶습니다.
내가 한 :
sudo dd status = none of = / proc / sys / net / ipv4 / tcp_rmem <<< "4096 131072 1024000"
은 한 줄 짜리 문서로 에코를 제거합니다.
이것은 나를 위해 일했다 : 원래 명령
echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment
작업 명령
echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment
tee -a
합니다. 그냥 tee
파일을 덮어 쓰게됩니다!
파일 소유권을 변경 한 다음 cat >>
추가에 사용한 후 다시 변경할 수 있습니까?
sudo chown youruser /etc/hosts
sudo cat /downloaded/hostsadditions >> /etc/hosts
sudo chown root /etc/hosts
이 같은 일이 당신을 위해 작동합니까?