Як одночасно змінити дозвіл та власника групи на файл


9

Для зміни дозволу на файл я знаю, що міг би використовувати chmod. Для зміни власника групи я міг би використовувати chgrp. Однак, якщо я хочу одночасно змінити і дозвіл, і власника, будь-яку команду, яку я міг би використовувати в Linux?

Наприклад, є файл з цим дозволом та власником:

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

А тепер я хочу змінити це на:

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

Я знаю, що міг би скористатися цією командою:, chmod 123 WantToChangeThisFile && chgrp admin WantToChangeThisFileале хочу знати, чи є якийсь акуратний спосіб це зробити.

Відповіді:


9

Існує концепція, відома як "UNIX-шлях". Кожен інструмент повинен виконувати одну просту функцію. Якщо потрібна більш складна функція, він може комбінувати менші інструменти.

Навпаки - монолітна конструкція, коли вся функціональність об'єднана в межах одного величезного інструменту.

Якщо ви хочете зробити щось складне - просто напишіть сценарій, посилаючись на прості інструменти.


Ось сценарій , я написав , що об'єднує ці інструменти в одну функцію оболонки ch.
Кіт

2
немає можливості відповіді, те, що він запитав, можна досягти за допомогою декількох інструментів, таких як rsync, і хоча Linux, як правило, віддає перевагу одному інструменту / одній функції, це означає, що інструменти, які роблять кілька речей, не існують
Kiwy

@Kiwy Деякі інструменти Linux не відповідають універсальним принципам та поєднують різні функції різного характеру. Як, наприклад, systemd.
Кондібас

1
@Kondybas "схильна до" є важливою частиною речення. виняток із правила існує. І все-таки ваша відповідь мені дуже погана.
Ківі

9

Якщо ви також хочете скопіювати файл кудись (наприклад, його кінцеве призначення), ви можете переглянути installкоманду:

install -m 0777 -o root $sourcefile $destinationfile


1

Використання правильного інструменту для роботи в * nix важливо, але дійсно повторення одного і того ж шляху у кожній ланцюговій команді виглядає нерозумно. Натомість вам слід реально використовувати змінні Bash, а в менших сценаріях, особливо використовувати $_.

Вашою командою стане:

chmod 123 WantToChangeThisFile && chgrp admin $_

ALT +. робить аналогічну дію про те, щоб витягнути останній аргумент, що використовується, у вашій поточній оболонці.


0

Rsync корисний у цьому випадку:

З Посібника з тонких зображень (TM)

--chown = ВИКОРИСТАННЯ: ГРУПА простого відображення імені користувача / групи

--chmod = CHMOD впливає на дозволи на файли та / або каталог

Так, наприклад, ви хочете, щоб chmod / mnt / lala / lala4000 / "ugo = rX" та chown "foo.bar"

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

Це рекурсивно блукало і chmod реж.


0

Ви можете досягти такої мети при тривалій rsyncкоманді

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

я не розумію
Pierre.Vriens

Це небезпечно: це вплине на всі відповідні файли у вказаному каталозі та підкаталогах, а не лише на один файл, на який він вказує.
telcoM

-1

Можна chown username:groupname file ...змінити обидва одночасно. Це змінює два поля в одній структурі (inode), тому поєднуючи це, вони зберігають два системні виклики (одне для зчитування поточних значень і одне для встановлення модифікованих значень).


chownзмінює лише власників. Як це змінює дозволи одночасно із запитом ОП? Примітка, приклад ОП включає chmodтакож а.
jscott

Ах, я думаю, він хотів змінити 3 речі, як він писав. За зміну власника групи я думав, що він мав на увазі групу та власника.
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
ви можете принаймні дати пояснення, як це працює і як це, мабуть, використовувати (параметри, скільки вони ...)
Kiwy

2
Будь ласка, не просто вставляйте якийсь код як відповідь.
Конрад Гаєвський

Коментування, ймовірно, не буде результативним; це єдине, що цей користувач коли-небудь публікував, і вони відтоді навіть не ввійшли в систему.
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.