Tekstualni editori

Na Linuxu se konfiguracija ne podešava kroz prozore sa dugmadima. Sve što sistem radi zapisano je u tekstualnim fajlovima — ko sme da se prijavi preko SSH-a, koja se usluga pokreće pri startu, gde web server traži sajt. Zato je editor alat koji ćeš koristiti češće od bilo kog drugog.

Ova stranica je pregled: koji editori postoje, koji da izabereš i šta moraš da znaš pre nego što prvi put otvoriš fajl u /etc.

Dva editora koja te zanimaju

Postoji ih mnogo, ali u praksi biraš između dva:

  • nano — jednostavan, prečice ispisane u dnu ekrana, radi kako očekuješ. Idealan dok učiš.
  • vi — čudan na prvi pogled, ali uvek je instaliran. Na minimalnom serveru, u kontejneru, u režimu za oporavak — nano možda nema, vi ima.

Preporuka je jasna: koristi nano za svakodnevni rad, ali nauči minimum vi-ja. Nije stvar ukusa nego osiguranja. Pre ili kasnije zatećićeš se na sistemu gde drugog izbora nema, i tada ne želiš da učiš.

Postoje i emacs i grafički editori poput gedit-a ili Kate-a, ali na serverima ih po pravilu nema, pa ih ovde ne obrađujemo.

nano

$ nano beleske.txt

Otvara se fajl, kursor je u tekstu, kucanje radi odmah. Nema režima, nema iznenađenja. U dnu ekrana stoji podsetnik na prečice:

  GNU nano 7.2                    beleske.txt
prvi red teksta

^G Help      ^O Write Out  ^W Where Is   ^K Cut
^X Exit      ^R Read File  ^\ Replace    ^U Paste

Znak ^ znači Ctrl. Dakle ^X je Ctrl+X.

Šta ti je zaista potrebno

  • Ctrl+O — snimi (pita za ime, potvrdi Enterom)
  • Ctrl+X — izađi (ako ima izmena, pita da li da snimi)
  • Ctrl+W — pretraga, Alt+W sledeće pojavljivanje
  • Ctrl+K — iseci red, Ctrl+U nalepi
  • Ctrl+_ — skoči na određeni red
  • Alt+U — poništi poslednju izmenu

Prečica Ctrl+K se ponavlja — pet pritisaka iseče pet redova, a Ctrl+U ih vrati sve zajedno. Tako se u nano-u premešta blok teksta.

Opcija koja se isplati

$ nano -l /etc/ssh/sshd_config

Uključuje brojeve redova. Kad servis prijavi grešku u 47. redu, hoćeš da taj red vidiš odmah. Ako želiš da to bude podrazumevano, napravi ~/.nanorc:

set linenumbers
set tabstospaces
set constantshow

Redom: brojevi redova, tab se pretvara u razmake (obavezno za YAML), i stalni prikaz pozicije kursora u dnu.

Zamka: prelamanje dugačkih redova

Stariji nano je umeo da dugačak red automatski prelomi na dva — što u konfiguracionom fajlu znači pokvarenu konfiguraciju. Novije verzije to više ne rade podrazumevano, ali ako radiš na starijem sistemu, otvaraj sistemske fajlove ovako:

$ nano -w /etc/fstab

Opcija -w isključuje prelamanje. Neka ti pređe u naviku kod svega u /etc.

vi

vi radi drugačije od svega što si do sada koristio: ima režime. Kad se otvori, slova koja kucaš nisu tekst nego komande. Zato prvo i najvažnije:

Esc  :q!  Enter   — izlaz bez čuvanja izmena
Esc  :wq  Enter   — snimi i izađi

Ako si trenutno zaglavljen — to je rešenje. Ceo minimum, sa objašnjenjem režima i deset komandi koje su dovoljne za rad na bilo kom serveru, ima na stranici vi za preživljavanje.

Napomena o imenima: na većini distribucija vi je zapravo link na vim, a ponegde na okrnjeni vim-tiny. Proveri sa:

$ readlink -f $(which vi)
/usr/bin/vim.basic

Editor se otvorio sam, a ti ga nisi zvao

Neke komande otvaraju editor bez pitanja:

$ crontab -e
$ visudo
$ git commit

Koji će se editor otvoriti, određuje promenljiva EDITOR. Ako nije postavljena, dobijaš vi:

$ echo $EDITOR

$ export EDITOR=nano
$ crontab -e

Za trajno, red export EDITOR=nano ide u ~/.bashrc. Neke komande gledaju i VISUAL, pa je najsigurnije postaviti obe.

Ali imaj na umu: na tuđem serveru tvoj .bashrc ne postoji. Zato ovo nije zamena za poznavanje vi-ja, nego udobnost na sopstvenoj mašini.

Rad sa sistemskim fajlovima

Ovde se prave stvarne štete, pa tri pravila.

1. Napravi kopiju pre izmene

$ sudo cp /etc/ssh/sshd_config{,.bak}
$ sudo nano /etc/ssh/sshd_config

Vitičaste zagrade su prečica iz lekcije Džokeri i navodnici — shell to proširi u dve pune putanje. Ako nešto krene naopako, povratak je jedna komanda.

2. Otvaraj sa sudo od početka

$ nano /etc/hosts

nano će te pustiti da uređuješ i tek pri snimanju javiti da nema dozvole. vi u istoj situaciji kaže:

E45: 'readonly' option is set (add ! to override)

