Apt-get neden g ++ yerine Virtual Box yükledi?


12

Linux terminalinde büyük bir güvenlik sorunu olabileceğini düşündüğüm bir şeyle karşılaştım. G ++ 5.0 yüklemeye çalışıyordum. Ben Linux'a yeniyim, bu yüzden yeni yazdım sudo apt-get install g++ 5.0. Bir hata veya başka bir şey döndürmek yerine, Virtual Box'ı yükledi!

Terminalden bir şey yüklemeye çalışırsam ve tamamen farklı bir şey yüklerseniz, bunun başka bir şeye, muhtemelen kötü amaçlı bir duruma gelebileceği anlamına mı gelir? Zaten tamamen farklı bir şey yazdığımda neden Virtual Box'ı kursun ki?


6
... AFAIK apt-getkullanıcıdan onay isteyecektir, bu yüzden nVirtualBox'ı takıp takmaktan kaçınabilirsiniz ... Ayrıca Ubuntu'nun deposu da kontrol edilir, bu yüzden ilk etapta kurabileceğiniz herhangi bir kötü amaçlı yazılım paketi olmamalıdır. Rastgele PPA'lar eklerseniz bu olabilir, ancak bunun nedeni Ubuntu'ya güvenilir olmayan bir kaynaktan uygulama yüklemesini söylemiş olmanızdır .
Bakuriu

1
Fav'd (ve tabii ki + 1'ledi) çünkü bu soru gerçekten hak ediyor . Eylemleriniz için yeterince önemsememenin (geri döndürülemez) kötü etkilerini gösterir ve aynı, dikkatsiz hatayı yapmamanız için bir motivasyondur.
EKons

12
a major security issue with the Linux terminalHayır, sakin ol. Bu sadece (suç yok!) Düzgün okuma / yazma değil - Linux ile ilgili herhangi bir sorun apt-getveya mevcut birçok farklı terminalden herhangi biri değildi.
underscore_d

2
@ ΈρικΚωνσταντόπουλος "Geri dönüşü olmayan kötü etki" nedir? Kolayca kaldırabileceğiniz kötü amaçlı olmayan bir program mı yüklüyorsunuz?
Bakuriu

2
"Rm -rf directoryA / directoryB /" öğesini bulana kadar bekleyin ( denemeyin! ). Kök olarak ne yazıp yapıştırdığınıza dikkat etmelisiniz.
pjc50

Yanıtlar:


29

Komuta

sudo apt-get install g++ 5.0 

, iki paket yüklemek istediğinizi belirtir: g++ve 5.0. (Paket adlarında boşluk yoktur ve apt-get boşluklarla ayrılmış birden fazla paket adını kabul eder.)

Muhtemelen olan şey, g ++ 'yı istendiği gibi yükledikten sonra normal ifadeyle eşleşen tüm paketleri (sürüm numaraları dahil) yüklemesidir ( 5.0aslında adlandırılmış bir paket olmadığından 5.0). (teşekkürler @edwinksl!)

Bunu önlemek için boşluk olmadan, doğru paket adlarına sahip olduğunuzdan emin olun. Bu -sseçeneği, gerçek bir işlem yapmadan önce uygun bir işlemi simüle etmek için de kullanabilirsiniz :

sudo apt-get -s install g++ 5.0

Komut bu da seni eylemleri gösterecektir ediyorum aslında bir şey yüklemeden, gerçekleştirin. Tamam görünüyorsa -s, kurulumu gerçekleştirmek için öğesini kaldırabilirsiniz .

Ayrıca gibi, bir daha acemi dostu grafiksel paket yöneticisini kullanarak düşünebiliriz synapticya muon.


4
5.0regex olarak kullanılıyor, bu nedenle apt"5.0" dizesini eşleştirmekten daha fazlasını yapıyor.
edwinksl

10
Aşina olmayan insanlar için regex, bir nokta herhangi bir tek karakterle eşleşir. Normalde bir normal ifade eşleşmesi bir dizede herhangi bir yere baktığından, "5.0""5 içeren herhangi bir ad, ardından 2 karakter sonra 0" anlamına gelir. Örnekler "FooBar 2.510" veya "AcmeWidgets 5.0" ("herhangi bir tek karakter" değişmez bir nokta içerir)
MSalters

8

g++5.x sürümünü yüklemek için doğru komut :

