sudo로 명령줄 실행

sudo로 명령줄 실행

예를 들어, 파일을 만들고 한 줄에 텍스트를 입력하려는 경우 연산자를 사용하여 출력을 파일로 리디렉션할 수 있습니다 >.

echo "something" > /path/foobar

하지만 폴더에 대한 액세스 권한이 없고 /path/sudo 권한이 필요한 경우 sudo 권한이 있는 일반 사용자와 동일한 명령을 어떻게 수행할 수 있습니까?

나는 노력했다

sudo echo "something" > /path/foobar

edit하지만 sudo는 평가 만 하기 때문에 작동하지 않습니다.
>

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의 별칭이지만 그만큼 좋습니다. fchist

답변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

관련 정보