nano: edytor, z którego da się wyjść
Po tej lekcji: kursant otwiera, poprawia i zapisuje plik w nano, szuka w nim, wycina i wkleja linijki, włącza numery linii i bezpiecznie edytuje pliki konfiguracyjne systemu przez sudo albo sudoedit.
Wstęp
Musisz zmienić jedną linijkę w pliku konfiguracyjnym na serwerze. Nie ma myszki, nie ma okienek, nie ma Notatnika. Jest tylko terminal.
Kolega z biurka obok rzuca: „otwórz w vi”. Otwierasz. Wpisujesz coś, na ekranie dzieją się dziwne rzeczy, nie wiesz, jak wyjść. Próbujesz exit, quit, Ctrl+C, nic. Na Stack Overflow pytanie „How do I exit Vim?” już w 2017 roku odwiedziło ponad milion osób. To nie jest żart, to jest statystyka.
Dziś poznasz edytor, który na dole ekranu pisze, jak z niego wyjść. Nazywa się nano. A z vimem zmierzymy się w następnej lekcji, kiedy będziesz już miał bezpieczną przystań.
Notatnik w terminalu
nano to taki Notatnik z Windowsa, tylko w terminalu. Piszesz, strzałkami chodzisz po tekście, Backspace kasuje. Żadnych trybów, żadnych niespodzianek. Wzorowany na edytorze Pico, który kiedyś był częścią programu pocztowego. Dlatego jest taki prosty: miał służyć ludziom, którzy chcieli napisać maila, a nie zostać programistami.
nano notatki.txtJeśli pliku nie ma, nano go utworzy przy zapisie. Jeśli jest, otworzy go.
[Ubuntu] Na Ubuntu nano zwykle już jest. Jeśli nie: sudo apt install nano. [RHEL] Na Red Hacie, Rocky i Almie, jeśli go brakuje: sudo dnf install nano.
Co widać na ekranie
GNU nano 7.2 test.conf
Port 22
#PermitRootLogin yes
PasswordAuthentication yes
X11Forwarding yes
[ Read 4 lines ]
^G Help ^O Write Out ^W Where Is ^K Cut ^T Execute ^C Location
^X Exit ^R Read File ^\ Replace ^U Paste ^J Justify ^/ Go To LineNa górze: wersja nano i nazwa pliku. Na środku: tekst. Na dole: ściąga. I tu jedyna rzecz, którą trzeba wiedzieć, żeby ją przeczytać: daszek ^ znaczy Ctrl. ^X Exit to Ctrl+X, wyjście. M- znaczy Alt, od starego słowa „Meta”. Zapamiętaj daszek i ekran sam Cię poprowadzi. Jak instrukcja ewakuacji przyklejona do drzwi.
Zapis i wyjście: Ctrl+O i Ctrl+X
Ctrl+O zapisuje. „O” od „Write Out”, czyli „wypisz na dysk”. Nano zapyta o nazwę pliku:
File Name to Write: test.confEnter i gotowe. To pytanie ma sens: możesz w tym miejscu wpisać inną nazwę i zapisać kopię pod nowym imieniem.
Ctrl+S zapisuje od razu, bez pytania. Jak w każdym normalnym programie.
Ctrl+X wychodzi. Jeśli masz niezapisane zmiany, nano zapyta:
Save modified buffer?
Y Yes
N No ^C CancelY zapisuje i wychodzi. N wychodzi bez zapisu, czyli wyrzuca zmiany. Ctrl+C się rozmyśla i wraca do edycji. Nie da się przypadkiem wyjść i stracić pracy bez pytania. To jest edytor, który traktuje Cię jak dorosłego, ale pilnuje jak mama.
Szukanie: Ctrl+W
Plik konfiguracyjny potrafi mieć tysiąc linijek. Strzałką w dół do świąt nie dojedziesz.
Ctrl+W, „Where Is”, gdzie jest. Wpisujesz szukane słowo, Enter, kursor skacze do pierwszego trafienia. Następne trafienie: Alt+W. Wcześniejsze: Alt+Q.
Wycinanie i wklejanie: Ctrl+K i Ctrl+U
Tu nano jest trochę inny niż reszta świata. Nie ma Ctrl+C i Ctrl+V. Jest:
- Ctrl+K wycina całą linijkę, na której stoi kursor. „K” od „kill”, zabij. Nano to edytor łagodny, ale słownictwo ma z lat dziewięćdziesiątych.
- Ctrl+U wkleja to, co wyciąłeś. „U” od „uncut”, odetnij z powrotem.
- Alt+6 kopiuje linijkę bez wycinania.
Ctrl+K kilka razy pod rząd wycina kilka linijek naraz, a Ctrl+U wkleja je wszystkie. To najszybszy sposób na przeniesienie kawałka pliku.
Pokaz: szukam linijki z PermitRoot, wycinam ją, skaczę na koniec pliku przez Alt+/ i wklejam.
GNU nano 7.2 test.conf *
Port 22
PasswordAuthentication yes
X11Forwarding yes
#PermitRootLogin yesGwiazdka po nazwie pliku na górze znaczy: „są niezapisane zmiany”.
A jak coś zepsujesz: Alt+U cofa, Alt+E przywraca. A Ctrl+Z? Odruch z Windowsa tu nie cofa. Nano 7.2 pokaże tylko podpowiedź:
[ To suspend, type ^T^Z ]Czyli: Ctrl+Z w terminalu znaczy „uśpij program”, a nano pilnuje, żebyś nie zrobił tego przypadkiem. O usypianiu programów powiemy sobie w module o procesach.
Numery linii: -l
nano -l test.conf GNU nano 7.2 test.conf
1 Port 22
2 PasswordAuthentication yes
3 X11Forwarding yes
4 #PermitRootLogin yes-l to „line numbers”. Po co? Bo komunikaty o błędach w konfiguracji zwykle mówią: „błąd w linii 37”. Z numerami od razu wiesz, gdzie patrzeć. W trakcie pracy numery włącza i wyłącza Alt+N.
Możesz też od razu skoczyć do konkretnej linii:
nano +37 /etc/ssh/sshd_configAlbo w środku nano: Ctrl+/ i numer linii. Na niektórych terminalach Ctrl+/ nie dochodzi do programu, wtedy działa Alt+G.
Dwa skróty, które pokochasz w konfiguracji
Alt+3 wstawia albo usuwa # na początku linijki. W plikach konfiguracyjnych # to komentarz, czyli „ta linijka nie działa”. Wyłączenie opcji jednym skrótem, bez kasowania. Jak przekreślenie w zeszycie: nadal widzisz, co było, ale nie liczy się.
nano -B robi kopię zapasową przy zapisie. Po zapisaniu obok pliku leży jego poprzednia wersja z tyldą na końcu:
nano -B test.conf
ls
diff test.conf test.conf~test.conf
test.conf~
3c3
< #X11Forwarding yes
---
> X11Forwarding yesdiff pokazuje różnicę: w linii 3 zakomentowałem X11Forwarding. Przy grzebaniu w konfiguracji serwera ta tylda nieraz uratuje Ci weekend.
Edycja plików systemowych: sudo
Pliki w /etc należą do administratora. Otwórz /etc/hosts jako zwykły użytkownik:
nano /etc/hostsNano od razu ostrzega na dole:
[ File '/etc/hosts' is unwritable ]Jeśli to zignorujesz, piętnaście minut poprawiasz plik, naciskasz Ctrl+O i dostajesz:
[ Error writing /etc/hosts: Permission denied ]Klucze do pokoju z segregatorami ma tylko administrator. Są dwa sposoby, żeby go zawołać.
Pierwszy, najprostszy:
sudo nano /etc/hostsCały nano chodzi z prawami roota. Działa, ale ma wadę: edytor z pełnymi uprawnieniami może zapisać cokolwiek, gdziekolwiek. Ctrl+R wczyta Ci każdy plik w systemie, a Ctrl+O zapisze w każde miejsce.
Drugi, elegantszy:
sudoedit /etc/hostssudoedit robi to tak: kopiuje plik do tymczasowego, którego właścicielem jesteś Ty. Otwiera edytor jako Ty, zwykły użytkownik. Po wyjściu, jeśli coś zmieniłeś, kopiuje plik z powrotem na miejsce jako root. Jak notariusz: nie dostajesz oryginału aktu do domu, dostajesz kopię, a on potem przepisuje poprawki do księgi.
Który edytor otworzy sudoedit? Patrzy kolejno na zmienne SUDO_EDITOR, VISUAL i EDITOR. Jak żadnej nie ma, bierze domyślny z ustawień sudo, a to bywa vi. Żeby mieć pewność:
export EDITOR=nano
sudoedit /etc/hosts[Ubuntu] Na Ubuntu systemowy edytor domyślny zmienisz też przez sudo update-alternatives --config editor. Na stałe export zapiszemy w pliku .bashrc w lekcji o ustawieniach Basha.
Jak to działa pod spodem
Nano wczytuje cały plik do pamięci. Wszystko, co piszesz, dzieje się w pamięci, na dysku nic się nie zmienia, dopóki nie zapiszesz. Dlatego Ctrl+X z odpowiedzią N wyrzuca zmiany bez śladu.
Przy zapisie nano zapisuje nowy tekst do tego samego pliku. A klawisze? Terminal zamienia Ctrl+litera na jeden znak sterujący, kod od 1 do 26. Ctrl+X to znak numer 24. Nano odbiera ten znak i wie, co robić. To dlatego skrót z Ctrl działa nawet przez SSH z drugiego końca świata: leci zwykłym bajtem, tak samo jak litera.
A Alt? Terminal wysyła najpierw znak Esc, a zaraz po nim literę. Dlatego w nano zamiast Alt+U możesz nacisnąć Esc, puścić, a potem U. Przydaje się na Macu, gdzie Option domyślnie wstawia dziwne znaczki zamiast działać jak Alt. [macOS] W Terminalu na Macu włączysz to w ustawieniach profilu: „Use Option as Meta key”.
Pliki ustawień nano: systemowy /etc/nanorc i Twój ~/.nanorc. Wpis set linenumbers w ~/.nanorc włączy numery linii na stałe, bez -l.
Ściąga flag
| Komenda / skrót | Flaga | Co robi |
|---|---|---|
nano | -l | numery linii |
nano | -B | kopia zapasowa plik~ przy zapisie |
nano | +N | otwiera plik na linii N |
nano | -v | tylko do odczytu, nic nie zepsujesz |
nano | -m | włącza myszkę |
| Ctrl+O | zapisz (pyta o nazwę) | |
| Ctrl+S | zapisz bez pytania | |
| Ctrl+X | wyjdź (pyta, czy zapisać) | |
| Ctrl+W | szukaj; Alt+W następne, Alt+Q poprzednie | |
| Ctrl+\ | zamień | |
| Ctrl+K | wytnij linijkę | |
| Ctrl+U | wklej | |
| Alt+6 | kopiuj linijkę | |
| Alt+U / Alt+E | cofnij / ponów | |
| Ctrl+/ albo Alt+G | idź do linii | |
| Alt+3 | zakomentuj / odkomentuj linijkę | |
| Alt+N | numery linii w locie | |
| Ctrl+G | pomoc | |
sudoedit plik | bezpieczna edycja pliku systemowego |
⚠ Typowy błąd
Edytujesz plik konfiguracyjny jako zwykły użytkownik, zapisujesz i:
[ Error writing /etc/hosts: Permission denied ]Odruch: wyjść, sudo nano, wszystko jeszcze raz. Piętnaście minut pracy do kosza.
Nie wychodź. Zapisz pracę gdzieś, gdzie wolno pisać. Ctrl+O i zamiast /etc/hosts wpisz /tmp/hosts. Potem wyjdź i skopiuj plik na miejsce:
sudo cp /tmp/hosts /etc/hostsPraca uratowana. Ale to jest rozwiązanie awaryjne. Uprawnienia i właściciel pliku po takiej kopii mogą się różnić od oryginału, a w niektórych plikach to ma znaczenie. Dlatego na przyszłość: plik z /etc od razu otwieraj przez sudoedit albo sudo nano. I jeszcze jedno: zanim ruszysz ważny plik konfiguracyjny na serwerze, zrób kopię sudo cp plik plik.bak. Ćwicz na maszynie wirtualnej, nie na serwerze firmy w piątek o szesnastej.
✎ Zadanie
- Skopiuj
/etc/hostsdo swojego folderu domowego jakohosts-test. - Otwórz kopię w nano z numerami linii.
- Znajdź Ctrl+W linijkę z
localhost. - Wytnij ją Ctrl+K i wklej na końcu pliku Ctrl+U.
- Na początku pliku dopisz linijkę
# moja kopia ćwiczeniowa. - Zapisz i wyjdź, a potem sprawdź wynik
cat. - Bonus: zrób to samo z
nano -Bi porównaj obie wersjediff.
Pokaż rozwiązanie
cp /etc/hosts ~/hosts-test
nano -l -B ~/hosts-test
cat ~/hosts-test
diff ~/hosts-test~ ~/hosts-testW nano: Ctrl+W, localhost, Enter. Ctrl+K wycina linijkę. Alt+/ skacze na koniec, Ctrl+U wkleja. Alt+\ wraca na początek pliku, tam piszę komentarz i Enter. Ctrl+S, Ctrl+X. U mnie wyszło:
# moja kopia ćwiczeniowa
127.0.1.1 serwer
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhostA diff z kopią zapasową:
1c1
< 127.0.0.1 localhost
---
> # moja kopia ćwiczeniowa
9a10
> 127.0.0.1 localhostLinijka 1 zmieniona, po linijce 9 coś dopisane. Dokładnie to, co zrobiliśmy. Twój plik może wyglądać inaczej, każdy system ma trochę inny /etc/hosts. Ważne, że to była kopia. Oryginał w /etc śpi spokojnie.
Co dalej
Nano jest przyjazny. Ale przyjdzie dzień, kiedy wejdziesz na serwer, na którym nano nie ma. Jest tylko on: vi. W następnej lekcji pokażę, jak przeżyć spotkanie z vimem, jak z niego wyjść i dlaczego po tygodniu możesz go nawet polubić.