「sudo !!」で「!!」とはどういう意味ですか?


64

私はあまり経験のないUbuntuのユーザーであり、私は使用していsudoます。

何をしsudo !!、どのように?



6
@WarrenHill彼は「どのように」ではなく「何を」「どのように」を望んでいます。彼!!はコマンドの一部についてさらに尋ねます。
ブライアム

1
@Nakilonはいけません。この質問は、何をどのように!!行うかを尋ねています。もう1人は、これを行う方法を求めています。
Braiam

@MichaelKjörling関連する権利ですか?
Braiam

2
@Braiam実際に、私は重複するつもりでした。その1つに対する最も投票sudo !!数の多い2つの回答が何をするのかを具体的に説明し、実際に何を!!行うのかを具体的に説明する2つの答えがあります。
CVn

回答:


74

!!in bashは前のコマンドのエイリアスです(イベント指定子を参照)。そのため、以前のコマンドをsudo許可付きで再実行します。


15
注:!通常、コマンドはbashスクリプトでは使用できません(対話型セッションでのみ)。で無効にできますset +o histexpand
ブノワ

64

sudo bang bang コマンドラインインターフェイスで作業する場合、非常に便利なコマンドです。

一部のLinuxディストリビューションでは、管理者ではなくユーザーとしてログインします。

ですから、管理者として何かをするためには、コマンドをsudo(スーパーユーザーDO)で進めなければなりません。/ bang-bang(!= bang)は、基本的に前のコマンドを繰り返すために使用できるショートカットです。

したがって、典型的なシナリオは、コマンドを試行し、それを行うには管理者である必要があるというメッセージをキックバックすることです。そのため、sudoスーパーユーザー/管理者としてそのコマンドを実行するために入力するか、システムに指示された以前のコマンドを使用するように指示するsudo !!場所を入力することができます!!UfH

他にも多くのバングコマンドがあります。それらのリストとそれらが何であるかの説明については、Linux Bang Commandsをチェックしてください。Bashhistoryおよびbangコマンドも参照してください。


12
また、前のコマンドが何であるかを100%確信していない場合は、非常に危険なコマンドです。ほとんどの場合、上矢印、次にホームキーを押してからsudo、コマンドラインを入力して確認する方が安全です。
シャドゥール

3
@Shadur通常、以前のコマンドは約1秒前でした。通常の使用の場合は、その答えで説明したものです:あなたが忘れてsudo何かとエラーが出るので、あなたはすぐにしたいsudoこと
マイケルMrozek

1
@Braiam:CLIは略語です。コミュニティルール違反!攻撃!再編集!
インド

4
sudo「スーパーユーザーが行う」ことを意味するのではなく、コマンド行うのと同じように実行しますsu(suはユーザーの切り替え(スーパーユーザーではない)を意味します)。つまり、root(-uスイッチ)だけでなく、任意のユーザーとしてコマンドをsudoできます。同じsu [user] [-c command]
ssice

1
@Mitch以外suはそのようなことを意味しません。参照linux.die.net/man/1/sugnu.org/software/coreutils/manual/html_node/su-invocation.htmllinfo.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 / dpkg / lock-open(13:Permission denied)
E:管理ディレクトリ(/ var / lib / dpkg /)をロックできません。rootですか?

その後、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端末上のコマンドを、それはあなたがentered.Theすべてのコマンドを示し!!に参加しsudo !!、最後のコマンドが格納されているグラブコマンド履歴で、全体sudo !!が管理者権限で最後のコマンドを実行します。

他のいくつかのbangコマンドは、このブログ投稿で説明されています


3
私はそれが再び「バンバン」と述べているのを見て驚いた。一度で十分だと思いました。
キリ

1
bangコマンドのその他の例については、+ 1。
WernerCD

1
少なくともバッシュで@Rmano、と私は歴史をサポートしているすべてのBourneスタイルのシェルを期待する、mkdir LongDirectoryNamecd !$しない限り、仕事に別々に発行する必要がありLongDirectoryName、前のコマンドの最後の言葉となっていることを起こります。シェルの履歴目的のために、mkdir LongDirectoryName; cd !$1つのコマンドです。歴史との相互作用!!!^および!$シェルが実際に完全に見る前に処理された最後のコマンドを使用します!以下に例を示します。実行historyすると、結合された行のコマンド;が1つのコマンドとして記憶されることがわかります。
エリアケイガン