Nije katastrofa — u vi-ju postoji spas (:w !sudo tee % > /dev/null), a u nano-u možeš snimiti u /tmp pa premestiti sa sudo. Ali je jednostavnije od početka kucati:

$ sudo nano /etc/hosts

3. Proveri sintaksu pre nego što restartuješ servis

Ovo je pravilo koje deli one koji su izgubili pristup serveru od onih koji nisu. Skoro svaki servis ima komandu za proveru konfiguracije:

$ sudo sshd -t
$ sudo nginx -t
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo apachectl configtest
$ sudo named-checkconf

Ako sshd -t prijavi grešku, a ti ipak restartuješ SSH — servis se neće podići, a ti si na daljinu. Zato: izmeni, proveri, pa tek onda restartuj. I dok testiraš SSH, drži otvorenu postojeću sesiju kao rezervu.

Za fajlove bez alata za proveru koristi se posebna komanda za tu vrstu sadržaja:

$ python3 -c "import yaml,sys; yaml.safe_load(open('docker-compose.yml'))"
$ jq . podesavanja.json > /dev/null

Poseban slučaj: visudo

Fajl /etc/sudoers se nikada ne otvara direktno. Greška u njemu znači da niko više ne može da koristi sudo — uključujući tebe. Umesto toga:

$ sudo visudo

Ova komanda radi na privremenoj kopiji i proverava sintaksu pre nego što išta snimi:

>>> /etc/sudoers: syntax error near line 22 <<<
What now?

Isto pravilo važi i za crontab: koristi crontab -e, ne uređuj fajlove u /var/spool/cron ručno.

Sitnice koje ume da zabole

Fajl kopiran sa Windowsa

$ ./skripta.sh
bash: ./skripta.sh: /bin/bash^M: bad interpreter: No such file or directory

^M je Windows oznaka za kraj reda. Provera i popravka:

$ file skripta.sh
skripta.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators

$ dos2unix skripta.sh

Ako dos2unix nije instaliran, radi i sed: sed -i 's/\r$//' skripta.sh.

Tabovi umesto razmaka

U YAML fajlovima tab je zabranjen, a izgleda potpuno isto kao razmaci. Kad docker-compose ili Ansible prijave nerazumljivu grešku, prvo proveri:

$ grep -P "\t" docker-compose.yml

Zato set tabstospaces u .nanorc nije kozmetika. Suprotno važi za Makefile, gde tab mora ostati tab.

Poruka o swap fajlu u vi-ju

Found a swap file by the name ".sshd_config.swp"
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Prethodna sesija je prekinuta — pukla veza ili zatvoren terminal. Ako ti izmene ne trebaju, pritisni D i nastavi. Ako trebaju, R, pa snimi, pa obriši .swp fajl. Detaljnije u lekciji vi za preživljavanje.

Editor menja inode

Većina editora ne piše u postojeći fajl, nego pravi novi i preimenuje ga preko starog. Posledica: hard linkovi ka tom fajlu pucaju, a proces koji fajl drži otvorenim nastavlja da čita staru verziju. Objašnjenje je u lekciji Inode-ovi i linkovi.

Kad editor uopšte nije potreban

Za sitnu izmenu je često brže bez otvaranja fajla:

$ echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts > /dev/null
$ sudo sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config

Prvi red dopisuje, drugi menja u mestu. Ovo je i jedini način da se fajl izmeni iz skripte, gde nema nikoga da kuca. Obe tehnike su objašnjene na stranicama Piping i redirekcija i sed.

A za samo gledanje sadržaja editor ti ne treba uopšte — tu su cat i less. Otvaranje fajla u editoru „da vidim šta piše" je najlakši način da slučajno pritisneš neki taster i snimiš izmenu koju nisi hteo.

Kratka referenca

nano

  • Ctrl+O — snimi · Ctrl+X — izlaz
  • Ctrl+W — traži · Ctrl+\ — zameni
  • Ctrl+K / Ctrl+U — iseci / nalepi red
  • Alt+U — poništi
  • nano -lw fajl — brojevi redova, bez prelamanja

vi

  • Esc — komandni režim · i — unos teksta
  • :w — snimi · :q! — izlaz bez čuvanja · :wq — snimi i izađi

Opšte

  • export EDITOR=nano — koji editor otvaraju druge komande
  • sudo cp fajl{,.bak} — kopija pre izmene
  • sudo visudo — jedini ispravan način za sudoers
  • sshd -t, nginx -t — provera pre restarta
  • dos2unix fajl — uklanjanje Windows krajeva reda

Vežba

Radi na kopiji, ne na pravom fajlu:

$ cp /etc/ssh/sshd_config ~/vezba.conf
  1. Otvori ~/vezba.conf u nano-u sa brojevima redova, pronađi red koji sadrži Port i izmeni ga.
  2. Snimi i izađi, pa proveri izmenu sa diff u odnosu na original.
  3. Otvori isti fajl u vi-ju i izađi bez čuvanja izmena.
  4. Postavi EDITOR na nano i pokreni crontab -e da vidiš da li se otvorio pravi editor. Izađi bez čuvanja.
  5. Istu izmenu iz prvog zadatka napravi bez editora, komandom sed.

Peti zadatak je onaj koji ćeš zapravo koristiti u skriptama.


Ako te zanima samo kako da izađeš iz vi-ja i preživiš rad na serveru, sve je na stranici vi za preživljavanje.

Cela lekcija je deo vodiča Linux osnove.

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd