Чи є спосіб сказати sudo встановити моє ім'я користувача як власника файлів, створених замість root?


19

Якщо я це зробити sudo cp /etc/foo.txt ~/foo.txt, новий файл створюється з rootвласником.

Зараз я не бачу нічого іншого, крім використання останніх двох команд ( lsдля уточнення випадку використання):

belmin@server1$ ls /etc/foo.txt
>  -rw------- 1 root root 3848 Mar  6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_

Я волів би:

  1. Робити це в одній sudoкоманді.
  2. Не потрібно вказувати мого поточного користувача (можливо, використовувати змінну?).

sudo cat /etc/foo.txt > ~/foo.txt. Файли, як правило, читаються лише корінцем з причини, тому пам’ятайте, що пам’ятайте про цю причину, роблячи копії для читання некористувальниками.
jw013

Відповіді:



14

З POSIX-суміснимиcp ви можете , sudo cp -p foo barщоб зберегти такі метадані файлів при копіюванні:

  • Час доступу
  • Час модифікації
  • ідентифікатор користувача
  • Ідентифікатор групи
  • Режим

Якщо ви хочете встановити іншого користувача, найкраще рішення JennyD .


2
Це працює лише тоді, коли оригінальний файл належить цільовому користувачеві.
Дженні Д

4
Я припускаю, що особа, яка керує судо, не володіє оригінальним файлом, інакше їм не потрібно буде використовувати sudo.
EightBitTony

@EightBitTony Вам не потрібно sudoкопіювати файл, яким ви не володієте. Адже вам просто потрібен доступ для читання .
l0b0

Так, помилка з мого боку - але я припускаю, що ідентифікатор користувача, про який йде мова, також не може прочитати файл, тому що вони все ще не потребують sudo. Отже, ми повинні припустити, що ідентифікатор користувача, призначений для володіння кінцевим файлом, не має доступу до вихідного файлу. Так чи інакше, це не проблема "судо". Ваша відповідь пропонує зберегти власника, який, як ми маємо вважати, не бажає.
EightBitTony

2
Теоретично можливо, що файл належить цільовому користувачеві, але знаходиться в каталозі, який цільовий користувач не має права вводити. Але це не дуже ймовірно :-)
Jenny D

8

Якщо ти зробиш:

sudo cat /etc/foo.txt > ~/foo.txt

Потім ~/foo.txtвін буде відкритий оболонкою, як ви (так створено за допомогою своїх облікових даних), а потім sudoбуде виконаний з його stdout, перенаправленим на це.

Врешті-решт файл належить вам.

Такий підхід також сприяє обмеженню дій, зроблених root. Тут rootвикористовується лише його привілей для відкриття /etc/foo.txt, він не робить те, що є потенційно шкідливим (відкрийте файл для запису, який може мати погані наслідки, якщо, наприклад, ~/foo.txtбуло посилання на символи).


2
Це передбачає, що користувач може записувати в цільовий каталог.
Йоган

3

Використовуючи sudo, ви переходите до іншого користувача. В цьому і полягає вся суть команди. Я припускаю, що у вас немає регулярного доступу до першого файлу, тому rootдля отримання доступу вам потрібно бути іншим користувачем ( у цьому випадку).

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

Вам потрібно буде

  1. продовжуйте використовувати дві команди (або одну складну команду)
  2. знайти іншу команду (наприклад, встановити, побачити в іншій відповіді)
  3. або написати сценарій та виконати його через sudo.

1

Судо створює змінну середовища "SUDO_USER", яку ви можете використовувати, щоб дізнатися користувача, який увійшов (фактично, хто керував Судо).

Якщо припустити, що ви отримаєте Sudo до root (можна використовувати Sudo для доступу до інших користувачів), ви можете написати сценарій для автоматизації наступних двох кроків.

cp source target
chown $SUDO_USER target

(Це не спрацює, якщо ви надаєте sudo користувачу, котрий не користується коренем, оскільки лише root може видавати файли.)

Автоматизувати це буде трохи роботи. Якщо джерело - це один файл, а ціль - не каталог, то ваша робота виконана. Я припускаю, що ви задали це питання, оскільки проблема є лише справжнім питанням у складніших ситуаціях, наприклад, коли ви робите щось на кшталт:

cp /path/source/some*files /path/target/directory/

Складний сценарій, щоб визначити, які файли та які каталоги передані, які раніше існували, які насправді були перезаписані, а також змінити право власності лише на успішно скопійовані файли.

Ця робота вже зроблена. Ви можете використовувати cpio- Після sudo до root, скопіюйте файли за допомогою cpio. cpio потрібен список файлів для копіювання, так що це процес у два кроки. Нижче я використовую lsдля створення списку файлів для копіювання.

ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/

В -pdmозначає «Наскрізний режим, створювати каталоги при необхідності, підтримувати час модифікації файлу»

--owner $SUDO_USER" змушує вказаного користувача володіти файлами.

Остаточний операнд - це каталог, де cpio повинен зберігати файли.

Щоб дізнатися більше про дивовижність cpio, перейдіть на сторінку посібника CPIO тут

Це також можливо зробити в одній команді sudo. Якщо припустити, що ваш користувач має права доступу до файлів, використовуйте sudo лише для частини cpio, наприклад:

ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/

У наведеному вище випадку я використовую $ USER замість $ SUDO_USER, оскільки вона оцінюється до запуску Sudo. Крім того, якщо користувач не має доступу до списку файлів, покладіть його в сценарій обгортки і використовуйте sudo для запуску обгортки. Це може стати важче, але в найпростішому випадку обгортка бере два аргументи, джерело та ціль.

Це переходить у обгортку "cp_as_user":

ls $1 | cpio -pdm --owner $SUDO_USER $2

Потім використовуйте обгортку так:

sudo cp_as_user "/ шлях / до / деяких * файлів" / шлях / до / цільовий / каталог

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