Przejdź do treści
Lekcja 11 z 117

Kurs › Moduł 1 › Lekcja 11

nano: edytor, z którego da się wyjść

⏱ ok. 9 min czytania· moduł 1: Praca w powłoce

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.txt

Jeś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 Line

Na 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.conf

Enter 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 Cancel

Y 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 yes

Gwiazdka 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_config

Albo 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 yes

diff 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/hosts

Nano 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/hosts

Cał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/hosts

sudoedit 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ótFlagaCo robi
nano-lnumery linii
nano-Bkopia zapasowa plik~ przy zapisie
nano+Notwiera plik na linii N
nano-vtylko do odczytu, nic nie zepsujesz
nano-mwłącza myszkę
Ctrl+Ozapisz (pyta o nazwę)
Ctrl+Szapisz bez pytania
Ctrl+Xwyjdź (pyta, czy zapisać)
Ctrl+Wszukaj; Alt+W następne, Alt+Q poprzednie
Ctrl+\zamień
Ctrl+Kwytnij linijkę
Ctrl+Uwklej
Alt+6kopiuj linijkę
Alt+U / Alt+Ecofnij / ponów
Ctrl+/ albo Alt+Gidź do linii
Alt+3zakomentuj / odkomentuj linijkę
Alt+Nnumery linii w locie
Ctrl+Gpomoc
sudoedit plikbezpieczna 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/hosts

Praca 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

  1. Skopiuj /etc/hosts do swojego folderu domowego jako hosts-test.
  2. Otwórz kopię w nano z numerami linii.
  3. Znajdź Ctrl+W linijkę z localhost.
  4. Wytnij ją Ctrl+K i wklej na końcu pliku Ctrl+U.
  5. Na początku pliku dopisz linijkę # moja kopia ćwiczeniowa.
  6. Zapisz i wyjdź, a potem sprawdź wynik cat.
  7. Bonus: zrób to samo z nano -B i porównaj obie wersje diff.
Pokaż rozwiązanie
cp /etc/hosts ~/hosts-test
nano -l -B ~/hosts-test
cat ~/hosts-test
diff ~/hosts-test~ ~/hosts-test

W 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 localhost

A diff z kopią zapasową:

1c1
< 127.0.0.1 localhost
---
> # moja kopia ćwiczeniowa
9a10
> 127.0.0.1 localhost

Linijka 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ć.