`!!`는`sudo !!`에서 무엇을 의미합니까?


64

나는 경험이 많지 않은 우분투 사용자이며 사용하고 sudo있습니다.

무엇을 sudo !!하고 어떻게합니까?


7
다른 쪽을 제외하고 중복 : 동일한 명령을 다시 실행하지만 sudo
CVn

6
@WarrenHill 그는 "어떻게"가 아니라 "무엇"과 "어떻게"를 원하지 않습니다. 그는 !!명령 의 일부에 대해 더 묻습니다 .
브라이 암

1
@Nakilon은해서는 안됩니다. 이 질문은 무엇을 어떻게해야하는지 묻는 것 !!입니다. 다른 하나는이를 수행하는 방법을 원합니다.
브라이 암

@ MichaelKjörling 당신은 관련된 권리를 의미 했습니까?
브라이 암

2
@Braiam 사실, 나는 중복을 의미했다. 그 하나에 대한 가장 투표 sudo !!가 많은 두 가지 답변은 구체적으로 무엇을 설명하고 실제로 실제로 무엇을 설명하는 두 가지 답변 !!이 있습니다.
CVn

답변:


74

!!bash에서 이전 명령의 별명입니다 ( 이벤트 지정자 참조 ). 따라서 sudo권한으로 이전 명령을 다시 실행합니다 .


15
참고 : !일반적으로 bash 스크립트에서는 명령을 사용할 수 없습니다 (대화식 세션에서만). 로 비활성화 할 수 있습니다 set +o histexpand.
Benoit

64

sudo bang bang 명령 행 인터페이스에서 작업 할 때 매우 유용한 명령입니다.

일부 Linux 배포판에서는 관리자 대신 사용자로 로그인해야합니다.

따라서 관리자 단위로 무언가를 수행하려면 sudo(수퍼 유저 DO)로 명령을 진행해야합니다 . 시스템에“내가 그렇게 말했기 때문에 그렇게 할 것입니다.”라는 메시지가 표시됩니다. / bang-bang (! = bang)은 기본적으로 이전 명령을 반복하는 데 사용할 수있는 바로 가기입니다.

따라서 일반적인 시나리오는 명령을 시도하고이를 수행하려면 관리자 여야한다는 메시지를 시작하는 것입니다. 따라서 sudo해당 명령을 수퍼 유저 / 관리자로 실행 하도록 입력 하거나 시스템이 이전에 시도한 명령을 사용하도록 지시하는 sudo !!위치 를 입력 할 수 있습니다 !!. UfH

다른 많은 명령이 있습니다. 그것들에 대한 설명과 그것들에 대한 설명은 Linux Bang Commands 를 확인하십시오 .Bash history 및 bang 명령 도 참조하십시오.


12
이전 명령이 무엇인지 100 % 확실하지 않으면 매우 위험한 명령이기도합니다. 위쪽 화살표를 누른 다음 홈 키를 누른 다음 sudo명령 줄 을 입력 하고 보는 것이 거의 항상 안전합니다 .
Shadur

3
@Shadur 일반적으로 이전 명령은 약 1 초였습니다. 일반적인 사용 사례는이 질문에 대해 설명하는 하나 : 당신이 잊지 sudo뭔가 오류가 있으므로 즉시 원하는 sudo그것
마이클 Mrozek

1
@Braiam : CLI는 약어입니다. 커뮤니티 규칙 위반! 공격! 다시 편집하십시오!
인도

4
sudo의미하지 않는 한, 그것은 간다 "슈퍼 유저를 수행" 명령을 것처럼 내가했던 su(SU 의미 스위치 사용자 [아니라 슈퍼 유저]); 즉, 루트 ( -u스위치) 뿐만 아니라 모든 사용자로서 명령을 sudo 할 수 있습니다 . 동일su [user] [-c command]
ssice

1
@Mitch를 제외하고 su는 그런 것을 의미 하지 않습니다. linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html을 참조하십시오 . 대체 사용자를 의미해야합니다 .
ssice

38

bang bang (!!)명령은 터미널에 입력 한 이전 명령반복하고 실행 하는 바로 가기 입니다. 이 명령은 특정 작업을 수행하기 위해 관리자 권한이 필요하다는 것을 잊었을 때 매우 유용하며, 입력만으로도 슈퍼 사용자 권한으로 반복 할 수 있습니다.

