Почему apt-get установил Virtual Box вместо g ++?

12

Я только что наткнулся на то, что, как мне кажется, может быть серьезной проблемой безопасности с терминалом Linux. Я пытался установить g ++ 5.0. Я новичок в Linux, поэтому я просто набрал sudo apt-get install g++ 5.0. Вместо того, чтобы просто возвращать ошибку или что-то еще, он установил Virtual Box!

Если я пытаюсь установить что-то из терминала и установить что-то совершенно другое, значит ли это, что это может произойти с чем-то другим, возможно, с вредоносным ПО? Зачем устанавливать Virtual Box, когда я набираю что-то совершенно другое?

heemayl
источник
6
... AFAIK apt-getзапросит подтверждение у пользователя, чтобы вы могли просто вставить nи не устанавливать VirtualBox ... Также проверяется хранилище Ubuntu, поэтому не должно быть никаких пакетов вредоносных программ, которые вы можете установить в первую очередь. Если вы добавите случайные PPA, это может произойти, но это потому, что вы сказали Ubuntu устанавливать приложения из ненадежного источника.
Бакуриу
1
Любимые (и +1 + конечно), потому что этот вопрос действительно заслуживает этого . Он показывает (необратимые) плохие последствия недостаточной заботы о ваших действиях и является мотивацией для вас, чтобы не делать ту же, небрежную ошибку.
EKons
12
a major security issue with the Linux terminalНет, успокойся. Это было просто (без обид!), apt-getЧто вы не читали / не печатали должным образом - никаких проблем с Linux или любым из множества доступных терминалов.
underscore_d
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++устанавливает его, но это изменится в будущем). На самом деле, нет публичной версии 5.0 GCC. Другие 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шаблонами Extended Regular Expression (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
heemayl
источник
1
+1 Самый полный и организованный ответ. Попытка буквальных совпадений, прежде чем вернуться к RE; использование расширенных RE (в отличие от простых RE); способность apt-cache searchвсе важно знать.
Ариэльф