Tại sao apt-get cài đặt Virtual Box thay vì g ++?


12

Tôi vừa gặp một cái gì đó mà tôi tự hỏi có thể là một vấn đề bảo mật lớn với thiết bị đầu cuối Linux. Tôi đã cố gắng cài đặt g ++ 5.0. Tôi là người mới sử dụng Linux, vì vậy tôi mới gõ sudo apt-get install g++ 5.0. Thay vì chỉ trả về một lỗi hoặc một cái gì đó, nó đã cài đặt Virtual Box!

Nếu tôi cố gắng cài đặt một thứ từ thiết bị đầu cuối và nó cài đặt một thứ hoàn toàn khác, điều đó có nghĩa là nó có thể xảy ra với thứ khác, có thể là phần mềm độc hại? Tại sao nó lại cài đặt Virtual Box khi tôi gõ một cái gì đó hoàn toàn khác?


6
... AFAIK apt-getsẽ yêu cầu xác nhận từ người dùng, vì vậy bạn chỉ cần chèn nvà tránh cài đặt VirtualBox ... Ngoài ra, kho lưu trữ của Ubuntu cũng được kiểm tra, do đó không nên có bất kỳ gói phần mềm độc hại nào bạn có thể cài đặt ngay từ đầu. Nếu bạn thêm PPA ngẫu nhiên thì điều này có thể xảy ra nhưng đó là vì bạn đã bảo Ubuntu cài đặt các ứng dụng từ một nguồn không đáng tin cậy.
Bakuriu

1
Fav'd (và + 1'ed dĩ nhiên) vì câu hỏi này thực sự xứng đáng . Nó cho thấy những tác động xấu (không thể đảo ngược) của việc không đủ quan tâm đến hành động của bạn và là động lực để bạn không làm điều tương tự, sai lầm bất cẩn.
EKons

12
a major security issue with the Linux terminalKhông, bình tĩnh. Đây chỉ là (không vi phạm!) Bạn không đọc / gõ đúng cách - không có vấn đề gì với Linux apt-get, hoặc bất kỳ thiết bị đầu cuối nào khác có sẵn.
gạch dưới

2
@ Έρ Cài đặt chương trình không chứa phần mềm độc hại mà bạn có thể dễ dàng gỡ cài đặt?
Bakuriu

2
Đợi cho đến khi bạn phát hiện ra "rm -rf thư mụcA / thư mụcB /" ( đừng thử! ). Bạn phải cẩn thận những gì bạn gõ và dán như root.
pjc50

Câu trả lời:


29

Lệnh

sudo apt-get install g++ 5.0 

cho biết bạn muốn cài đặt hai gói: g++5.0. (Tên gói không có khoảng trắng và apt-get chấp nhận nhiều tên gói, được phân tách bằng dấu cách.)

Điều có thể xảy ra là nó đã cài đặt g ++ theo yêu cầu, sau đó cài đặt tất cả các gói (bao gồm cả số phiên bản) khớp với biểu thức thông thường 5.0(vì không có gói nào thực sự được đặt tên 5.0). (cảm ơn @edwinksl!)

Để tránh điều này, hãy đảm bảo bạn có tên gói chính xác, không có dấu cách. Bạn cũng có thể sử dụng -stùy chọn để mô phỏng hành động apt-get trước khi thực hiện:

sudo apt-get -s install g++ 5.0

sẽ cho bạn thấy các hành động mà lệnh sẽ thực hiện mà không thực sự cài đặt bất cứ thứ gì. Nếu nó ổn, bạn có thể gỡ bỏ -sđể thực hiện cài đặt.

Bạn cũng có thể xem xét sử dụng trình quản lý gói đồ họa thân thiện với người mới hơn, chẳng hạn như synaptic hoặc muon.


4
5.0đang được sử dụng như một biểu thức chính quy, do đó, aptđang thực hiện nhiều hơn là chỉ khớp chuỗi "5.0".
edwinksl

10
Đối với những người không quen thuộc regex, một dấu chấm phù hợp với bất kỳ nhân vật nào. Và vì một kết hợp regex theo mặc định trông bất cứ nơi nào trong một chuỗi, "5.0"có nghĩa là "bất kỳ tên nào chứa 5, theo sau 2 ký tự bằng 0". Ví dụ "FooBar 2.510" hoặc "AcmeWidgets 5.0" ("bất kỳ ký tự đơn nào" không bao gồm dấu chấm)
MSalters

8

Lệnh đúng để cài đặt g++ phiên bản 5.x là:

sudo apt-get install g++-5

