Các tập tin có thể được tạo với quyền được thiết lập trên dòng lệnh?


37

Khi tạo thư mục, mkdir -m <mode> <dir>cung cấp để tạo một hoặc nhiều thư mục với chế độ / quyền đã cho (nguyên tử).

Có tương đương để tạo tập tin, trên dòng lệnh?

Một cái gì đó giống như:

open("file", O_WRONLY | O_APPEND | O_CREAT, 0777);

Được sử dụng touchtheo sau bởi một chmodlựa chọn duy nhất của tôi ở đây?


Chỉnh sửa: Sau khi thử sử dụng đề xuất của teppic install, tôi đã chạy qua straceđể xem nó gần với nguyên tử như thế nào. Câu trả lời là, không lắm:

$ strace install -m 777 /dev/null newfile
...
open("newfile", O_WRONLY|O_CREAT|O_EXCL, 0666) = 4
fstat(4, {st_mode=S_IFREG|0666, st_size=0, ...}) = 0
...
fchmod(4, 0600)                         = 0
close(4)                                = 0
...
chmod("newfile", 0777)                  = 0
...

Tuy nhiên, đó là một lệnh shell duy nhất và tôi chưa biết trước đây.

Câu trả lời:


47

Bạn có thể sử dụng installlệnh (một phần của GNU coreutils) với tệp giả, ví dụ:

install -b -m 755 /dev/null newfile

Các -btùy chọn sao lưu newfilenếu nó đã tồn tại. Bạn có thể sử dụng lệnh này để thiết lập chủ sở hữu là tốt.


4
+1 để giới thiệu tôi vớiinstall
quornian

Đó là một lệnh nhỏ hữu ích. Như tên của nó cho thấy nó thực sự được thiết kế để cài đặt phần mềm được biên dịch từ mã nguồn, để tiết kiệm phải sử dụng chmod, chown, v.v.
teppic

Giá như nó lấy stdin! OK, / Proc / self / fd / 0 sẽ làm cho mục đích của tôi.
proski

Lưu ý rằng chế độ 755 là quyền mặc định của các tệp được tạo install, do đó -m 755không cần thiết.
Kusalananda

@Kusalananda Rõ ràng đây chỉ là một ví dụ về cách đặt chế độ, vì đó là câu hỏi, không phải cách đặt 755.
teppic

22

touchluôn tạo tệp nếu nó không tồn tại, luôn tuân theo các liên kết tượng trưng và luôn làm cho tệp không thể thực thi được. Bạn có thể quyết định các bit đọc và ghi thông qua umask .

(umask 077; touch file)  # creates a 600 (rw-------) file
(umask 002; touch file)  # creates a 664 (rw-rw-r--) file

Không thể tạo tập tin nguyên tử của Nhật Bản (đặc biệt là với O_NOFOLLOW) với các công cụ shell truyền thống. Bạn có thể sử dụng sysopentrong perl. Nếu bạn có mktemptiện ích lấy cảm hứng từ BSD , nó sẽ tạo một tệp nguyên tử với O_NOFOLLOW; Sau đó, bạn sẽ phải gọi chmodnếu chế độ mặc định là 600 không đúng.


Tôi đang trong quá trình viết ra một lời giải thích chi tiết hơn, nhưng các bài viết trên wikipedia bao gồm mọi thứ đều ổn.
jordanm

Nếu chỉ touchcó tùy chọn tạo tập tin thực thi, đó thực sự là những gì tôi đang theo đuổi. Sau đó umaskcó thể được sử dụng để điều chỉnh các chi tiết. Đáng buồn thay, không có cách nào với umasktouchđể tạo ra các tệp thực thi.
quornian

@quornian Dù sao bạn cũng không thể tạo một tệp không trống. Điểm nào tạo ra một tập tin thực thi trống nguyên tử? Sử dụng touchtheo sau chmod +x.
Gilles 'SO- ngừng trở nên xấu xa'

4
Bạn có thể tạo các tệp thực thi không trống, thực thi với ... ln hoặc mv. Bạn luôn có thể tạo tệp với nội dung và quyền phù hợp trong thư mục được tạo bằng umask 077 và di chuyển nó hoặc ln nó sau đó.
Stéphane Chazelas

-1

Tôi có một tập lệnh bash trong thư mục nhà của tôi /home/anthony/touchmod.shcó chứa:

#!/bin/bash

touch "$2"
chmod "$1" "$2"

Vì vậy, nếu tôi cần tạo readme.txtvới 644 quyền, tôi có thể nhập:

~/touchmod.sh 644 readme.txt

3
Bạn có thể không hiểu câu hỏi. Đây chính xác là những gì người hỏi cố gắng tránh.
ceving
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.