2009-05-12 33 views
63

Tôi mới dùng Linux và chỉ mới bắt đầu học bash. Tôi đang sử dụng Ubuntu 9,04 và muốn thêm kho lưu trữ vào /etc/apt/sources.list từ dòng lệnh. Về cơ bản, tôi muốn làm điều này:Làm cách nào để nối văn bản vào /etc/apt/sources.list từ dòng lệnh?

sudo echo "[some repository]" >> /etc/apt/sources.list 

Tuy nhiên, ngay cả khi tôi sử dụng sudo, tôi nhận được lỗi này:

bash: /etc/apt/sources.list: Permission denied 

Làm thế nào để tránh lỗi này?

+0

Bạn cần phải đề cập đến 2 điều sau: 1) Bạn có đang trong danh sách sudoers và được thiết lập chính xác không? 2) Các quyền của tập tin /etc/apt/sources.list của bạn là gì? – sykora

Trả lời

1

Trong Karmic, bạn chỉ có thể sử dụng lệnh add-apt-repository, ít nhất là cho PPA.

Ví dụ:

sudo add-apt-repository ppa:docky 
+0

thêm -apt-repository không có trong cơ sở, để chạy nó: 'apt-get install software-properties-common' – notpeter

+0

Và dường như bây giờ có sẵn trong các hệ thống dựa trên Debian, vì vậy có lẽ là cách chính xác để thực hiện nó. – Wilf

122
echo "[some repository]" | sudo tee -a /etc/apt/sources.list 

Lệnh tee được gọi là superuser qua sudo và lập luận -a nói tee để phụ thêm vào tập tin thay vì ghi đè lên nó.

Lệnh gốc của bạn không thành công, khi chuyển hướng IO với >> sẽ được thực hiện với tư cách người dùng thông thường, chỉ tiếng vọng của bạn được thực thi bằng sudo.

Gọi một sudo subshell như

sudo sh -c 'echo "[some repository]" >> /etc/apt/sources.list' 

công trình, quá như chỉ ra bởi những người khác.

+0

Cảm ơn câu trả lời của bạn - để tham khảo trong tương lai, điều này sẽ thuộc về đâu? Hoặc bạn có nghĩa là nó không thuộc về trang web này? –

+1

@Matthew Vì nó không thực sự liên quan đến lập trình nên có lẽ nó sẽ phù hợp hơn trên serverfault.com khi nó mở cho tất cả mọi người. Hiện tại nó chỉ là phiên bản beta (http://serverfault.com/beta-access) – lothar

+4

Tôi thấy điều này hữu ích khi một lập trình viên cài đặt một số phụ thuộc; Tôi chắc chắn nghĩ rằng điều này nên được trên StackOverflow. – williampli

3

Một cách để giải quyết việc này là để làm chuyển hướng trong một subshell:

sudo sh -c 'echo "[some repository]" >> /etc/apt/sources.list' 

Bằng cách đó, quá trình sh được thực hiện dưới sudo và do đó có đặc quyền cần thiết để mở ra chuyển hướng đến /etc/apt/sources.list.

8

Quy trình shell ">", "<", ">>" vv trước khi khởi chạy các lệnh. Vì vậy, vấn đề là "sudo >>/etc/foo" cố gắng mở/etc/foo để nối thêm trước khi giành được đặc quyền.

Một vòng theo cách này là sử dụng sudo để khởi động shell khác để làm những gì bạn muốn, ví dụ:

sudo sh -c 'echo "[some repository]" >> /etc/apt/sources.list' 

Hoặc cách khác:

echo "[some repository]" | sudo sh -c 'cat >> /etc/apt/sources.list' 

Một cách tiếp cận đơn giản có thể chỉ đơn giản là sử dụng sudo để khởi chạy trình chỉnh sửa trên/etc/file :)

7

Tốt hơn để sử dụng một tập tin riêng biệt trong /etc/apt/sources.list.d như được giải thích trong other answer này.

Lưu ý rằng tên tệp PHẢI kết thúc bằng .list hoặc nó sẽ bị bỏ qua.

+0

Nhận xét của bạn nên là một phần của câu trả lời của bạn, vì vậy tôi khuyên bạn nên chỉnh sửa câu trả lời sau. – tzot

0

Nếu bạn đăng nhập là su (nếu bạn có đặc quyền), lệnh này sẽ hoạt động tốt ...

su 
echo "[some repository]" >> /etc/apt/sources.list 

Nếu bạn không phải là siêu người dùng sau đó đi với câu trả lời của Lothar.

Nếu bạn làm theo cách này hãy chắc chắn để thoát khỏi su để bạn không chạy các chương trình không cần thiết như root (superuser)

+1

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. – cpburnz

+0

Tôi đã cố gắng để trả lời tốt hơn, không chắc chắn làm thế nào nó không cung cấp một câu trả lời. Sẽ rất hữu ích khi biết thêm lý do tại sao bạn đi đến kết luận này – Shapeshifter

+0

Câu trả lời của bạn chỉ đọc nhận xét cho tôi thay vì trả lời câu hỏi vì câu hỏi của bạn về cơ bản chỉ nói câu trả lời của Lothar, và nếu OP đã là người dùng siêu, họ sẽ không gặp phải vấn đề này (sự hiểu lầm của sudo với chuyển hướng I/O). – cpburnz

3

Tiếp theo công trình đối với tôi

sudo echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | sudo tee -a /etc/apt/sources.list.d/10gen.list 
+0

nó cũng làm việc cho tôi .. –

0

Đây là giải pháp mà không sử dụng đường ống , chỉ cần đơn giản chỉnh sửa tại chỗ:

sudo ex +'$put = \"[some repository]\"' -cwq /etc/apt/sources.list 

Các ex tương đương với vi -e.

-1

đầu tiên mở hoặc tạo ra các tập tin bạn muốn chỉnh sửa nó bằng lệnh sau

1- sudo nano file_name

2- edit the file after it opens

3- ctrl+x

4- press 'Y' to say yes

và bạn đã làm xong.

Các vấn đề liên quan