Jeśli to zrobię sudo cp /etc/foo.txt ~/foo.txt
, nowy plik zostanie utworzony root
jako właściciel.
W tej chwili nie widzę innego rozwiązania niż użycie dwóch ostatnich poleceń (w ls
celu wyjaśnienia przypadku użycia):
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: $_
Wolałbym:
- Robienie tego za pomocą jednego
sudo
polecenia. - Nie muszę określać mojego obecnego użytkownika (może używasz zmiennej?).
sudo cat /etc/foo.txt > ~/foo.txt
. Pliki mogą być odczytywane tylko przez roota z jakiegoś powodu, więc pamiętaj o tym, aby kopie były czytelne dla użytkowników innych niż root.Odpowiedzi:
Użyj
install
zamiastcp
:źródło
install
. Dziękuję Ci.sudo install -o "$USER" /etc/foo.txt ~/foo.txt
Z POSIX kompatybilny
cp
możnasudo cp -p foo bar
by zachować następujące metadane plików podczas kopiowania:Jeśli chcesz ustawić innego użytkownika , najlepsze jest rozwiązanie JennyD .
źródło
sudo
kopiować pliku, którego nie jesteś właścicielem. W końcu potrzebujesz tylko dostępu do odczytu .Jeśli zrobisz:
Wtedy
~/foo.txt
będzie otwarta przez powłokę jako ciebie (tak utworzonego z poświadczeniami), a następniesudo
zostanie wykonany z stdout przekierowany do tego.Ostatecznie plik będzie własnością użytkownika.
Takie podejście pomaga również ograniczyć liczbę wykonywanych zadań
root
. Tutajroot
używa tylko swojego przywileju do otwierania/etc/foo.txt
, nie robi rzeczy potencjalnie szkodliwych (otwórz plik do pisania, który mógłby mieć złe konsekwencje, gdyby~/foo.txt
na przykład był dowiązaniem symbolicznym).źródło
Za pomocą
sudo
przełączasz się na innego użytkownika. To jest sedno polecenia. Zakładam, że nie masz regularnego dostępu do pierwszego pliku, więc musisz być innym użytkownikiem (root
w tym przypadku), aby uzyskać dostęp.Nie ma sposobu, aby
sudo
sobie z tym poradzić, ponieważ wszystko, cosudo
robisz, to przełączenie się do innego użytkownika w celu wykonania polecenia.Będziesz musiał
sudo
.źródło
Sudo tworzy zmienną środowiskową „SUDO_USER”, której można użyć do znalezienia użytkownika, który się zalogował (a właściwie który uruchomił Sudo).
Zakładając, że Sudo jest rootem (możliwe jest użycie Sudo w celu uzyskania dostępu również do innych użytkowników), możesz napisać skrypt automatyzujący następujące dwa kroki.
(To nie zadziała, jeśli sudo zostanie zalogowane do użytkownika innego niż root, ponieważ tylko root może rozdawać pliki.)
Automatyzacja będzie trochę pracochłonna. Jeśli źródłem jest pojedynczy plik, a celem nie jest katalog, oznacza to, że praca jest zakończona. Zakładam, że zadałeś pytanie, ponieważ problem jest tylko realnym problemem w bardziej złożonych sytuacjach, np. Podczas robienia czegoś takiego:
cp /path/source/some*files /path/target/directory/
Można napisać skomplikowany skrypt, aby dowiedzieć się, jakie pliki i jakie katalogi są przekazywane, które wcześniej istniały, które faktycznie zostały nadpisane, i aby zmienić własność tylko pomyślnie skopiowanych plików.
Ta praca została już wykonana. Możesz użyć
cpio
- Po sudo do rootowania, użyj cpio, aby skopiować pliki. cpio potrzebuje listy plików do skopiowania, więc jest to proces dwuetapowy. Poniżej używamls
do generowania listy plików do skopiowania.ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
Te
-pdm
środki „tryb Passthrough, tworzenie katalogów, ile potrzeba, utrzymania czasy modyfikacji pliku”--owner $SUDO_USER"
powoduje, że określony użytkownik jest właścicielem plików.Ostatnim operandem jest katalog, w którym cpio musi przechowywać pliki.
Aby dowiedzieć się więcej o niesamowitości CPIO , przejdź do strony podręcznika CPIO tutaj
Jest to również możliwe w jednym poleceniu sudo. Zakładając, że twój użytkownik ma prawa dostępu do plików, używaj sudo tylko do części cpio, tak jak to:
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
W powyższym przypadku używam $ USER zamiast $ SUDO_USER, ponieważ jest on obliczany przed uruchomieniem Sudo. Alternatywnie, jeśli użytkownik nie ma dostępu do listy plików, umieść go w skrypcie opakowania i użyj sudo, aby uruchomić opakowanie. Może to stać się trudniejsze, ale w najprostszym przypadku Opakowanie przyjmuje dwa argumenty, źródło i cel.
To idzie do opakowania „cp_as_user”:
ls $1 | cpio -pdm --owner $SUDO_USER $2
Następnie użyj opakowania w następujący sposób:
sudo cp_as_user "/ path / to / some * files" / path / to / target / directory
źródło