Cách thay đổi quyền và chủ sở hữu nhóm của một tệp cùng một lúc


9

Để thay đổi quyền, tôi biết tôi có thể sử dụng chmod. Để thay đổi chủ sở hữu nhóm, tôi có thể sử dụng chgrp. Tuy nhiên, nếu tôi muốn thay đổi cả quyền và chủ sở hữu cùng một lúc, bất kỳ lệnh nào tôi có thể sử dụng trên Linux?

Ví dụ: có một tệp có quyền này và chủ sở hữu:

-rw-r--r--+  1 raymondtau  staff    0 May  8 16:38 WantToChangeThisFile

Và bây giờ tôi muốn thay đổi nó thành:

---x-w--wx+  1 raymondtau  admin    0 May  8 16:38 WantToChangeThisFile

Tôi biết tôi có thể sử dụng lệnh này : chmod 123 WantToChangeThisFile && chgrp admin WantToChangeThisFile, nhưng muốn biết liệu có cách nào gọn gàng để làm điều đó không.

Câu trả lời:


9

Có khái niệm được gọi là "UNIX-way". Mỗi công cụ nên thực hiện một chức năng đơn giản. Nếu một người cần một chức năng phức tạp hơn, anh ta có thể kết hợp các công cụ nhỏ hơn.

Ngược lại là thiết kế đơn sắc khi tất cả các chức năng được tổng hợp trong một công cụ lớn.

Nếu bạn muốn làm một cái gì đó phức tạp - chỉ cần viết một kịch bản, gọi các công cụ đơn giản.


Đây là một đoạn script tôi đã viết kết hợp các công cụ này thành một hàm shell , ch.
Keith

2
không có cách nào đó là một câu trả lời, những gì ông yêu cầu có thể đạt được với một số công cụ đã tồn tại như rsync và mặc dù Linux có xu hướng lại thích một công cụ / một chức năng nó công cụ bình làm nhiều thứ không tồn tại
Kiwy

@Kiwy Một số công cụ linux không tuân thủ các nguyên tắc unix-way và kết hợp các chức năng khác nhau có tính chất khác nhau. Giống như systemd chẳng hạn.
Kondybas

1
@Kondybas "có xu hướng" là phần quan trọng của câu. ngoại lệ cho quy tắc không tồn tại. Vẫn là câu trả lời của bạn cho tôi là một câu hỏi thực sự tồi tệ.
Kiwy

9

Nếu điều bạn cũng muốn là sao chép tệp ở đâu đó (như đích đến cuối cùng của nó), bạn có thể muốn xem installlệnh:

install -m 0777 -o root $sourcefile $destinationfile


1

Sử dụng công cụ phù hợp cho công việc trong * nix rất quan trọng, nhưng thực sự lặp lại cùng một đường dẫn trong mỗi lệnh bị xích có vẻ ngớ ngẩn. Thay vào đó, bạn thực sự nên sử dụng các biến Bash và trong các tập lệnh nhỏ hơn, đặc biệt là sử dụng $_.

Lệnh của bạn sẽ trở thành:

chmod 123 WantToChangeThisFile && chgrp admin $_

ALT +. thực hiện điều tương tự khi kéo đối số được sử dụng cuối cùng trong trình bao hiện tại của bạn.


0

Rsync rất hữu ích trong trường hợp này:

Từ Hướng dẫn sử dụng tốt (TM)

--chown = USER: Ánh xạ tên người dùng / tên nhóm đơn giản

--chmod = CHMOD ảnh hưởng đến quyền của tệp và / hoặc thư mục

Vì vậy, ví dụ, bạn muốn chmod / mnt / lala / lala4000 / "ugo = rX" và chown "foo.bar"

rsync --chmod = ugo = rX --chown = foo: bar -rvtpolgh / mnt / lala / lala4000 / / mnt / lala / lala4000 /

Điều này sẽ đệ quy chown và chmod dir.


0

Bạn có thể đạt được mục tiêu như vậy với rsynclệnh dài

rsync -a --chown=root:root --chmod=F755 filename filename

tôi không hiểu được
Pierre.Vriens

Điều này không an toàn: nó sẽ ảnh hưởng đến tất cả các tệp phù hợp trong thư mục và thư mục con được chỉ định, không chỉ một tệp mà nó được trỏ đến.
telcoM

-1

Bạn có thể làm chown username:groupname file ...để thay đổi cả hai cùng một lúc. Đó là thay đổi hai trường trong cùng một cấu trúc (inode) để kết hợp nó sẽ lưu hai cuộc gọi hệ thống (một để đọc các giá trị hiện tại và một để thiết lập các nút đã sửa đổi).


chownchỉ thay đổi chủ sở hữu. Làm thế nào để điều này thay đổi các quyền cùng lúc với OP yêu cầu? Lưu ý ví dụ của OP bao gồm cả chmod.
jscott

À, tôi cảm thấy anh ấy muốn thay đổi 3 điều, vì anh ấy đã viết Để thay đổi chủ nhóm, tôi nghĩ anh ấy có nghĩa là nhóm chủ sở hữu.
wurtel

-3
#!/bin/bash

# Setting the Variables for execution
LOGDIR=$HOME
CURRENTTIME=$(date +"%Y%m%d%s%H%M%S")
LOGFILE=${LOGDIR}/chgpermission_${CURRENTTIME}.log
MASTERFILE=$1
INDEX=0

# Checking the number of Parameters passed
if [ "$#" -ne 1 ]; then
    echo "Master file name is mandatory parameter" > ${LOGFILE}
    exit 1
fi

# Loading the Master file into an Array 
echo "Loading the Master file ${MASTERFILE} into an array" >> ${LOGFILE}
while read line
do
#echo $line  
MASTERARRAY[$INDEX]=$HOME/$line 
INDEX=$(expr $INDEX + 1) 
done < ${MASTERFILE}

echo "Number of parameters in an master array ${MASTERARRAY[@]}" >> ${LOGFILE}

# Changing the permission of the file 
echo "Changing the permission of the file in master file ${MASTERFILE}" >> ${LOGFILE} 
index=0
for index in "${MASTERARRAY[@]}"
do
    if [ -f "$index" ] 
    then
       echo "$index file exist"
       echo  "$index file exist" >> ${LOGFILE}
       chmod 755 "$index" 
       chown workstation "$index"
       chgrp workstation "$index" 
    else
      echo "$index file does not extst"
      echo "$index file does not exist" >> ${LOGFILE}  
    fi 
done 

2
ít nhất bạn có thể đưa ra lời giải thích về cách thức hoạt động của nó và cách nó được sử dụng (tham số bao nhiêu ...)
Kiwy

2
Xin vui lòng không chỉ dán một số mã như một câu trả lời.
Konrad Gajewski

Nhận xét không có khả năng mang lại hiệu quả; đây là điều duy nhất người dùng này từng đăng và họ thậm chí không đăng nhập kể từ đó.
G-Man nói 'Phục hồi Monica'
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.