sudo !!

!! 마지막 실행 명령을 얻습니다.

예를 들면 다음과 같습니다.

apt-get update

출력은

E : 잠금 파일 / var / lib / apt / lists / lock을 열
수 없음 -열림 (13 : 권한 거부) E : / var / lib / apt / lists / 디렉토리를 잠글 수 없음 E : / var / lib
잠금 파일을 열 수 없음 lib / dpkg / lock-열기 (13 : 권한 거부)
E : 관리 디렉토리 (/ var / lib / dpkg /)를 잠글 수 없습니다. 루트입니까?

그 후에 sudo !!명령 을 실행 하면 출력은

Hit http://extras.ubuntu.com saucy/main amd64 Packages
Get:3 http://mirror.sov.uk.goscomb.net saucy-updates Release.gpg [933 B]
Hit http://ppa.launchpad.net saucy Release                                  
Hit http://extras.ubuntu.com saucy/main i386 Packages 
Hit http://mirror.sov.uk.goscomb.net saucy Release                             
99% [Waiting for headers] [Waiting for headers] [Waiting for headers]

이는 !!부분이 이전 실행 명령을 잡고 apt-get update선행 sudo부분이 명령이 수퍼 유저 권한으로 실행되도록하는 것을 의미합니다.

그리고 어떻게sudo !! 수퍼 유저 권한으로 이전 명령의 의미 실행, 우리가에 저장되어있는 터미널에 입력 일반적으로 모든 명령 command history.RUN history터미널에 명령을, 당신이이 들어온 모든 명령을 보여줍니다 !!에 참여를 sudo !!챙기고을 마지막 명령이 저장 명령 기록에서 전체 sudo !!는 관리자 권한으로 마지막 명령을 실행합니다.

다른 bang 명령어 는이 블로그 게시물에 설명되어 있습니다.


3
나는 다시 'bang bang'을 언급 한 것을보고 놀랐습니다. 한 번이면 충분하다고 생각했습니다.
kiri

1
bang 명령의 더 많은 예는 +1입니다.
WernerCD

1
@Rmano 적어도 배쉬에서, 나는 역사를 지원하는 모든 Bourne의 스타일 껍질을 기대 mkdir LongDirectoryName하고 cd !$하지 않는 일에 개별적으로 실행해야합니다 LongDirectoryName앞의 명령의 마지막 말이었다 발생합니다. 쉘 히스토리 목적으로 mkdir LongDirectoryName; cd !$하나의 명령이 있습니다. 역사의 상호 작용 !!, !^그리고 !$쉘이 실제로 완전히보기 전에 마지막으로 처리 명령을 사용합니다 !. 다음은 예입니다. 실행 history하면 연결된 행의 ;명령이 하나의 명령으로 기억되는 것을 볼 수 있습니다.
Eliah Kagan

@EliahKagan 당신이 맞아요! 잘못된 정보를 삭제했습니다 ...
Rmano

13

이 대답에 두 부분은 다음 !!sudo

!!"history expansion"이라고 불리는 쉘의 기능 중 일부입니다 (우분투의 경우 아마도 bash이지만 zsh 또는 csh와 같은 다른 쉘도이를 지원합니다). 쉘이 '자리 표시 자'를 단어 집합으로 확장한다는 점에서 다른 확장과 비슷한 방식으로 작동합니다. foo*'foo'로 시작하는 모든 파일 목록으로 확장 되지만 !!이전 명령 줄의 내용으로 확장됩니다.

$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar

다른 확장과 마찬가지로 이것은 전적으로 쉘에 의해 수행되므로 !!다른 명령 뒤에 입력하면 이 명령은을 인식하지 !!못하지만 이전 명령 행 만 볼 수 있습니다. (다른 확장과 달리, 기록 확장은 명령이 기록에 저장되기 전에 발생합니다. 즉 !!, 대체 된 명령 줄 대신 기록에 저장됩니다.)


sudo명령은 다른 사용자로 명령을 실행 허용 권한 (기본값이에 구성되어있는 보안 정책에 의해 부여 아칸소 제공 /etc/sudoers).

