Câu hỏi Làm thế nào để nối thêm vào một tệp dưới dạng sudo?


Có thể trùng lặp:
sudo không thể ghi vào / etc / profile 

Tôi muốn làm:

echo "something" >> /etc/config_file

Nhưng, vì chỉ người dùng root mới có quyền ghi vào tệp này nên tôi không thể làm điều đó. Nhưng những điều sau cũng không hiệu quả.

sudo echo "something" >> /etc/config_file

Có cách nào để thêm vào một tập tin trong tình huống đó mà không cần phải mở nó lần đầu tiên sudo'd biên tập và sau đó nối thêm nội dung mới bằng tay?


221
2018-05-01 05:50


gốc


Tôi đang sử dụng Ubuntu 9,04 và tôi có thể sử dụng sudo cho mọi lệnh mà tôi cần cho đến nay. Sinh sản một sub-shell làm việc. - Matt Norris
Có liên quan mạnh mẽ: Đang chuyển hướng stdout sang tệp bạn không có quyền ghi vào(trên Unix và Linux). Yếu liên quan: ls với đường dẫn thư mục hiển thị tệp nhưng ls với mẫu tập tin không? - Scott


Các câu trả lời:


Công cụ phù hợp cho nhiệm vụ phù hợp: 'tee'

tee - read from standard input and write to standard output and files

Vì vậy, dòng lệnh của bạn sẽ trở thành

% echo "output" | sudo tee -a file

Ưu điểm của tee trên thực thi Bash với quyền quản trị là:

  • Bạn không thực thi Bash với quyền quản trị
  • Chỉ phần 'ghi vào tệp' mới chạy với quyền nâng cao
  • Việc trích dẫn một lệnh phức tạp dễ dàng hơn nhiều

329
2018-05-01 06:25



Trên OS X tee dường như chỉ có một lá cờ. - user495470
Debian 8 tee có -a nối thêm cờ. - clay
Sử dụng echo "output" | sudo tee -a file > /dev/null nếu bạn muốn bỏ qua đầu ra của bàn điều khiển. - Moshe Bixenshpaner
Hoạt động tốt cho WSL. - kayleeFrye_onDeck


Việc chuyển hướng được thực hiện trong trình bao hiện tại. Để thực hiện chuyển hướng với các đặc quyền nâng cao, bạn phải tự chạy trình bao với các đặc quyền nâng cao:

sudo bash -c "somecommand >> somefile"

39
2018-05-01 05:54





Có sudo đẻ trứng một sub-shell:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

Trong ví dụ này, sudo chạy "sh" với phần còn lại làm đối số.

(điều này được hiển thị như một ví dụ trong trang sudo man)


22
2017-10-13 14:23



Lý do là nó là shell của bạn (chạy như bạn) mà chuyển hướng, không phải sudo. Vì bạn không có quyền ghi vào tệp, bạn nhận được lỗi từ chối Quyền. Câu trả lời này là để bắt đầu một trình bao mới đang chạy dưới dạng root, và do đó có thể ghi vào tệp. - Randy Orrison
Đây không phải là câu trả lời đúng. Đây là câu trả lời đúng. Akira có một cái tốt hơn, cho logic được cung cấp trong câu trả lời đó. - TOOGAM


Theo tôi, tốt nhất trong trường hợp này là dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

4
2018-04-18 18:03





Tôi thường sử dụng shell HERE tài liệu với sudo tee -a. Một cái gì đó dọc theo dòng:

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF

4
2018-06-16 16:16





Có thể có sự cố với sudo tại đây và chuyển hướng. Sử dụng trình chỉnh sửa văn bản do bạn chọn để thêm dòng.

sudo nano /etc/profile

Hoặc, bạn có thể thử su thay thế

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

3
2017-10-13 14:10



Thật không may, điều này tạo ra kết quả tương tự. - Matt Norris
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile' nên làm việc. vì không có gì vỏ có thể mở rộng nhầm lẫn trong arg để echo, đơn trích dẫn lệnh tổng thể. - quack quixote
Điều đó thật tuyệt. Bây giờ làm điều này như là một phần của một kịch bản. - Ernie Dunbar


Điều này sẽ không hoạt động mà bạn đang cố gắng chuyển hướng (sử dụng >>) đầu ra của sudo. Những gì bạn thực sự muốn làm là chuyển hướng đầu ra của echo. Tôi đề nghị bạn chỉ cần sử dụng trình soạn thảo yêu thích của bạn và thêm dòng đó theo cách thủ công /etc/profile. Điều này có lợi ích bổ sung mà bạn có thể kiểm tra xem /etc/profile đã đặt JAVA_HOME.


0
2017-10-13 14:36





Sử dụng ví dụ-đường:

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

và thay thế FOO với biến của bạn để nối thêm.

Trong một số hệ thống (như OS X), /etc/profile tệp có 444 quyền, vì vậy nếu bạn vẫn nhận được quyền bị từ chối, kiểm tra và sửa quyền trước:

sudo chmod 644 /etc/profile

sau đó thử lại.


0
2018-05-24 22:22