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.
cp source target
chown $SUDO_USER target
(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żywam ls
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
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.