@EliahKaganそうですね!間違った情報を削除しました...
Rmano

13

その答えには2つの部分があります!!し、sudo

!!「履歴拡張」と呼ばれるシェルの機能の一部です(Ubuntuの場合、これはおそらくbashですが、zshやcshなどの他のシェルもこれをサポートしています)。シェルが「プレースホルダー」を一連の単語に展開するという点で、他の展開と同様に動作します。一方でfoo*「foo」で始まるすべてのファイルのリストに展開されるだろう、!!前のコマンドラインの内容を拡大します。

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

他の展開と同様に、これは完全にシェルによって実行されるため、!!他のコマンドの後に入力した場合、このコマンドはがあったことを認識せず!!、前のコマンドラインのみを表示します。(他の展開とは異なり、履歴展開は、コマンドが履歴に保存される前!!に行われます。つまり、置き換えられたコマンドラインの代わりに履歴に保存されます。)


このsudoコマンドは、セキュリティポリシーによって許可が与えられている場合、別のユーザーとしてコマンドを実行できます(デフォルトはで設定されています/etc/sudoers)。

デフォルトでは、Ubuntuではルートパスワードは設定されていません。システム管理タスクを実行するために、インストール中に作成されたユーザーにsudo権限が付与されます。このユーザーは、シェルの先頭にを追加するだけで、rootとしてコマンドを実行できsudoます。パッケージ管理など、一部のGUIプログラムもsudoメカニズムを使用します。

sudoroot(または別のユーザー)として他のコマンドを実行できる理由は、sudoバイナリ(/usr/bin/sudo)のパーミッションにsetuidビットが設定されており、rootに属しているためです。setuidビットが設定された(バイナリ)実行可能ファイルは、その所有者の権限で実行されます。これは、sudoが実際に呼び出したユーザーに関係なく、root権限で効果的に実行されることを意味します。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はroot権限でそれを表示して実行するだけです。


5

!!歴史的拡張のための構文的に最も簡単でおそらく最も一般的な表現です。

お気付きかもしれませんが、最後に実行されたコマンドをに置き換えた後!!、bashは2つのことを行います(デフォルトの構成で):

  1. 置換されたテキストを含む完全なコマンドが表示されます。

    たとえば、コマンドがlshw -c video実行されsudo !!、次に実行する場合、履歴展開後のコマンドはsudo lshw -c videoです。

  2. そのコマンドが実行されます。

通常、これらの2つのステップshopt histverifyは、デフォルトで未設定(shopt -u histverify)になっているため、中断することなく、ユーザーと対話する機会がありません。

ただし、shopt histverifyshopt -s histverify)を有効にすると、履歴展開の動作が異なります。

  1. 新しいプライマリプロンプトが表示され、展開されたテキストが自動的に入力されます。カーソルを最後に付けて自分でそのテキストを入力したが、まだコマンドを実行していないかのようです。
  2. その後、ユーザーはEnter、コマンドを実行するために押す必要があります。または、コマンドを編集、キャンセル(Ctrl+ C)などすることもできます。これは特別なプロンプトではなく、通常のプライマリプロンプトであることに注意してください。まるで自分でテキストを入力したかのようです。

histverify シェルオプション、readlineライブラリが使用されている場合のみ有効になりますが、Ubuntuまたは他のGNU / Linuxシステムでbashをインタラクティブに使用する場合、これは基本的に常に有効です。)

histverifyシェルオプションが有効かどうかに関係なく、履歴展開は他の多くのシェル展開とは異なります。他のシェル展開では、実行される前に展開されたコマンドは表示されません。対話式と非対話式の両方で(シェルスクリプトなどで)使用することを目的とした他の展開とは異なり、履歴展開はほとんどの場合インタラクティブに使用されます。


3

!Linuxでは歴史関連のショートカットに使用されます。そう、 !!前に実行したコマンドを実行するだけです。

sudoを必要とするコマンドの前にsudoを置くのを忘れたり、Permission Deniedを取得したり、そのようなことをしたりする場合に非常に役立ちます。

須藤!!
これで完了です。


0

!! 前のコマンドを繰り返し実行します。sudoを使用すると、コマンドにルート権限が付与されます。 (それはマニュアルページにありませんか?!!私はそこにそれを見ることができません。)


manページをお探しの方:man --pager='less -p "Event Designators"' bash
セビ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.