Przesłałem niektóre pliki czcionek do AWS (z systemem Amazon Linux) i przeniosłem je do /usr/share/fonts
katalogu za pomocą cp
polecenia w .ebextensions.
Kiedy korzystam z SSH na moim komputerze Mac i używam ls -a
, widzę, że niektóre pliki mają różne kolory - jeden zestaw plików czcionek jest czarny, a inne są zielone. Jestem ciekawy, co spowodowało, że tak się stało i czy spowoduje to problemy w moim kodzie .
Z innej odpowiedzi na AskUbuntu znalazłem klucz do interpretacji tych kolorów. Nie rozumiem, dlaczego plik .ttf byłby wykonywalny ani dlaczego jeden zestaw plików .ttf zostałby rozpoznany, a nie inny.
Niebieski: katalog
Zielony: plik wykonywalny lub rozpoznany
Sky Blue: połączony plik
Żółty z czarnym tłem: urządzenie
Różowy: plik obrazu graficznego
Czerwony: plik archiwum
Wszystkie pliki zostały przesłane do komputera Mac z różnych stron czcionek przed przesłaniem.
źródło
Odpowiedzi:
ls -l
powie ci definitywnie, czy plik jest wykonywalny, czy nie. Nie sądzę, żeby była tu jakaś wielka tajemnica. Pobrałeś pliki z różnych źródeł, z których każde mogło mieć ustawione różne bity uprawnień z tego czy innego powodu. * Jeśli nie lubisz widzieć niektórych z kolorami, a innych bez próbowaniachmod -x *.ttf
... pliki czcionek nie powinny wymagać zestawu bitów wykonywalnych.* Jak wysoko oceniany komentarz Matteo Italia, który należy zachować, mówi: Najprawdopodobniej zostały one skopiowane z woluminu FAT lub NTFS, które nie przechowują bitu wykonywalnego, więc są montowane domyślnie, tak aby wszystkie pliki miały ustawiony bit wykonywalny .
źródło
Wygląda na to,
ls
że wykonywane polecenie jest aliasemls --color
Możesz to sprawdzić, uruchamiając źródło
ls
:Za pomocą cytatów:
„ls” -a
Używając pełnej ścieżki (np. Jeśli
ls
lokalizacja jest w środku/bin/ls
) i sprawdź, czy pokazuje kolory, czy nie:/ bin / ls -a
Uwaga: uruchomione
ls -la
pokaże szczegóły plików, a będziesz mógł zobaczyć pełne szczegóły każdego pliku, co pozwoli ci sprawdzić z oczekiwanymi danymi wyjściowymils --color
źródło
\ls -a
lub użyć wbudowanego poleceniacommand ls -a
. Jeśli chcesz zobaczyć, jak polecenie jest rozwiązywane, zamiast je uruchamiać, jesttype -a ls
.ls
.ls
. Ale to dobra informacja.Kolor wskazuje, że plik jest oznaczony jako „wykonywalny” *
Bity uprawnień do wykonywania (jeden dla użytkownika, jeden dla grupy, jeden dla drugiego) oznaczają, że jeśli nazwa pliku zostanie przekazana do jednego z wywołań systemu exec, jądro przejdzie i spróbuje go wykonać.
Konwencja polega na tym, że tylko pliki, które są rzeczywiście przeznaczone do egzekucji, mają ustawiony bit wykonywalny. Jednak podczas przenoszenia / kopiowania plików, szczególnie w środowisku wieloplatformowym, łatwo jest przypadkowo uzyskać lub stracić bity wykonywalne.
Pliki przechowywane w systemie plików, który nie obsługuje uprawnień uniksowych (fat, ntfs itp.), Mogą pojawić się w systemie jako pliki wykonywalne. Przeniesienie lub skopiowanie tych plików do systemu plików UNIX za pomocą narzędzia, które zachowuje uprawnienia, pozwoli zachować te bity wykonywalne.
Z drugiej strony użycie narzędzi do przenoszenia plików, które albo nie mogą zachować uprawnień, albo są używane z opcją zachowania uprawnień niezaznaczonymi, prawdopodobnie spowoduje, że kopia nie zostanie oznaczona jako wykonywalna, nawet jeśli oryginał był.
Więc po przeniesieniu na różne platformy za pomocą różnych narzędzi, bity uprawnień do wykonywania mogą skończyć się w dość arbitralnym stanie.
* Nie jestem w 100% pewien, jak ls obsługuje przypadek, w którym ustawione są niektóre, ale nie wszystkie bity wykonywalne.
źródło
Jak wspomniano w poprzednich odpowiedziach, kolorowanie ma wskazywać, czy pliki są uznawane za pliki wykonywalne, czy nie.
Uprawnienie do „wykonywania” (= bit) w Linuksie i większości innych Uniksów ma jedno znaczenie dla plików, a drugie dla katalogów.
W przypadku katalogów, jeśli masz do niego uprawnienia, możesz zobaczyć jego zawartość. Jeśli tego nie zrobisz, nie możesz cd do katalogu, ani nie możesz wyświetlić w nim plików, nawet jeśli masz zarówno dostęp do odczytu i zapisu do katalogu.
W przypadku zwykłych plików (w przeciwieństwie do plików urządzeń i innych specjalnych typów plików uniksowych) bit wykonania oznacza, że jeśli użyjesz nazwy pliku w wierszu poleceń, O / S (a ściślej: shell) spróbuje „wykonać” lub uruchomić plik jako polecenie. I odwrotnie, jeśli nie masz uprawnień do wykonania pliku, nie możesz go uruchomić z wiersza poleceń.
Tak więc, jeśli na przykład usuniesz uprawnienie x od wszystkich użytkowników w pliku / bin / cat (które jest poleceniem uniksowym), ty sam lub ktokolwiek inny, a dowolny program, który spróbuje użyć polecenia „cat”, zawiedzie.
Są to wtedy polecenia systemu operacyjnego, takie jak „cat” i „grep”, które zwykle mają pliki wykonywalne w / * / bin / directories - / bin, / usr / bin, / sbin, / usr / sbin itp.
I wtedy mogą istnieć nieskompilowane, interpretowane skrypty, które są albo napisane w jakimś języku programowania, takim jak Python lub skrypty powłoki (w zasadzie polecenia, które piszesz jakby z linii poleceń podczas sshing na serwer).
Teraz, gdy ustawisz bit wykonania na pliku skryptu (na przykład plik foobar) i spróbujesz wykonać go za pomocą powłoki: „./foobar”, powłoka próbuje przeanalizować plik i znaleźć odpowiedni program do przekazania skryptu do.
Robi to powłoka, próbując odczytać pierwszy wiersz pliku i znaleźć notację „shebang”, który program ma uruchomić.
Więc jeśli twój foobar był plikiem tekstowym z pierwszym wierszem w ten sposób:
Następnie powłoka spróbuje wykonać polecenie:
/usr/bin/python foobar
w zasadzie wywołując interpreter Pythona i przekazując mu nazwę pliku foobar jako skrypt Pythona.Jeśli powłoka nie znajdzie takiej pierwszej linii w twoim pliku, wówczas spróbuje wykonać foobar, tak jakby zawierał polecenia powłoki.
Jeśli plik z bitem wykonywalnym nie zawiera prawidłowych poleceń powłoki, powłoka po prostu narzeka.
Tak by się stało, gdybyś miał pliki TTF z ustawionym bitem exec i próbował uruchomić go z wiersza poleceń:
Tak więc w przypadku czcionek jest to prawdopodobnie fajniejsze, jeśli bit exec nie jest ustawiony, ale tak naprawdę niczego nie zmienia.
PS Kilka dodatkowych informacji. Jeśli usuniesz bit wykonania z jakiegoś polecenia lub skryptu, może on zostać przekazany do dowolnego innego programu jako argument. Jeśli ten inny program wie, jak wykonać polecenie, usunięcie bitu exec naprawdę nie miało znaczenia. Na przykład, foobarowy skrypt Python nadal byłby uruchamiany przez interpreter Pythona, gdybyś po prostu zrobił to z linii poleceń:
zamiast
To samo z przykładem poleceń systemowych, takich jak „cat”. Jeśli usuniesz bit exec z „cat”, nadal możesz przekazać go do nowej instancji powłoki w celu wykonania:
będzie działać, nawet jeśli usunąłeś bit exec z cat i
nie.
źródło
cat
lubecho
, nie pozwala na uruchomienie gosh -c 'cat myfile'
, anisystem("cat", "myfile")
w językach takich jak Ruby. Powodem, dla którego Python może uruchamiać.py
pliki niewykonywalne , jest to, że wczytuje je jako ciąg tekstowy, a następnie używa interpretera, aby tekst zachowywał się jak kod.execve
wywołanie systemowe nalega na pozwolenie na wykonanie. W systemach opartych na glibc możesz wywołać dynamiczny linker jako program, aby uzyskać w przybliżeniu taki sam efekt jak linia shebang (/lib64/ld-linux-x86-64.so.2 /bin/cat
) i działa to dla mnie, nawet jeśli plik w wierszu poleceń nie jest wykonywalny, alesh -c cat
nie zrobi tego dla Was.