Nie mogę polecić zostania właścicielem /usr/local
; w większości sytuacji jest to prawdopodobnie mniej bezpieczne niż używanie sudo
.
Twoje pytanie sugeruje dwa powody, dla których możesz chcieć chown
/usr/local
.
Pierwszym jest uniknięcie konieczności sudo
instalowania oprogramowania. Dla niektórych (np. Autora tej odpowiedzi ) może to oznaczać , że chcesz pracować wydajnie, lub zapisać naciśnięcia klawiszy potrzebne do sudo
wpisania i wprowadzenia hasła. Ale prawdopodobnie, kiedy mówisz „niepotrzebne”, powołujesz się na zasadę najmniejszego przywileju :
Domyślnie root
jest właścicielem katalogu. Oznacza to, że aby zainstalować tam, musisz użyć sudo
. W przypadku komputera dla jednego użytkownika lub dewelopera wydaje się to niepotrzebnym dodatkowym użyciem polecenia
Dość często słyszę / czytam ludzi opiniotwórczych / narzekających w stylu: „Tylko ja korzystam z tego systemu, więc nie powinienem używać sudo
i wprowadzać hasła”. Dla czytelników, którzy mają taki pogląd i ponieważ jest on istotny w tym miejscu, przypomnijmy sobie podstawowy powód bezpieczeństwa dla rootowania własnymi rzeczami.
Większość plików programów zainstalowanych w systemie Ubuntu ma tryb plików 755 lub zapisany symbolicznie rwxr-xr-x
, co oznacza, że każdy użytkownik lub program może je wykonać , ale tylko właściciel plików, root, może je zmodyfikować. (Technicznie wymaga to również, aby nikt poza rootem nie miał w
uprawnień do katalogu, który je zawiera, aby inni użytkownicy nie mogli ich usunąć ani przenieść).
Oznacza to, że skromny użytkownik może uruchomić dowolny program. Jeśli spróbujesz użyć programu do zrobienia czegoś, do czego nie masz uprawnień, na przykład do wykonania operacji zapisu na pliku należącym do roota, spowoduje to błąd. Powoduje to, że literówka w niektórych poleceniach, błędnej aplikacji lub złośliwym kodzie jest mniej prawdopodobne, aby zepsuć twój system - chyba że działa jako root, nie będzie miał na to pozwolenia. Jest to szczególnie przydatne podczas uruchamiania programów, które wchodzą w interakcje z Internetem.
Jeśli ty chown
/usr/local
, dowolny program działający z twoimi uprawnieniami może tam zapisać pliki, które z jakiegoś powodu mogą zostać później wykonane jako root, na przykład poprzez zastąpienie innego polecenia o tej samej nazwie. /usr/local/bin
jest domyślnie $PATH
, a sudo
„s secure_path
, a to przychodzi przed innych miejscach w obu. Więc jeśli mam dwa pliki wykonywalne
/usr/local/bin/chown
/bin/chown
kiedy wykonać sudo chown ...
, w zostanie wykonany .chown
/usr/local/bin
Ale prawdopodobnie już to wszystko wiedziałeś, ponieważ twoim drugim powodem jest bezpieczeństwo:
Dodatkowo, jeśli masz zainstalowane lokalnie skompilowane oprogramowanie /usr/local
, oprogramowanie potrzebuje obecnie roota, aby się zmodyfikować lub zainstalować wtyczki. Wydaje się to niebezpieczne - chcę używać tylko sudo
wtedy, gdy DOKŁADNIE wiem, co się stanie.
Na wszelki wypadek, gdy trzeba o tym wspomnieć, absolutnie słuszne jest (zgodnie z FHS), aby zainstalować lokalnie skompilowane oprogramowanie /usr/local
, ale sama kompilacja powinna odbywać się gdzieś w twoim $HOME
, bez sudo
, aż do ostatniego kroku, kiedy piszesz sudo make install
lub odpowiadasz.
Myślę, że sugerujesz, że uruchamiając program zainstalowany /usr/local
jako nieuprzywilejowany właściciel, możesz użyć określonych błędów uprawnień zgłaszanych podczas próby samodzielnej aktualizacji, aby zobaczyć, że próbuje zmodyfikować inną lokalizację systemu plików, która nie jest twoją własnością w sposób nie chcę, żebyś mógł to powstrzymać.
To może być pomocne. Implikacja polega na tym, że ufasz programowi, że robi wszystko, co mu się podoba /usr/local
, ale nie gdzie indziej. Jeśli żąda podniesionych uprawnień, możesz odmówić zezwolenia na aktualizację lub odinstalować. To ma dla mnie sens. Ale myślę, że próba użycia /usr/local
tego rodzaju jako piaskownicy w ten sposób prawdopodobnie nie jest dobrym pomysłem, a przynajmniej nie jest najbezpieczniejszym rozwiązaniem. To nie jest właściwie izolowana lokalizacja ( /opt
jest trochę bardziej izolowana, ponieważ nie ma jej w ustawieniach domyślnych $PATH
). Program może zapisać lub usunąć coś, co /usr/local
może spowodować uszkodzenie. Inne (potencjalnie źle napisane) programy, które uruchamiasz, mogą tam pisać i wykonywać kod, o którym nie wiesz.
Jeśli obawiasz się, że pozwolisz programowi na bezpieczną aktualizację, prawdopodobnie powinieneś poszukać alternatywnych rozwiązań (być może specyficznych dla programu, jak na przykład w Pythonie, lub możesz poszukać przystawki lub podobnej implementacji, która odpowiada Twoim potrzebom, lub użyć kontenery lub maszyna wirtualna do testowania potencjalnie niebezpiecznego oprogramowania) przed ujawnieniem lokalizacji systemu (nawet względnie użytkownika) do zapisania przez programy uruchomione przez zwykłego użytkownika. Wydaje mi się, że może to mieć nieprzewidywalne skutki, ponieważ pozwala programom tymczasowo podwyższać uprawnienia sudo
.
/usr/local/bin
tym katalogu głównym (a także innymi użytkownikami)? Czy nie muszą być własnością roota? Ponadto, polecenia root używane - w tym polecenia/usr/local/sbin
wewnątrz - mogą zależeć od bibliotek współdzielonych w/usr/local/lib
. Zmiana tych bibliotek może wprowadzić dowolne zmiany w zachowaniu poleceń, które ich używają. Naleganie, aby/usr/local/sbin
pozostać własnością root, wydaje się całkowicie arbitralne.W przypadku oprogramowania, którego potrzebujesz, użyj katalogu domowego zamiast
/usr/local
.Zamiast zmieniać własność
/usr/local
lub uruchamiać polecenia jako root, gdy nie chcesz, powinieneś po prostu skonfigurować swoje kompilacje, aby instalowały się w twoim katalogu domowym zamiast/usr/local
. Rozwiązuje to wszystkie potencjalne problemy ze zmianą własności/usr/local
, w tym sposób, w jaki jejbin
isbin
podkatalogi są naroot
drodze.Jeśli musisz zezwolić innym użytkownikom na uruchamianie twojego oprogramowania, możesz dać im dostęp. W rzeczywistości prawdopodobnie będą już w stanie to zrobić, ponieważ domyślnie twój katalog domowy ma dozwolony dostęp do odczytu i wykonywania . (Jeśli tego nie chcesz, możesz to dość łatwo zmienić, po prostu używając
chmod
dowolnych plików lub katalogów, które chcesz ustawić jako prywatne, i ewentualnie również zmieniając swójumask
.)Po zainstalowaniu oprogramowania w katalogu domowym, pliki binarne, które zostałyby wprowadzone,
/usr/local/bin
wejdą zamiast niego . Otrzymasz inne podkatalogi swojego katalogu domowego odpowiadające podkatalogom tego , którego potrzebuje zainstalowane oprogramowanie. Zwykle dzieje się to automatycznie po zainstalowaniu oprogramowania z kodu źródłowego./home/username/bin
/usr/local
Konfigurowanie twoich kompilacji
Większość oprogramowania tworzonego z kodu źródłowego ma jeden etap:
W zdecydowanej większości oprogramowania dostarczanego ze
configure
skryptem, który można uruchomić w ten sposób, domyślnie konfiguruje się kompilację do instalacji wewnątrz,/usr/local
gdy w końcu uruchomisz ją,sudo make install
aby ją zainstalować. Powodem jest to, że jest to domyślnie równoważne z uruchomieniem:Aby skonfigurować kompilację do instalacji w katalogu domowym, użyj tego zamiast:
W praktyce w Ubuntu ścieżki do katalogu domowego nie zawierają spacji, innych białych znaków ani innych znaków, które będą traktowane specjalnie przez powłokę, np.
*
Chyba że skonfigurujesz konto użytkownika dość dziwnie, możesz po prostu wpisać:(Nie polecam jednak przyzwyczaić się do pisania skryptów . Ponadto w niektórych innych systemach operacyjnych - takich jak macOS - rzadziej ścieżki do katalogów domowych użytkowników zawierają spacje).
Lub jeśli wolisz, możesz wpisać pełną ścieżkę do katalogu domowego:
(
username
Oczywiście zamień na swoją rzeczywistą nazwę użytkownika. Jeśli z jakiegoś powodu twojego katalogu domowego nie/home
ma, będziesz musiał odpowiednio dostosować.)Instalowanie twoich kompilacji
Po uruchomieniu
make
możesz być przyzwyczajony do uruchamianiasudo make install
, ale podczas instalacji we własnym katalogu domowym nie musisz uruchamiać go jako root, więc możesz - i powinieneś - usiąśćsudo
. Po prostu biegnij:Podobnie w przypadku oprogramowania obsługującego
uninstall
cel:Właśnie o to prosiłeś ... nie w twoim katalogu domowym
/usr/local
.Uruchamianie programów
Prawdopodobnie
bin
podkatalogu katalogu domowym jest:$PATH
, lub$PATH
jeśli wylogujesz się i wrócisz.Powodem jest to, że
.profile
plik w katalogu domowym, który zawiera polecenia uruchamiane podczas logowania, zawiera go domyślnie dla kont użytkowników utworzonych w większości wersji Ubuntu (w tym początkowego konta administratora utworzonego podczas instalacji systemu operacyjnego):Ten kod działa, gdy się logujesz (ponieważ jest
.profile
) i umieszcza Twój osobistybin
katalog$PATH
tylko wtedy, gdy istnieje. Dlatego może być konieczne wylogowanie się i ponowne zalogowanie.Starsze wersje, takie jak Ubuntu 14.04, a także nowsze wersje, takie jak Ubuntu 17.10, mają tę funkcję . Jednak Ubuntu 16.04, które jest prawdopodobnie najpopularniejszą wersją tego pisma, ma to zamiast tego:
To po prostu dodaje
bin
podkatalog twojego katalogu domowego ---, a także.local/bin
podkatalog - do twojego$PATH
, bez sprawdzania, czy te katalogi faktycznie istnieją. Jeśli więc korzystasz z wersji 16.04 lub zaktualizowałeś system z wersji 16.04, kiedy Twoje konto użytkownika zostało utworzone, wtedybin
podkatalog twojego katalogu domowego jest już prawdopodobnie w twoim katalogu$PATH
.Twój
.profile
plik jest kopiowany z/etc/skel
katalogu podczas tworzenia konta użytkownika. Jeśli twoje konto użytkownika zostało utworzone w starszej wersji Ubuntu, otrzymało tę wersję.profile
i nie zostało zmienione - dla twojego konta użytkownika - przez uaktualnienie do nowszej wersji.Gdy
bin
podkatalog twojego katalogu domowego będzie już w twoim$PATH
, będziesz mógł uruchamiać programy, których pliki wykonywalne są tam instalowane, po prostu wpisując ich nazwy, tak jak w przypadku programów zainstalowanych przez menedżera pakietów Ubuntu lub zainstalowanych wewnątrz/usr/local
..local
OptionByć może zauważyłeś, że domyślny
.profile
plik dla kont użytkowników utworzonych w niektórych wersjach Ubuntu, w tym w 16.04, jak opisano powyżej, dodaje nie tylko$HOME/bin
twojej ścieżce, ale także$HOME/.local/bin
. Jeśli.profile
nie dodajesz tego, ale chcesz , możesz to po prostu edytować.Choć często używane do przechowywania ustawień i danych w pamięci podręcznej , można również zainstalować oprogramowanie w
.local
podkatalogu katalogu domowego. Powinieneś czuć się nieskrępowany, ponieważ z punktu widzenia użyteczności i bezpieczeństwa--prefix="$HOME/.local"
jest podobny--prefix="$HOME"
.Pamiętaj, że pliki i katalogi, które zaczynają się od,
.
nie są domyślnie wyświetlane w graficznych przeglądarkach plików (użyj Ctrl+, Haby je odkryć i ukryć) lub wls
poleceniu (przekaż flagę-A
lub,-a
aby je pokazać). To może nie być to, czego chcesz lub może być dokładnie to, czego chcesz. Jest to kwestia osobistych preferencji.Zauważyłem jednak, że niektóre zautomatyzowane menedżery pakietów oparte na źródłach, które budują i instalują oprogramowanie w swoim katalogu domowym
$HOME/.local
. Nie wiem, jak często to się dzieje - mam nadzieję, że zbadam dalej i zaktualizuję tę odpowiedź - ale możesz chcieć używać tylko$HOME
do rzeczy, które kompilujesz ręcznie. W ten sposób będzie jasne, skąd się wzięły rzeczy. A jeśli dojdzie do kolizji, oprogramowanie nadal prawdopodobnie będzie akceptowalnie współistnieć.Możesz również celowo zainstalować niektóre oprogramowanie
$HOME/.local
i inne oprogramowanie w$HOME
. To zależy od Ciebie. Którykolwiekbin
katalog pojawi się jako pierwszy w$PATH
zmiennej środowiskowej, to ten, z którego uruchomione zostanie polecenie, w przypadku, gdy w obu występują polecenia o tej samej nazwie.Podziękowania należą się Zanna i Videonauth za wskazanie błędów w poprzedniej wersji tej odpowiedzi, dotyczących tego, które wersje Ubuntu mają domyślny kod
.profile
, oraz pomoc w ich poprawieniu (patrz także tutaj ).źródło
Jeśli sudo jest taką niedogodnością, po prostu zaktualizuj / etc / sudoers, abyś nie musiał wpisywać hasła podczas uruchamiania sudo. Uważam, że jest to lepsze rozwiązanie niż zmiana właściciela / usr / local.
źródło
/usr/local
, musisz użyć sudo, co jest potencjalnie niebezpieczne.