Làm thế nào để nối vào một tập tin như sudo?


271

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, tôi không thể làm điều đó. Nhưng sau đây cũng không hoạt động.

sudo echo "something" >> /etc/config_file

Có cách nào để thêm vào một tệp trong tình huống đó mà không cần phải mở tệp đó bằng sudotrình chỉnh sửa và sau đó nối thêm nội dung mới bằng tay không?


Tôi đang sử dụng Ubuntu 9.04 và có thể sử dụng sudo cho mọi lệnh tôi cần cho đến nay. Sinh ra một vỏ phụ làm việc.
Matt Norris

Câu trả lời:


391

Sử dụng tee -a(hoặc tee --append) vớisudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

Vì vậy, lệnh của bạn trở thành

echo "something" | sudo tee -a /etc/config_file

Những lợi thế của teeviệc 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' chạy với quyền nâng cao
  • Trích dẫn một lệnh phức tạp dễ dàng hơn nhiều

2
Trên tee OS X dường như chỉ có cờ -a.
Lri

Debian 8 tee-acờ chắp thêm.
đất sét

9
Sử dụng echo "output" | sudo tee -a file > /dev/nullnếu bạn muốn bỏ qua đầu ra giao diện điều khiển.
Moshe Bixenshpaner

Hoạt động tốt cho WSL là tốt.
kayleeFrye_onDeck

50

Chuyển hướng được thực hiện trong shell 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 shell với các đặc quyền nâng cao:

sudo bash -c "somecommand >> somefile"

26

Có sudo sinh ra một vỏ phụ:

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à đối số.

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


8
Lý do là vì cái vỏ của bạn (chạy như bạn) mà chuyển hướng chứ không phải sudo. Vì bạn không có quyền ghi vào tệp, bạn sẽ nhận được lỗi Từ chối cấp phép. Câu trả lời này làm là bắt đầu một shell mới đang chạy bằ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à một 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 đó.
TUYỆT VỜI

6

Tôi thường sử dụng tài liệu shell TẠI ĐÂY 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

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

3

Có thể có một vấn đề với sudo ở đây và chuyển hướng. Sử dụng một văn bản của sự lựa chọn của bạn thay vào đó để 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

Thật không may, điều này tạo ra kết quả tương tự.
Matt Norris

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'nên làm việc. vì không có gì mà shell có thể mở rộng nhầm lẫn trong arg để lặp lại, trích dẫn một lệnh chung.
quix 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

0

Đ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 chưa JAVA_HOME.


0

Sử dụng ex -way:

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

và thay thế FOObằng biến của bạn để chắp thêm.

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

sudo chmod 644 /etc/profile

sau đó thử lại

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.