Điều này sẽ cài đặt g++phiên bản 5.3 trên xenial, đây là mặc định hiện tại (vì vậy cũng sẽ cài đặt phiên bản apt-get install g++này, nhưng điều này sẽ thay đổi trong tương lai). Trong thực tế, không có bản phát hành 5.0 công khai GCC . Các g++bản phát hành khác được đóng gói, ví dụ g++-4.9hoặc g++-6, có thể được cài đặt theo cùng một cách.

Nếu bạn cần cài đặt một bản phát hành cụ thể (hiện có) g++chưa được đóng gói cho hệ thống của mình, bạn sẽ phải xây dựng nó từ các nguồn .


2
Đây là một quan điểm tốt; sudo apt install g++5.0(không có khoảng cách giữa g++5.0) vẫn sẽ thất bại.
edwinksl

4

Hãy phá vỡ nó.

Trước hết, một số lưu ý về cách apt-get install(và hầu hết các apt-getđối số khác cũng vậy) hoạt động:

  • Bạn có thể nhập nhiều tên gói:

    sudo apt-get install foobar spamegg 
    
  • Tên gói thực sự là man 7 regexcác mẫu Biểu thức chính quy mở rộng (ERE) (Kiểm tra ) để tên gói foo.barcó nghĩa là bất kỳ tên gói nào có chuỗi con bắt đầu foovà kết thúc barbằng bất kỳ ký tự đơn nào giữa foobar. Có khả năng f.*rcó nghĩa là bất kỳ tên gói nào có chứa một chuỗi con có frvới bất kỳ số lượng ký tự nào, tức là bất cứ thứ gì ở giữa. Để thực hiện khớp toàn bộ tên gói, hãy sử dụng mã thông báo bắt đầu và kết thúc, vd ^foo.bar$. Nếu bạn muốn bất kỳ mã thông báo Regex nào được xử lý theo nghĩa đen thì bạn cần phải thoát mã thông báo với \ví dụ: để xử lý theo foo.barnghĩa đen, bạn cần:

    sudo apt-get install 'foo\.bar'
    

    Ở đây, trích dẫn duy nhất là để ngăn việc diễn giải shell của mẫu dưới dạng mẫu hình cầu, không cần thiết trong trường hợp này nhưng sẽ là cần thiết, ví dụ cho mẫu foo.*barnếu bạn có một tệp trong thư mục hiện tại có tên, vd foo.bar.

  • Có một lưu ý về việc xem xét tên gói. Nếu có bất kỳ gói nào khớp với mẫu, mẫu sẽ được xử lý theo nghĩa đen và không có giải thích Regex nào được thực hiện. Ví dụ: đối với mẫu gói g++, nó sẽ khớp với gói theo g++nghĩa đen không phân biệt mã thông báo Regex +. Nếu không có gói có tên g++trong kho được xác định, nó sẽ được coi là mẫu ERE.

Bây giờ, bạn đã đưa ra lệnh:

sudo apt-get install g++ 5.0

Điều này có nghĩa là:

  • Bạn muốn cài đặt hai mẫu được cung cấp gói g++5.0

  • g++khớp với gói meta theo nghĩa đen g++như đã đề cập ở trên

  • Phần còn lại 5.0, có mã thông báo Regex, .tức là bất kỳ ký tự đơn nào. Vì vậy, điều này sẽ phù hợp với bất kỳ tên gói có chứa 5<any_character>0. Vì vậy, tất cả các gói có khớp đã được chọn để cài đặt và có lẽ virtualbox-5.0cũng đã được chọn trong quy trình.

Có lẽ bạn muốn cài đặt g++phiên bản 5, do đó, làm như sau sẽ làm ( đã được đề cập trong câu trả lời này ); Gói meta g++-5, sẽ đề cập đến gói phát hành nhỏ mới nhất có sẵn của g++phiên bản 5:

sudo apt-get install g++-5

Để tìm kiếm bất kỳ gói nào, trong kho được cấu hình, hãy sử dụng apt-cache(sử dụng ERE như apt-get):

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

Nếu bạn không muốn Regex-ify, hãy sử dụng lessđể cuộn xuống danh sách khá lớn hơn:

apt-cache search g++ | less

Ngoài ra trước khi cài đặt bất cứ thứ gì bạn không chắc chắn, đừng sử dụng tùy chọn -y( --assume-yes) và kiểm tra trước với -s( --simulate/ --dry-run):

sudo apt-get install --dry-run foobar

1
+1 Câu trả lời đầy đủ và có tổ chức nhất. Thử các trận đấu theo nghĩa đen trước khi quay trở lại với REs; việc sử dụng RE mở rộng (trái ngược với RE đơn giản); khả năng apt-cache searchlà tất cả quan trọng để nhận thức được.
thân
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.