apt-getがg ++ではなくVirtual Boxをインストールしたのはなぜですか?


12

Linuxターミナルのセキュリティ上の大きな問題になるのではないかと思いました。g ++ 5.0をインストールしようとしていました。私はLinuxの初心者なので、を入力しましたsudo apt-get install g++ 5.0。エラーや何かを返す代わりに、Virtual Boxをインストールしました!

ターミナルから1つのものをインストールしようとして、まったく異なるものをインストールしようとすると、それは別の何か、おそらくマルウェアに起こる可能性があるということですか?とにかくまったく違うものを入力したときにVirtual Boxがインストールされるのはなぜですか?


6
... AFAIK apt-getはユーザーに確認を求めるので、nVirtualBoxを挿入してインストールしないようにすることができます...また、Ubuntuのリポジトリもチェックされるため、最初にインストールできるマルウェアパッケージはありません。ランダムなPPAを追加するとこれが発生する可能性がありますが、それはUbuntuに信頼できないソースからアプリケーションをインストールするように指示したためです
バクリウ

1
この質問は本当にそれに値するので、Fav'd(そしてもちろん+ 1'ed)。それはあなたの行動を十分に気にかけないことの(不可逆的な)悪い影響を示しており、あなたが同じ、不注意な間違いをしないようにする動機です。
EKons

12
a major security issue with the Linux terminalいいえ、落ち着きます。これはただの(違反ではありません!)正しく読んだりタイピングしたりしていません-Linux、、apt-getまたは利用可能な多くの異なる端末のいずれにも問題はありません。
underscore_d

2
@ΈρικΚωνσταντόπουλος「不可逆的な悪影響」とは何ですか?簡単にアンインストールできる非マルウェアプログラムをインストールしますか?
バクリウ

2
「rm -rf directoryA / directoryB /」が見つかるまで待ちます(試さないでください!)。ルートとして入力して貼り付ける内容に注意する必要があります。
pjc50

回答:


29

コマンド

sudo apt-get install g++ 5.0 

は、2つのパッケージをインストールすることを示します:g++5.0。(パッケージ名にはスペースがなく、apt-getはスペースで区切られた複数のパッケージ名を受け入れます。)

おそらく起こったのは、要求に応じてg ++をインストールして5.0から、正規表現に一致するすべてのパッケージ(バージョン番号を含む)をインストールしたことです(実際に名前の付いたパッケージがないため5.0)。(ありがとう@edwinksl!)

これを回避するには、スペースなしで正しいパッケージ名を使用していることを確認してください。-sオプションを使用して、実際に実行する前にapt-getアクションをシミュレートすることもできます。

sudo apt-get -s install g++ 5.0

実際に何もインストールせずに、コマンド実行するアクションを表示します。正常に見える場合は、を削除し-sてインストールを実行できます。

synapticまたはのような初心者向けのグラフィカルパッケージマネージャーの使用を検討することもできmuonます。


4
5.0は正規表現として使用されているためapt、文字列「5.0」と一致するだけではありません。
-edwinksl

10
に慣れていない人にとってはregex、ドットは任意の1文字に一致します。また、デフォルトで正規表現の一致は文字列内の任意の場所を検索するため、"5.0"「5の後に2文字の後に0が含まれる名前」を意味します。例「FooBar 2.510」または「AcmeWidgets 5.0」(「任意の1文字」にはリテラルドットが含まれます)
-MSalters

8

g++バージョン5.x をインストールする正しいコマンドは次のとおりです。

sudo apt-get install g++-5

これによりg++、現在のデフォルトであるxenialにバージョン5.3 がインストールされます(したがってapt-get install g++、これもインストールされますが、今後変更されます)。実際、GCCのパブリック5.0リリースはありません。またはなどの他のg++リリースはパッケージ化されており、同じ方法でインストールできます。g++-4.9g++-6

g++システムにパッケージ化されていない特定の(既存の)リリースをインストールする必要がある場合は、sourcesからビルドする必要があります


2
これは良い点です。sudo apt install g++5.0g++との間のスペースなし5.0)は、まだ失敗していました。
edwinksl

4

分解しましょう。

まず第一に、apt-get install(そして他のほとんどのapt-get引数も)どのように機能するかについてのいくつかのメモ:

  • 複数のパッケージ名を入力できます:

    sudo apt-get install foobar spamegg 
    
  • パッケージ名は、実際には正規表現(ERE)(チェック拡張されているman 7 regexパッケージ名はので)パターンをfoo.barそれと始まる部分文字列を持っている任意のパッケージ名意味fooを持つと両端barの間に任意の単一文字とfooしてをbar。そうf.*r手段は、サブストリング含むすべてのパッケージ名frの間で何かすなわち、任意の数の文字とは。パッケージ名全体を照合するには、開始トークンと終了トークンを使用します(例:)^foo.bar$。正規表現トークンを文字通り\に処理foo.barする場合は、たとえば文字通り処理するためにトークンをエスケープする必要があります。

    sudo apt-get install 'foo\.bar'
    

    ここで、単一引用符は、パターンがグロビングパターンとしてシェルで解釈されるのを防ぐためのものです。この場合は必要ありませfoo.*barんが、たとえば、現在のディレクトリにegという名前のファイルがある場合はpatternに必要になりfoo.barます

  • パッケージ名の考慮事項には注意点があります。パターンに一致するパッケージがある場合、パターンは文字どおりに扱われ、正規表現の解釈は行われません。たとえば、パッケージパターンのg++場合g++、正規表現トークンに関係なく、文字通りパッケージに一致します+g++定義されたリポジトリに名前の付いたパッケージがなかった場合、EREパターンとして扱われます。

これで、コマンドが与えられました:

sudo apt-get install g++ 5.0

これの意味は:

  • つまりg++、パッケージを提供する2つのパターンをインストールします。5.0

  • g++上記のリテラルメタパッケージg++と一致します

  • 残りの部分に5.0は、正規.表現トークン、つまり任意の1文字があります。したがって、これはを含むすべてのパッケージ名と一致します5<any_character>0。そのため、一致するすべてのパッケージがインストール対象として選択されており、おそらくvirtualbox-5.0プロセスでも選択されています。

おそらく、あなたはg++version をインストールしたい5ので、次のことを行うと、(この回答ですでに述べたように); メタパッケージ、はg++-5g++バージョン5の最新のマイナーリリースパッケージを参照します。

sudo apt-get install g++-5

構成されたリポジトリ内でパッケージを検索するには、次のように使用しますapt-cache(EREなどを使用apt-get)。

apt-cache search 'g\+\+-[0-9]+'

正規表現にしたくない場合は、を使用lessして、かなり大きなリストを下にスクロールします。

apt-cache search g++ | less

また、不明なものをインストールする前に、-y--assume-yes)オプションを使用せずに、最初に-s--simulate/ --dry-run)でテストしてください。

sudo apt-get install --dry-run foobar

1
+1最も完全で組織的な回答。REにフォールバックする前にリテラル一致を試行します。拡張されたREの使用(プレーンREとは対照的に)。apt-cache search知る能力はすべて重要です。
アリエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.