Làm cách nào để đặt quyền truy cập tệp cụ thể khi chuyển hướng đầu ra?


12

Đây có thể là một bản sao, nhưng tất cả các tìm kiếm của tôi đang đưa ra các câu hỏi về lỗi bị từ chối cấp phép.

Tôi đang chạy một lệnh trong bash shell. Tôi muốn chuyển hướng đầu ra để nối vào một tệp có thể không tồn tại trong lần chạy đầu tiên. Tôi muốn đặt chế độ cấp phép tệp cụ thể nếu chuyển hướng đầu ra phải tạo tệp này. Có cách nào để làm điều này với một lệnh không?

Ví dụ, tôi có thể thử

foo >> /tmp/foo.log 0644

nơi mà 0644tôi muốn foo.logkết thúc với. Hầu hết các lệnh tôi đã thử nghiệm trong bash kết thúc phiên dịch 0644như là một đối số bổ sung foo.

Tôi có cảm giác rằng điều này sẽ thực hiện một lệnh thứ hai cho chmodcác quyền trước hoặc sau khi viết cho nó.

Tôi đang sử dụng GNU bash 4.2.25 và Ubuntu 12.04, nếu điều đó tạo ra sự khác biệt - các câu trả lời chung được ưu tiên.

Câu trả lời:


5

Không có cách nào để làm điều đó trong khi tôi biết, một kịch bản đơn giản có thể là giải pháp tốt nhất.

if [ -e /tmp/foo.log ]; then
    foo >> /tmp/foo.log
else
    foo >> /tmp/foo.log
    chmod 0644 /tmp/foo.log
fi

Cảm ơn Slowki, đó cũng là linh cảm của tôi. Tôi sẽ để nó mở trong vài ngày, với hy vọng thu hút được một đạo sư để khai sáng chúng ta.
Patrick M

3
Vấn đề với cách tiếp cận này là nó tạo ra một cửa sổ thời gian ngắn khi các quyền trên tệp bị sai. Tôi sẽ không sử dụng nó nếu mục tiêu là bảo vệ dữ liệu nhạy cảm.
proski

1
Câu trả lời này hoạt động, theo như nó đi, nhưng @proski đã đúng: umaskcâu trả lời là tốt hơn, và một trong số chúng nên được chấp nhận.
Scott

15

Tôi biết đó là một câu hỏi cũ, nhưng tôi muốn thêm hai xu của mình.

Tôi đã có cùng một ý tưởng và đã đưa ra một giải pháp tương tự như BowlesCR . Vấn đề với giải pháp của anh ấy là lệnh của tôi ( foo) sẽ không hoạt động nếu tôi thay đổi ô trước khi chạy nó, vì vậy đây là vấn đề của tôi:

foo | ( umask 0033; cat >> /tmp/foo.log; )

Ở đây, umaskchỉ ảnh hưởng đến việc chuyển hướng đến foo.logtrong lớp con. Mọi thứ khác vẫn không bị ảnh hưởng.

Một chút phức tạp, nhưng nó hoạt động.


Rất đẹp và hiệu quả :) Chỉ không thể được sử dụng với chuyển hướng stderr trên đầu chuyển hướng xuất sắc.
Orsiris de Jong

5

Nếu không có kịch bản đúng, bạn có thể xâu chuỗi một chút:

touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log

Hiệu quả tương tự như câu trả lời của Slowki , nhưng cô đọng lại thành một lớp lót.

Điều khác duy nhất tôi có thể nghĩ đến là mày mò với cái ô. Tốt nhất để làm điều này trong một subshell để nó không gây ô nhiễm môi trường hiện tại:

(umask 0033 && foo >> /tmp/foo.log)

Hai vấn đề với điều đó, mặc dù.

  1. Umask không thể tăng các quyền trên mức được chỉ định trong tòa nhà creat()(0666 dường như là những gì Bash sử dụng).
  2. Điều này sẽ không thay đổi quyền trên một tệp hiện có (vì umaskchỉ áp dụng cho việc tạo tệp ).

Tôi vẫn còn đủ mới để * nix rằng umask vẫn còn một chút ma thuật đối với tôi. Cảm ơn vì tiền boa, tôi chắc chắn sẽ đọc nó.
Patrick M

Hmmật Vẫn cho phép một quá trình không có đặc quyền từ việc mở tệp và sau đó đọc nội dung của nó.
Feuermurmel

(1) Chúc mừng bạn đã tìm thấy một cách sử dụng thú vị, hữu ích cat. (Mặc dù điều này không làm theo mô hình tiêu chuẩn sử dụng vô dụng của  cat.) (2) Tôi đoán rằng bạn có nghĩa là để nói rằng giá trị mặc định bash sang chế độ  0666 khi tạo tập tin, và vì vậy tôi thay đổi nội dung câu trả lời của bạn nói như vậy. (Xem cái này ,  cái này   (Tiếp)
Scott

(Tiếp theo) và  điều này .) Và câu hỏi đặc biệt đề cập đến chế độ 0644. Vì vậy, umaskgiá trị 22, 23 hoặc 32 cũng sẽ hoạt động, trong bối cảnh này (bạn không cần sử dụng số 0 (s); chế độ và  umaskgiá trị được chỉ định bằng số, chúng luôn được hiểu là bát phân).  22 là phổ biến hơn, thông thường được sử dụng.
Scott

@Feuermurmel: Vậy thì sao? Câu hỏi rõ ràng gọi cho chế độ 644. Chúng ta phải giả định rằng OP biết rằng 644 có nghĩa là có thể đọc được trên thế giới và có ý định công khai thông tin của mình.
Scott

1

Khi chuyển hướng đặt các quyền sai, ví dụ:

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ ls -l capture.*
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDERR
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDOUT
$ cat capture.*
215 STDERR
216 STDERR
215 STDOUT
216 STDOUT

Tôi tin rằng bạn có thể sử dụng một cái gì đó như xynomorf đã đưa ra và giải quyết mối quan tâm lớn hơn từ Orsiris de Jong với một sửa đổi nhỏ để sử dụng thay thế quy trình bash .

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ ls -l capture.*
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDERR
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDOUT
$ cat capture.*
233 STDERR text
238 STDERR text
233 STDOUT text
238 STDOUT text

Đương nhiên, sử dụng umask 0077để có chế độ 600 và cấm bất kỳ người dùng nào khác nhìn thấy nội dung.


0

Nếu bạn muốn chuyển hướng đến một tập lệnh, không giống như umask, với sự thay thế quá trình và installbạn cũng có thể đặt bit thực thi:

install -m 755 <(echo commands go here) newscript

<()đặt đầu ra vào một tệp tạm thời, xem Quy trình thay thế

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.