it-swarm-vi.tech

sudo echo "cái gì đó" >> / etc / đặc biệtFile không hoạt động

Đây là một câu hỏi khá đơn giản, ít nhất có vẻ như nó phải như vậy, về các quyền Sudo trong Linux.

Có rất nhiều lần tôi chỉ muốn thêm một cái gì đó vào /etc/hosts hoặc một tệp tương tự nhưng cuối cùng không thể vì cả >>> đều không được phép, ngay cả với root.

Có cách nào đó để thực hiện công việc này mà không cần phải su hoặc Sudo su vào root không?

529
David

Sử dụng tee --append hoặc tee -a.

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list

Hãy chắc chắn để tránh dấu ngoặc kép bên trong dấu ngoặc kép.

Để tránh in dữ liệu trở lại bàn điều khiển, hãy chuyển hướng đầu ra thành/dev/null.

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list > /dev/null
762
Yoo

Vấn đề là Shell không chuyển hướng đầu ra, không phải Sudo hay echo, vì vậy điều này đang được thực hiện như người dùng thông thường của bạn.

Hãy thử đoạn mã sau:

Sudo sh -c "echo 'something' >> /etc/privilegedfile"
294
Matt P

Vấn đề là Shell của bạn xử lý chuyển hướng; nó đang cố mở tệp bằng của bạn quyền không phải là quyền của quy trình bạn đang chạy dưới Sudo.

Sử dụng một cái gì đó như thế này, có lẽ:

Sudo sh -c "echo 'something' >> /etc/privilegedFile"
31
Incident
Sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
17
Vinko Vrsalovic

Đang làm

Sudo sh -c "echo >> somefile"

nên làm việc. Vấn đề là> và >> được xử lý bởi Shell của bạn chứ không phải bởi lệnh "sudoed", vì vậy các quyền là của bạn chứ không phải của người dùng mà bạn "sudoing".

13
agnul

Tôi sẽ lưu ý, đối với những người tò mò, bạn cũng có thể trích dẫn một di sản (cho các khối lớn):

Sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf
<?xml version=\"1.0\" encoding=\"UTF-8\"?>

<plist version=\"1.0\">
  <dict>
    <key>Label</key>
    <string>com.company.ipfw</string>
    <key>Program</key>
    <string>/sbin/ipfw</string>
    <key>ProgramArguments</key>
    <array>
      <string>/sbin/ipfw</string>
      <string>-q</string>
      <string>/etc/ipfw.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true></true>
  </dict>
</plist>
EOIPFW"
9
msanford

Trong bash, bạn có thể sử dụng tee kết hợp với > /dev/null để giữ cho thiết bị xuất chuẩn.

 echo "# comment" |  Sudo tee -a /etc/hosts > /dev/null
8
Vytenis Bivainis

Sử dụng câu trả lời của Yoo , đặt cái này vào ~/.bashrc của bạn:

sudoe() {
    [[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
    echo "$1" | Sudo tee --append "$2" > /dev/null
}

Bây giờ bạn có thể chạy sudoe 'deb blah # blah' /etc/apt/sources.list


Chỉnh sửa:

Một phiên bản hoàn chỉnh hơn cho phép bạn chuyển đầu vào hoặc chuyển hướng từ một tệp và bao gồm một công tắc -a để tắt nối thêm (được bật theo mặc định):

sudoe() {
  if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then
    shift &>/dev/null || local failed=1
  else
    local append="--append"
  fi

  while [[ $failed -ne 1 ]]; do
    if [[ -t 0 ]]; then
      text="$1"; shift &>/dev/null || break
    else
      text="$(cat <&0)"
    fi

    [[ -z "$1" ]] && break
    echo "$text" | Sudo tee $append "$1" >/dev/null; return $?
  done

  echo "Usage: $0 [-a|--no-append] [text] <file>"; return 1
}
4
hololeap

Bạn cũng có thể sử dụng sponge từ gói moreutils và không cần chuyển hướng đầu ra (nghĩa là không có tiếng ồn tee để ẩn):

echo 'Add this line' | Sudo sponge -a privfile
2
Michael Goldshteyn

Làm thế nào về:
[.__.] Tiếng vang văn bản | Trạng thái dd Sudo = none of = đặc quyền
[.__.] Tôi muốn thay đổi/Proc/sys/net/ipv4/tcp_rmem.
Tôi đã làm:
[.___
[.__.] loại bỏ tiếng vang bằng một tài liệu dòng đơn

0
Marcelo Pacheco

tiếng vang 'Xin chào thế giới' | (Sudo tee -a /etc/apt/source.list)

0
Sudev Shetty

Bằng cách sử dụng sed -i với $ a, bạn có thể nối thêm văn bản, chứa cả hai biến và ký tự đặc biệt, sau dòng cuối cùng.

Ví dụ: thêm $ NEW_host với $ NEW_IP vào/etc/hosts:

Sudo sed -i "\$ a $NEW_IP\t\t$NEW_Host.domain.local\t$NEW_Host" /etc/hosts

tùy chọn sed giải thích:

  • - i để đặt tại chỗ
  • $ cho dòng cuối cùng
  • a để chắp thêm
0
Noam Manos