web-dev-qa-db-ja.com

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

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

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

12
user572391

コマンド

Sudo apt-get install g++ 5.0 

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

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

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

Sudo apt-get -s install g++ 5.0

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

synapticmuonなど、より使いやすいグラフィカルパッケージマネージャーの使用を検討することもできます。

29
Nick Weinberg

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

Sudo apt-get install g++-5

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

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

8

分解しましょう。

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

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

    Sudo apt-get install foobar spamegg 
    
  • パッケージ名は実際にはExtended Regular Expression(ERE)(Check man 7 regex)パターンであるため、パッケージ名foo.barは、fooで始まり、barで終わるサブストリングを持つ任意のパッケージ名を意味します。 fooおよびbar。可能性のあるf.*rは、frを含む部分文字列を含むパッケージ名を意味します。パッケージ名全体のマッチングを行うには、開始トークンと終了トークンを使用します。 ^foo.bar$。正規表現トークンを文字通り処理する場合は、\でトークンをエスケープする必要があります。 foo.barを文字通り処理するには、次のものが必要です。

    Sudo apt-get install 'foo\.bar'
    

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

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

今、あなたはコマンドを与えました:

Sudo apt-get install g++ 5.0

これの意味は:

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

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

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

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

Sudo apt-get install g++-5

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

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
4
heemayl