sudo apt-get install g++-5

Bu g++, geçerli varsayılan olan xenial sürüm 5.3'ü yükleyecektir (bu yüzden de apt-get install g++yükler, ancak bu gelecekte değişecektir). Aslında, GCC'nin halka açık 5.0 sürümü yoktur . Diğer g++sürümler paketlenir, örneğin g++-4.9veya g++-6aynı şekilde kurulabilen.

g++Sisteminiz için paketlenmemiş belirli (mevcut) bir sürümünü yüklemeniz gerekirse , onu kaynaklardan oluşturmanız gerekir .


2
Bu iyi bir nokta; sudo apt install g++5.0( g++ve arasındaki boşluk olmadan 5.0) yine de başarısız olur.
edwinksl

4

Hadi yıkalım.

Her şeyden önce, apt-get install(ve diğer birçok apt-getargümanın da) nasıl çalıştığına dair birkaç not :

  • Birden fazla paket adı girebilirsiniz:

    sudo apt-get install foobar spamegg 
    
  • Paket isimleri aslında Normal İfade (ERE) (Kontrol Genişletilmiş edilir man 7 regexbir paket adı böylece) desenleri foo.barbununla başlar bir alt sahip herhangi bir paket adı anlamına gelir foove uçlar bararasındaki herhangi bir tek karakteri ile foove bar. Muhtemelen f.*rbir alt dizeyi içeren fve rherhangi bir sayıda karakter içeren bir paket adı anlamına gelir . Paket adı eşleşmesinin tamamını yapmak için başlangıç ​​ve bitiş jetonlarını kullanın örn ^foo.bar$. Herhangi bir Regex jetonunun tam anlamıyla işlem görmesini istiyorsanız, jetondan \örneğin foo.bartam anlamıyla tedavi etmek için kaçmanız gerekir:

    sudo apt-get install 'foo\.bar'
    

    Burada tek tırnak, desenin bir globbing paterni olarak kabuk yorumlanmasını önlemektir, bu durumda gerekli değildir, ancak örneğin foo.*bar, geçerli dizinde örn foo.bar.

  • Paket adı değerlendirmesinde bir yakalama var. Kalıpla eşleşen herhangi bir paket varsa, kalıp tam anlamıyla işleme tabi tutulacak ve Regex yorumlaması yapılmayacaktır. Örneğin, bir paket deseni için g++, g++Regex simgesinden bağımsız olarak paketle tam olarak eşleşecektir +. g++Tanımlanan depolarda adlandırılmış bir paket yoksa, ERE kalıbı olarak değerlendirilir.

Şimdi, şu komutu verdiniz:

sudo apt-get install g++ 5.0

Bu şu anlama gelir:

  • İki desenler paketleri yani sağlanan yüklemek istediğiniz g++ve5.0

  • g++g++yukarıda belirtilen gerçek meta paketiyle eşleşir

  • Kalan kısım, 5.0bir Regex jetonuna, .yani herhangi bir tek karaktere sahiptir. Yani bu, içerdiği tüm paket adlarıyla eşleşir 5<any_character>0. Bu nedenle, eşleşen tüm paketler yüklenmek üzere seçildi ve muhtemelen virtualbox-5.0süreçte seçildi.

Muhtemelen g++sürümü yüklemek istiyorsunuz 5, bu yüzden aşağıdakileri yapmak ( bu cevapta zaten belirtilmiştir ); Meta-paket, sürüm 5'in g++-5mevcut en son küçük g++sürüm paketine atıfta bulunacaktır :

sudo apt-get install g++-5

Yapılandırılmış depolarda herhangi bir paketi aramak için şunu kullanın apt-cache(ERE benzeri kullanır apt-get):

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

Regex-ify istemiyorsanız, lessdaha büyük listeyi aşağı kaydırmak için kullanın :

apt-cache search g++ | less

Ayrıca emin olmadığınız bir şeyi kurmadan önce -y( --assume-yes) seçeneğini kullanmayın ve önce -s( --simulate/ --dry-run) ile test edin :

sudo apt-get install --dry-run foobar

1
+1 En eksiksiz ve organize cevap. RE'lere geri dönmeden önce gerçek maçları denemek; genişletilmiş RE kullanımı (düz RE'lerin aksine); apt-cache searchfarkında olma becerisi önemlidir.
arielf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.