기본적으로 루트 암호는 Ubuntu에서 설정되어 있지 않습니다. 시스템 관리 작업을 수행하기 위해 설치 중에 생성 된 사용자에게 sudo 권한이 부여됩니다. 이 사용자는을 앞에 추가하여 쉘에서 모든 명령을 루트로 실행할 수 있습니다 sudo. 일부 GUI 프로그램은 패키지 관리와 같은 sudo 메커니즘도 사용합니다.

sudo다른 명령을 루트 (또는 다른 사용자)로 실행할 수 있는 이유 는 sudo 바이너리 ( /usr/bin/sudo)에 권한에 setuid 비트가 설정되어 있고 루트에 속해 있기 때문입니다. setuid 비트가 설정된 모든 (이진) 실행 파일은 소유자의 권한으로 실행됩니다. 즉, sudo는 실제로 어떤 사용자가 호출했는지에 상관없이 루트 권한으로 효과적으로 실행됩니다. sudo의 내부 보안 정책 만이 어떤 사용자에게 허용되는 것을 관리하고 임의의 사용자가 임의의 작업을 수행하지 못하게합니다.


그래서의 경우에 sudo !!이것은 의미

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo !!

기본적으로

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo mount /dev/sdb1 /mnt

타이핑이 적습니다. 두 경우 모두 sudo는 mount /dev/sdb1 /mnt루트 권한으로이를 보고 실행합니다.


5

!!히스토리 확장을 위한 구문 상 가장 단순하고 아마도 가장 일반적인 표현입니다 .

알다시피,에 대해 실행 된 마지막 명령을 대체 한 후 !!bash는 두 가지 작업을 수행합니다 (기본 구성).

  1. 대체 된 텍스트가 포함 된 전체 명령이 표시됩니다.

    예를 들어, 명령이 lshw -c video있고 다음에 실행하는 경우 sudo !!히스토리 확장 후 명령은 sudo lshw -c video입니다.

  2. 해당 명령이 실행됩니다.

일반적으로이 두 단계 shopt histverify는 기본적으로 설정되어 있지 않기 때문에 중단없이 사용자 상호 작용의 기회없이 발생합니다 ( shopt -u histverify).

그러나 shopt histverify( shopt -s histverify)을 활성화하면 기록 확장이 다르게 작동합니다.

  1. 확장 된 텍스트가 자동으로 입력 된 새로운 기본 프롬프트가 표시됩니다. 마치 커서를 끝에두고 텍스트를 직접 입력했지만 명령을 아직 실행하지 않은 것처럼 보입니다.
  2. 그런 다음 사용자는을 눌러 Enter명령을 실행 해야합니다 . 또는 명령을 편집하거나 취소 ( Ctrl+ C)하는 등 의 작업을 수행 할 수 있습니다.이 명령 은 특수 프롬프트가 아니라 일반 기본 프롬프트입니다. 텍스트를 직접 입력 한 것처럼 보입니다.

( histverify 쉘 옵션readline 라이브러리 를 사용 하는 경우에만 적용 되지만 Ubuntu 또는 다른 GNU / Linux 시스템에서 대화식으로 bash를 사용하는 경우에만 항상 적용됩니다.)

histverify쉘 옵션 사용 여부에 상관없이 히스토리 확장은 다른 많은 쉘 확장과 유사하지 않습니다. 다른 쉘 확장은 확장 명령이 실행되기 전에 표시되지 않습니다. 대화식 및 비 대화식으로 (예를 들어, 셸 스크립트에서) 사용되는 다른 확장과 달리 기록 확장은 거의 항상 대화식으로 사용됩니다.


3

! Linux에서는 히스토리 관련 바로 가기에 사용됩니다. !! 단순히 이전에 실행 한 명령을 실행합니다.

sudo를 요구하는 명령 앞에 놓는 것을 잊어 버렸거나 Permission Denied 또는 그와 비슷한 것을 얻는 경우에 매우 유용합니다.

sudo !!
그리고 당신은 끝났습니다.


0

!! 이전 명령을 반복하고 실행하며 sudo를 사용하면 명령에 루트 권한을 부여합니다. (man 페이지에 없습니까? !! 나는 그것을 볼 수 없습니다.)


매뉴얼 페이지를 찾는 사람 :man --pager='less -p "Event Designators"' bash
Sebi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.