하나의 sudo로 명령 행 실행


21

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

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앞에 추가하는 방법이 없습니까?



중복되지 않습니다. 실제 Qeustion을 추출하고 제목을 변경했습니다. 이제 내가 정말로 찾고있는 것입니다
— rubo77

그것은 확실히 이었다 중복,하지만 지금은 다소 다르다. Boogy의 답변에 비추어 질문을 다시 쓴 것처럼 보입니다. 좋습니다. 좋은 답변입니다. 마감 투표를 철회했지만 여전히 불가피합니다 (문제에 관심을 기울이지 않고 질문이 마감 대기열에 있으면 자동으로 투표하는 경우가 많습니다). . 그런 일이 발생하면 채팅 에서 사례를 요청할 수도 있습니다 .
— goldilocks

답변:


13

sudo쉘 명령 앞에 붙일 수는 없으며 쉘을 호출하여 해당 명령을 다시 평가해야합니다 (변수 확장, 리디렉션 연산자를위한 파일 열기 등). 그래서 그건

sudo bash -c !!

!!이전 명령의 텍스트, 특수 문자 및 모두를 보간 하기 때문에 이것은 작동하지 않습니다 . 명령 텍스트를 문자열로 검색하여 인수로 전달해야합니다 sh. 다행히도 bash의 fc내장 기능을 사용하면 해당 기능을 수행 할 수 있습니다 ¹.

sudo bash -c "$(fc -ln -1)"

또는 현재 실행중인 동일한 버전의 bash를 호출해야합니다.

sudo "$BASH" -c "$(fc -ln -1)"

명령은 별도의 셸 프로세스에서 실행되므로 환경 변수 ( sudo유지 하는 변수 만)를 상속 하지만 셸 내부 변수 는 상속 하지 않습니다. 쉘 옵션 (예 :) kshglob및 기타 설정도 기본값에서 시작됩니다.

동일한 명령 ²은 zsh 및 ksh에서 작동하지만 ATT ksh93은 first및 last숫자를 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


9

sudo로 동일한 명령을 다시 실행하려면 !! 다음과 같은 명령을 수행 한 후 :

echo "something">/path/file

전역 바꾸기 구문을 사용하여 명령을 호출합니다.

!!:gs/>/|sudo tee -a /

-a 매개 변수 뒤에 공백을 사용하십시오 .

이것은 sudo 와 같습니다 ! <및>에 대한 sudo 제한 사항을 무시하는 데 도움이됩니다. sudo에서는 [<,>]를 사용할 수 없기 때문입니다.


리디렉션에 대해 일반적으로 sudo 제한을 무시하려면 다음과 같이 사용할 수 있습니다.

echo "something" | sudo tee myfile

tee 명령을 사용하면 표준 입력에서 읽고 표준 출력 및 파일에 쓸 수 있습니다

명령을 반복하고 파일에 텍스트를 추가하려면 tee 명령에 -a 옵션을 추가하십시오. 그래서 당신은 명령을 호출 할 수 있습니다

sudo !!

텍스트가 파일에 추가됩니다

예:

echo "something" | sudo tee -a /path/file
sudo !!

좋은 해결책이지만 암기하기가 약간 어렵습니다. !!를 사용하여 명령 의 별명을 작성하는 방법 마지막 명령을 기억하기 위해 ?
— rubo77 2016 년

는 IS -a정말 필요? >다음과 같이 파일을 덮어 쓰고 tee -a추가합니다>>
— rubo77

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

3
명령에 따옴표가 사용 된 경우 반드시 같을 필요는 없습니다. 대신 어떤 것이 인쇄 echo "foo bar"될 sh -c "echo "foo bar""것인지 고려하십시오 . foofoo bar
— godlygeek

sudo sh -c '!!'대신 명령을 시도해도 효과 가없는 경우
— rubo77

그렇다면 명령에서 작은 따옴표와 큰 따옴표를 모두 사용하면 어떻게됩니까? 또는 큰 따옴표와 변수 확장? 사용자가 a=b다음 echo "$a" >file을 수행 한 sudo sh -c '!!'경우 다음 으로 확장되어 into sudo sh -c 'echo $a >file'대신 빈 줄이 인쇄 b됩니다 file.
— godlygeek

어쨌든 더 나은 해결책이 있습니까?
— rubo77 2016 년

1
명령을 수정하지 않고도 100 % 작동하는 솔루션이 있다고 생각하지 않습니다. sudo루트 쉘을 얻는 데 사용 하고 명령을 복사하여 붙여 넣는 것이 가장 가깝지만 명령이 루트가 아닌 쉘에 설정된 변수를 사용할 것으로 예상되면 실패합니다. 사용 sudo sh -c "!!"은 간단한 명령에는 적합하지만 복잡한 명령에는 어려움이 있습니다. 최선의 조언은 100 % 작동하는 명령이 있다는 것을 기대하지 않는 것입니다. 가능한 해결책을 배우고 가장 적합한 때 각각 적용하십시오.
— godlygeek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.