Чому apt-get встановив Virtual Box замість g ++?


12

Щойно я натрапив на щось, що мені здається, що це може бути серйозною проблемою безпеки з терміналом Linux. Я намагався встановити g ++ 5.0. Я новачок в Linux, тому я просто набрав sudo apt-get install g++ 5.0. Замість того, щоб просто повернути помилку чи щось таке, вона встановила Virtual Box!

Якщо я спробую встановити одне з терміналу, і він встановить щось зовсім інше, чи це означає, що це може статися з чимось іншим, можливо, зловмисним програмним забезпеченням? Навіщо мені встановити Virtual Box, коли я все-таки набрав щось зовсім інше?


6
... AFAIK apt-getзапитає підтвердження від користувача, щоб ви могли просто вставити nта уникнути встановлення VirtualBox ... Також перевіряється сховище Ubuntu, тому не повинно бути жодного пакету зловмисних програм, який ви можете встановити в першу чергу. Якщо ви додасте випадкові PPA, це може статися, але це тому, що ви сказали Ubuntu встановлювати програми з ненадійного джерела.
Бакуріу

1
Fav'd (і +1, звичайно), тому що це питання справді цього заслуговує . Це показує (незворотні) погані наслідки недостатньої турботи про ваші вчинки, і є мотивацією для вас не робити тієї самої, необережної помилки.
EKons

12
a major security issue with the Linux terminalНі, заспокойся. Це було просто (без образи!), Яке ви не читали / вводили належним чином - не проблема з Linux apt-get, або будь-яким з багатьох різних терміналів, які є в наявності.
підкреслюй_

2
@ ΈρικΚωνσταντόπουλος Що таке "незворотний поганий ефект"? Встановлення програми, яка не є шкідливим програмним забезпеченням, яку ви можете так само легко видалити?
Бакуріу

2
Зачекайте, поки ви знайдете "rm -rf directoryA / directoryB /" ( не намагайтеся! ). Ви повинні бути обережними, що ви вводите та вставляєте як root.
pjc50

Відповіді:


29

Команда

sudo apt-get install g++ 5.0 

вказує, що ви хочете встановити два пакети: 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, крапка відповідає будь-якому одному символу. А оскільки збіг регулярних виразів за замовчуванням виглядає в будь-якому місці рядка, "5.0"означає "будь-яке ім'я, яке містить 5, а за ним 2 символи пізніше 0". Приклади "FooBar 2.510" або "AcmeWidgets 5.0" ("будь-який єдиний символ" містить буквальну крапку)
MSalters

8

Правильна команда для встановлення 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++який не пакується для вашої системи, вам доведеться створити його з джерел .


2
Це хороший момент; sudo apt install g++5.0(без пробілу між g++і 5.0) все одно не вдалося б.
edwinksl

4

Давайте розбимо його.

Перш за все, кілька приміток про те, як apt-get install(і більшість інших apt-getаргументів теж) працює:

  • Ви можете ввести кілька назв пакета:

    sudo apt-get install foobar spamegg 
    
  • Назви пакетів насправді є man 7 regexшаблонами розширеного регулярного вираження (ERE) (Check ), тому ім'я пакета foo.barозначає будь-яке ім'я пакета, що має підрядку, яка починається з fooі закінчується barбудь-яким одним символом між fooі bar. Ймовірно, f.*rозначає будь-яке ім'я пакета, що містить підрядку, яка містить fі rбудь-яку кількість символів, тобто що-небудь між ними. Для відповідності імені всього пакету використовуйте маркери початку та кінця, наприклад ^foo.bar$. Якщо ви хочете, щоб будь-який маркер Regex був досліджений буквально, тоді вам потрібно уникнути маркера, \наприклад, для foo.barбуквального лікування , вам потрібно:

    sudo apt-get install 'foo\.bar'
    

    Тут єдине цитування полягає у запобіганні інтерпретації оболонки у вигляді шаблону, яка не потрібна в цьому випадку, але вона потрібна, наприклад, для шаблону, foo.*barякщо у вас є файл у поточному каталозі, названому напр foo.bar.

  • Існує привід щодо розгляду назви пакета. Якщо є який-небудь пакет, що відповідає шаблону, шаблон буде розглядатися буквально, і інтерпретація Regex не буде зроблена. Наприклад, для шаблону пакета g++він буде відповідати пакету g++буквально незалежно від маркера Regex +. Якщо g++в визначених сховищах не було названого пакета , він буде розглянуто як шаблон ERE.

Тепер ви дали команду:

sudo apt-get install g++ 5.0

Це означає:

  • Ви хочете встановити два надані пакети шаблонів, а саме g++і5.0

  • g++відповідає буквальному метапакету, g++як згадувалося вище

  • Інша частина, 5.0має маркер Regex, .тобто будь-який окремий символ. Таким чином, це відповідатиме будь-якій назві пакета, яка містить 5<any_character>0. Таким чином, всі пакети, які мають відповідність, були обрані для встановлення і, імовірно virtualbox-5.0, також були вибрані в процесі.

Імовірно, ви хочете встановити g++версію 5, тому зробите наступне ( вже згадувалося у цій відповіді ); Метапакет,, g++-5стосуватиметься останнього доступного другорядного пакета g++версії 5:

sudo apt-get install g++-5

Для пошуку будь-яких пакетів у налаштованих сховищах використовуйте apt-cache(використовує ERE, як apt-get):

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

Якщо ви не хочете Regex-ify це, скористайтеся lessдля прокручування вниз досить великий список:

apt-cache search g++ | less

Також перед встановленням нічого, в чому ви не впевнені, не використовуйте параметр -y( --assume-yes) і спершу протестуйте його за допомогою -s( --simulate/ --dry-run):

sudo apt-get install --dry-run foobar

1
+1 Найповніша та організована відповідь. Спробуйте буквальні матчі перед тим, як повернутись на RE; використання розширеного РЕ (на відміну від звичайних РЕ); здатність apt-cache searchбути важливими для усвідомлення.
аріельф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.