Я только что наткнулся на то, что, как мне кажется, может быть серьезной проблемой безопасности с терминалом Linux. Я пытался установить g ++ 5.0. Я новичок в Linux, поэтому я просто набрал sudo apt-get install g++ 5.0
. Вместо того, чтобы просто возвращать ошибку или что-то еще, он установил Virtual Box!
Если я пытаюсь установить что-то из терминала и установить что-то совершенно другое, значит ли это, что это может произойти с чем-то другим, возможно, с вредоносным ПО? Зачем устанавливать Virtual Box, когда я набираю что-то совершенно другое?
apt-get
запросит подтверждение у пользователя, чтобы вы могли просто вставитьn
и не устанавливать VirtualBox ... Также проверяется хранилище Ubuntu, поэтому не должно быть никаких пакетов вредоносных программ, которые вы можете установить в первую очередь. Если вы добавите случайные PPA, это может произойти, но это потому, что вы сказали Ubuntu устанавливать приложения из ненадежного источника.a major security issue with the Linux terminal
Нет, успокойся. Это было просто (без обид!),apt-get
Что вы не читали / не печатали должным образом - никаких проблем с Linux или любым из множества доступных терминалов.Ответы:
Команда
означает, что вы хотите установить два пакета:
g++
и5.0
. (Имена пакетов не имеют пробелов, и apt-get принимает несколько имен пакетов, разделенных пробелами.)Вероятно, произошло то, что он установил g ++ по запросу, а затем установил все пакеты (включая номера версий), которые соответствуют регулярному выражению
5.0
(поскольку на самом деле пакет не назван5.0
). (спасибо @edwinksl!)Чтобы избежать этого, убедитесь, что у вас есть правильные имена пакетов без пробелов. Вы также можете использовать
-s
опцию для имитации действия apt-get, прежде чем делать это по-настоящему:покажет вам действия, которые будет выполнять команда , без установки чего-либо. Если все выглядит хорошо, вы можете удалить,
-s
чтобы выполнить установку.Вы также можете рассмотреть возможность использования более удобного графического менеджера пакетов, например,
synaptic
илиmuon
.источник
5.0
используется в качестве регулярного выражения, поэтомуapt
делает больше, чем просто сопоставление строки "5.0".regex
, точка соответствует любому отдельному символу. А поскольку совпадение с регулярным выражением по умолчанию выглядит в любом месте строки, это"5.0"
означает «любое имя, которое содержит 5, за которыми следуют 2 символа после 0». Примеры «FooBar 2.510» или «AcmeWidgets 5.0» («любой отдельный символ» включает буквальную точку)Правильная команда для установки
g++
версии 5.x:Это установит
g++
версию 5.3 на xenial, которая является текущим значением по умолчанию (поэтому такжеapt-get install g++
устанавливает его, но это изменится в будущем). На самом деле, нет публичной версии 5.0 GCC. Другиеg++
выпуски упакованы, например,g++-4.9
илиg++-6
, которые могут быть установлены таким же образом.Если вам когда-либо понадобится установить конкретный (существующий) выпуск,
g++
который не упакован для вашей системы, вам придется создавать его из исходных кодов .источник
sudo apt install g++5.0
(без пробела междуg++
и5.0
) все равно не удалось бы.Давайте разберемся с этим.
Прежде всего, несколько замечаний о том, как
apt-get install
(и большинство другихapt-get
аргументов тоже) работает:Вы можете ввести несколько имен пакетов:
Имена пакетов на самом деле являются
man 7 regex
шаблонами Extended Regular Expression (ERE) (Check ), поэтому имя пакетаfoo.bar
означает любое имя пакета, у которого есть подстрока, начинающаяся сfoo
и заканчивающаясяbar
любым одним символом междуfoo
иbar
. Скорее всего ,f.*r
означает , что любое имя пакета , который содержит подстроку , которая имеетf
иr
с любым количеством символов т.е. ничего между ними. Для сопоставления всего имени пакета используйте токены начала и конца, например^foo.bar$
. Если вы хотите, чтобы любой токен Regex обрабатывался буквально, вам нужно экранировать токен,\
например, для обработкиfoo.bar
буквально, вам нужно:Здесь единственная кавычка состоит в том, чтобы предотвратить интерпретацию шаблоном шаблона как шаблона с глобуляторами, в этом случае нет необходимости, но это необходимо, например, для шаблона,
foo.*bar
если у вас есть файл в текущем каталоге с именем, напримерfoo.bar
.Есть ловушка при рассмотрении названия пакета. Если есть какой-либо пакет, соответствующий шаблону, шаблон будет обрабатываться буквально, и интерпретация Regex не будет выполняться. Например, для шаблона пакета
g++
он будет соответствовать пакетуg++
буквально независимо от токена Regex+
. Еслиg++
в определенных репозиториях не было названо ни одного пакета , он будет рассматриваться как шаблон ERE.Теперь вы дали команду:
Это означает:
Вы хотите установить две модели предусмотрены пакеты , а именно
g++
и5.0
g++
соответствует буквальному метапакету,g++
как указано вышеОставшаяся часть,
5.0
имеет токен Regex,.
то есть любой отдельный символ. Так что это будет соответствовать любому имени пакета, который содержит5<any_character>0
. Таким образом, все пакеты, которые имеют соответствие, были выбраны для установки и, вероятноvirtualbox-5.0
, также были выбраны в процессе.Предположительно, вы хотите установить
g++
версию5
, поэтому сделайте следующее ( уже упоминалось в этом ответе ); Мета-пакет,g++-5
будет ссылаться на последний доступный минорный выпущенный пакетg++
версии 5:Для поиска любых пакетов в настроенных репозиториях используйте
apt-cache
(использует ERE какapt-get
):Если вы не хотите использовать Regex-ify, используйте
less
для прокрутки вниз довольно большой список:Также перед установкой чего-либо, в чем вы не уверены, не используйте опцию
-y
(--assume-yes
) и сначала протестируйте ее с помощью-s
(--simulate
/--dry-run
):источник
apt-cache search
все важно знать.