예를 들어 파일을 만들고 한 줄에 텍스트를 입력하려는 경우 연산자를 사용하여 출력을 파일로 리디렉션할 수 있습니다 >
.
echo "something" > /path/foobar
하지만 폴더에 대한 액세스 권한이 없고 /path/
sudo 권한이 필요한 경우 sudo 권한이 있는 일반 사용자와 동일한 명령을 어떻게 수행할 수 있습니까?
나는 노력했다
sudo echo "something" > /path/foobar
하지만 그것은 작동하지 않습니다. 왜냐하면 sudo는 해당 부분에만 적용 edit
되고 오른쪽 부분
에는 포함되지 않기 때문입니다.>
sudo su
물론, 다음을 사용하거나 대신 사용하기 전에 루트가 될 수 있습니다 tee
.
echo "something" | sudo tee /path/foobar
하지만 다음을 통해 마지막 줄을 교체하여 작업할 수 있는 솔루션을 찾고 싶습니다.
sudo !!
sudo
마지막 줄을 "재활용"하고 앞에 추가하는 방법이 없나요 ?
답변1
쉘 명령 앞에만 머물 수는 없으며 sudo
해당 명령을 다시 평가하기 위해 쉘을 호출해야 합니다(변수 확장, 리디렉션 연산자를 위한 파일 열기 등의 작업 수행). 그래서 그건
sudo bash -c !!
!!
이전 명령의 텍스트, 특수 문자 및 모든 내용을 삽입하기 때문에 이것이 제대로 작동하지 않는다는 점을 제외하면. 명령의 텍스트를 문자열로 검색하고 이를 인수로 에 전달해야 합니다 sh
. 다행히 배쉬는fc
내장그렇게 할 수 있습니다 ¹.
sudo bash -c "$(fc -ln -1)"
또는 현재 실행 중인 동일한 버전의 bash를 호출하려면 다음을 수행하세요.
sudo "$BASH" -c "$(fc -ln -1)"
명령은 별도의 쉘 프로세스에서 실행되므로 환경 변수( sudo
보존하는 변수만 기억)를 상속하지만 쉘 내부 변수는 상속하지 않습니다. 쉘 옵션(예: kshglob
) 및 기타 설정도 기본값에서 시작됩니다.
동일한 명령²은 zsh 및 ksh에서 작동하지만 ATT ksh93에서는 first
및 last
숫자를 모두 3에 전달 해야 합니다 fc
(bash, zsh 및 pdksh/mksh에서도 작동함).
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
실행 중인 셸의 실행 파일을 지정하는 데 사용하는 $0
것은 셸이 $PATH를 통해 호출되고 $PATH가 변경되지 않았거나 절대 경로를 통해 호출된 경우에만 작동합니다.
약간 더 명확하지만 더 긴 zsh의 또 다른 방법은 다음과 같습니다.
sudo zsh -c $history[$[HISTCMD-1]]
마지막 경고는 sudo
잠재적으로 위험한 명령에 대한 것입니다. 너무 쉽게 사용하지 마세요!
¹ 시작 부분에 약간의 추가 공백이 있고 명령 대체는 끝 부분에서 줄 바꿈을 제거하지만 셸 구문은 이에 대해 신경 쓰지 않습니다.
² zsh나 ksh에는 bash와 같은 것이 없다고 생각합니다 $BASH
. $0
절대 경로이거나 슬래시가 없고 명령 검색 경로가 변경되지 않은 경우에만 작동합니다.
³는 ATT ksh 의 별칭이지만 그만큼 좋습니다. fc
hist
답변2
동일한 명령을 다시 실행하려면스도 !!다음과 같은 명령을 수행한 후:
echo "something">/path/file
전역 대체 구문을 사용하여 명령을 호출합니다.
!!:gs/>/|sudo tee -a /
뒤에 공백을 사용하십시오.-ㅏ매개변수.
이는 다음과 같습니다.스도 !!하지만 < 및 >에 대한 sudo 제한을 우회하는 데 도움이 됩니다. sudo에서는 [<, >] 사용을 허용하지 않기 때문입니다.
일반적으로 리디렉션에 대한 sudo 제한을 우회하려면 다음과 같이 사용할 수 있습니다.
echo "something" | sudo tee myfile
tee 명령을 사용하면 표준 입력에서 읽고 표준 출력 및 파일에 쓸 수 있습니다.
명령을 반복하고 파일에 텍스트를 추가하려면 tee 명령에 다음이 있습니다.-ㅏ추가 옵션. 따라서 다음을 사용하여 명령을 기억할 수 있습니다.
sudo !!
텍스트가 파일에 추가됩니다.
예:
echo "something" | sudo tee -a /path/file
sudo !!
답변3
다음과 같이 간단해 보입니다 sudo sh -c "!!"
.
$ cd /
$ echo hello > foo
bash: foo: Permission denied
$ sudo sh -c "!!"
sudo sh -c "echo hello > foo"
$ ls -l foo
-rw-r--r-- 1 root root 6 Jun 20 16:21 foo