하나의 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은 firstlast숫자를 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.