20 Linux parancsok minden rendszergazdának tudnia kell

egy új eszközökkel és változatos fejlesztői környezetekkel teli világban gyakorlatilag minden fejlesztőnek vagy mérnöknek meg kell tanulnia néhány alapvető rendszergazdai parancsot. A speciális parancsok és csomagok segíthetnek a fejlesztőknek az alkalmazások rendszerezésében, hibaelhárításában és optimalizálásában, és—ha a dolgok rosszul fordulnak elő—értékes osztályozási információkat szolgáltathatnak az operátoroknak és a rendszergazdáknak.

akár új fejlesztő vagy, akár saját alkalmazást szeretne kezelni, a következő 20 alapvető rendszergazdai parancs segíthet jobban megérteni az alkalmazásokat. Segíthetnek a rendszergazdák problémáinak leírásában is annak hibaelhárításában, hogy egy alkalmazás miért működik helyileg, de nem egy távoli gépen. Ezek a parancsok Linux fejlesztői környezetekre, konténerekre, virtuális gépekre (VM) és csupasz fémre vonatkoznak.

curl

curl átvisz egy URL-t. Ezzel a paranccsal tesztelheti egy alkalmazás végpontját vagy kapcsolódását egy upstream szolgáltatás végpontjához. a curl hasznos lehet annak meghatározásához, hogy az alkalmazás elérhet-e egy másik szolgáltatást, például egy adatbázist, vagy ellenőrizheti, hogy a szolgáltatás egészséges-e.

például képzelje el, hogy az alkalmazás HTTP 500 hibát dob, jelezve, hogy nem éri el a MongoDB adatbázist:

$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR

az -I opció megjeleníti a fejléc adatait, az-s opció pedig elnémítja a válasz törzsét. Az adatbázis végpontjának ellenőrzése a helyi asztalról:

$ curl -I -s database:27017
HTTP/1.0 200 OK

tehát mi lehet a probléma? Ellenőrizze, hogy az alkalmazás az adatbázison kívül más helyekre is eljuthat-e az alkalmazás gazdagépéről:

$ curl -I -s https://opensource.com
HTTP/1.1 200 OK

úgy tűnik, hogy rendben van. Most próbálja meg elérni az adatbázist az alkalmazás gazdagépéről. Az alkalmazás az adatbázis gazdagépnevét használja, ezért először próbálja meg:

$ curl database:27017
curl: (6) Couldn't resolve host 'database'

ez azt jelzi, hogy az alkalmazás nem tudja megoldani az adatbázist, mert az adatbázis URL-címe nem érhető el, vagy a gazdagép (tároló vagy virtuális gép) nem rendelkezik névkiszolgálóval, amelyet a gazdagépnév feloldására használhat.

python-m json.tool / jq

a curl kiadása után az API-hívás kimenete nehezen olvasható. Néha, azt szeretné, hogy pretty-print a JSON kimenet találni egy adott bejegyzést. A Python rendelkezik egy beépített JSON könyvtárral, amely segíthet ebben. Python-m json-t használ.eszköz a JSON behúzásához és rendezéséhez. A Python JSON moduljának használatához pipálja a JSON fájl kimenetét a python-m json-ba.szerszám parancs.

$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":}

a Python könyvtár használatához pipálja a kimenetet a Pythonba a-m (module) opcióval.

$ cat test.json | python -m json.tool
{
"properties": {
"age": {
"description": "Age in years",
"minimum": 0,
"type": "integer"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
},
"required": ,
"title": "Person",
"type": "object"
}

a fejlettebb JSON elemzéshez telepítheti a jq-t. a jq biztosít néhány lehetőséget, amelyek bizonyos értékeket vonnak ki a JSON bemenetből. A fenti Python modulhoz hasonló szép nyomtatáshoz egyszerűen alkalmazza a JQ-t a kimenetre.

$ cat test.json | jq
{
"title": "Person",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required":
}

ls

ls fájlokat sorol fel egy könyvtárban. A rendszergazdák és a fejlesztők gyakran adják ki ezt a parancsot. A tárolóterületen ez a parancs segíthet meghatározni a tárolókép könyvtárát és fájljait. Emellett keresi fel a fájlokat, ls segít megvizsgálni a jogosultságokat. Az alábbi példában nem futtathatja a myapp alkalmazást engedélyekkel kapcsolatos probléma miatt. Amikor az ls-l használatával ellenőrzi az engedélyeket, rájön, hogy az engedélyeknek nincs “x”- je az-rw-r–r– – ben, amelyek csak olvashatók és írhatók.

$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp

tail

tail a fájl utolsó részének megjelenítése. A hibaelhárításhoz általában nincs szükség minden naplósorra. Ehelyett azt szeretné ellenőrizni, hogy a naplók mit mondanak az alkalmazáshoz intézett legutóbbi kérésről. Például a tail segítségével ellenőrizheti, hogy mi történik a naplókban, amikor kérést küld az Apache HTTP szervernek.

example_tail.png

 használja a tail-f-et az Apache HTTP szerver naplóinak követéséhez, és nézze meg a kéréseket, ahogy azok történnek.

használja a tail-f-et az Apache HTTP naplók követéséhez, és nézze meg a kéréseket, ahogy azok megtörténnek.

a -f opció a “follow” opciót jelzi, amely a naplóvonalakat a fájlba írva adja ki. A példának van egy háttérszkriptje, amely néhány másodpercenként hozzáfér a végponthoz, és a napló rögzíti a kérést. Ahelyett, hogy valós időben követné a naplót, a tail segítségével is megtekintheti a fájl utolsó 100 sorát a-n opcióval.

$ tail -n 100 /var/log/httpd/access_log

cat

cat összefűzi és kinyomtatja a fájlokat. Lehet kiadni cat, hogy ellenőrizze a tartalmát a függőségek fájlt, vagy erősítse meg a verzió az alkalmazás, hogy már épített helyben.

$ cat requirements.txt
flask
flask_pymongo

a fenti példa ellenőrzi, hogy a Python lombik alkalmazás lombik szerepel a függőség.

grep

a grep fájlmintákat keres. Ha egy adott mintát keres egy másik parancs kimenetében, a grep kiemeli a megfelelő sorokat. Használja ezt a parancsot naplófájlok, meghatározott folyamatok stb. Ha meg akarja nézni, hogy az Apache Tomcat elindul-e, akkor eláraszthatja a Sorok száma. A kimenetet a grep parancsba vezetve elkülöníti a kiszolgáló indítását jelző sorokat.

$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start
01-Jul-2017 18:03:47.542 INFO org.apache.catalina.startup.Catalina.start Server startup in 681 ms

ps

a procps-ng csomag része, amely hasznos parancsokat tartalmaz a folyamatazonosítók vizsgálatához, megmutatja a futó folyamat állapotát. Ezzel a paranccsal meghatározhatja a futó alkalmazást, vagy megerősítheti a várt folyamatot. Például, ha futó Tomcat webkiszolgálót szeretne ellenőrizni, akkor a PS-t használja annak lehetőségeivel a Tomcat folyamatazonosítójának megszerzéséhez.

$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 2 18:55 ? 00:00:02 /docker-java-home/jre/bi
root 59 0 0 18:55 pts/0 00:00:00 /bin/sh
root 75 59 0 18:57 pts/0 00:00:00 ps -ef

a még nagyobb olvashatóság érdekében használja a ps-t és pipálja a grep-be.

$ ps -ef | grep tomcat
root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi

env

env lehetővé teszi a környezeti változók beállítását vagy kinyomtatását. A hibaelhárítás során hasznos lehet annak ellenőrzése, hogy a rossz környezeti változó megakadályozza-e az alkalmazás indítását. Az alábbi példában ez a parancs az alkalmazás gazdagépén beállított környezeti változók ellenőrzésére szolgál.

$ env
PYTHON_PIP_VERSION=9.0.1
HOME=/root
DB_NAME=test
PATH=/usr/local/bin:/usr/local/sbin
LANG=C.UTF-8
PYTHON_VERSION=3.4.6
PWD=/
DB_URI=mongodb://database:27017/test

figyeljük meg, hogy az alkalmazás Python-t használ, és környezeti változókkal rendelkezik a MongoDB adatbázishoz való csatlakozáshoz.

top

top megjeleníti és frissíti a rendezett folyamatinformációkat. Ezzel a felügyeleti eszközzel meghatározhatja, hogy mely folyamatok futnak, és mennyi memóriát és CPU-t fogyasztanak. Gyakori eset akkor fordul elő, amikor egy alkalmazást futtat, és egy perccel később meghal. Először ellenőrizze az alkalmazás visszatérési hibáját, amely memóriahiba.

$ tail myapp.log
Traceback (most recent call last):
MemoryError

az alkalmazás valóban ki a memória? A megerősítéshez használja a top-ot annak meghatározásához, hogy az alkalmazás mennyi CPU-t és memóriát fogyaszt. A top kiadásakor észrevesz egy Python alkalmazást, amely a CPU nagy részét használja, a memóriahasználat növekedésével, és gyanítja, hogy ez az alkalmazás. Amíg fut, akkor nyomja meg a” C ” gombot, hogy a teljes parancsot, és visszafejteni, ha a folyamat az alkalmazás. Kiderül, hogy a memória-intenzív alkalmazás (memeater.py). ha az alkalmazás elfogy a memória, a rendszer megöli azt egy out-of-memory (OOM) hiba.

example_top.png

 Top kiadása egy olyan alkalmazás ellen, amely az összes memóriáját elfogyasztja.

a memória és a CPU használat az alkalmazás növekszik, végül, hogy OOM-megölte.

example_topwithc.png

 a C gomb megnyomása a felső futtatás közben a teljes parancsot mutatja

a “C” gomb megnyomásával láthatja a teljes parancsot, amely elindította az alkalmazást.

a saját alkalmazás ellenőrzése mellett a top segítségével más processzorokat vagy memóriát használó folyamatokat is hibakereshet.

netstat

a netstat a hálózat állapotát mutatja. Ez a parancs megmutatja a használt hálózati portokat és a bejövő kapcsolatokat. A netstat azonban nem jön ki a dobozból Linuxon. Ha telepítenie kell, megtalálhatja a net-tools csomagban. Fejlesztőként, aki helyileg kísérletezik, vagy egy alkalmazást egy gazdagépre tol, hibaüzenetet kaphat arról, hogy egy port már lefoglalt, vagy egy cím már használatban van. A netstat protokoll, process és port opciókkal történő használata azt mutatja, hogy az Apache HTTP server már használja a 80-as portot az alábbi gazdagépen.

example_netstat.png

 a netstat ellenőrzi, hogy az Apache porton fut-e 80

a netstat-tulpn használata azt mutatja, hogy az Apache már használja a 80-as portot ezen a gépen.

ip

ha az ip-cím nem működik a gazdagépen, akkor azt az iproute2 csomaggal kell telepíteni. Az alparancsok címe (vagy röviden csak az ip a) az alkalmazás gazdagépének interfészeit és IP-címeit mutatja. Az ip-címet használja a tároló vagy a gazdagép IP-címének ellenőrzésére. Ha például a tárolót két hálózathoz csatlakoztatja, az ip-cím megmutatja, hogy melyik interfész melyik hálózathoz csatlakozik. Egy egyszerű ellenőrzéshez mindig használhatja az ip-cím parancsot a gazdagép IP-címének megszerzéséhez. Az alábbi példa azt mutatja, hogy a webszintű tároló IP-címe 172.17.0.2 az eth0 interfészen.

$ ip address show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d4:3b:04:9e:b2:c2 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.3/27 brd 10.1.1.31 scope global dynamic noprefixroute eth0
valid_lft 52072sec preferred_lft 52072sec

lsof

az lsof felsorolja az alkalmazáshoz társított megnyitott fájlokat. Néhány Linux gépképen telepítenie kell az lsof-ot az lsof csomaggal. A Linuxban a rendszerrel való szinte bármilyen interakciót fájlként kezelik. Ennek eredményeként, ha az alkalmazás fájlba ír, vagy hálózati kapcsolatot nyit meg, az lsof ezt az interakciót fájlként tükrözi. A netstat-hoz hasonlóan az lsof segítségével ellenőrizheti a hallgatási portokat. Például, ha ellenőrizni szeretné, hogy a 80-as port használatban van-e, akkor az lsof segítségével ellenőrizheti, hogy melyik folyamat használja. Az alábbiakban láthatja, hogy a httpd (Apache) a 80-as porton hallgat. Az lsof segítségével ellenőrizheti a httpd folyamatazonosítóját is, megvizsgálva, hogy hol található a webszerver bináris fájlja (/usr/sbin/httpd).

example_lsof.png

 az lsof feltárja a folyamatinformációk eredetét

az Lsof azt mutatja, hogy a httpd a 80-as porton figyel. A httpd folyamatazonosítójának vizsgálata megmutatja a httpd futtatásához szükséges összes fájlt is.

a megnyitott fájl neve a megnyitott fájlok listájában segít meghatározni a folyamat eredetét, különösen az Apache-t.

df

a df (display free disk space, szabad lemezterület megjelenítése) használatával elháríthatja a lemezterülettel kapcsolatos problémákat. Amikor egy tárolószerelőn futtatja az alkalmazást, hibaüzenet jelenhet meg, amely azt jelzi, hogy nincs szabad hely a tárolóállomáson. Míg a lemezterületet egy rendszergazdának kell kezelnie és optimalizálnia, a df segítségével kitalálhatja a meglévő helyet a könyvtárban, és ellenőrizheti, hogy valóban nincs-e hely.

$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.7G 0 7.7G 0% /dev
/dev/mapper/RHEL-Root 50G 16G 35G 31% /
/dev/nvme0n1p2 3.0G 246M 2.8G 9% /boot
/dev/mapper/RHEL-Home 100G 88G 13G 88% /home
/dev/nvme0n1p1 200M 9.4M 191M 5% /boot/efi
/dev/sdb1 114G 55G 54G 51% /run/media/tux/red

a-h opció ember által olvasható formátumban nyomtatja ki az információkat. Alapértelmezés szerint, mint a példában, a df mindent tartalmaz a gyökérkönyvtárban, de korlátozhatja az eredményeket is, ha a parancs részeként könyvtárat biztosít (például df-h /home).

du

ha részletesebb információt szeretne letölteni arról, hogy mely fájlok használják a könyvtárban lévő lemezterületet, használhatja a du parancsot. Ha meg szeretné tudni, hogy melyik napló foglalja el a legtöbb helyet a /var/log könyvtárban, például használhatja a du-t a-h (ember által olvasható) opcióval és a-s opcióval a teljes mérethez.

$ du -sh /var/log/*
1.8M /var/log/anaconda
384K /var/log/audit
4.0K /var/log/boot.log
0 /var/log/chrony
4.0K /var/log/cron
4.0K /var/log/maillog
64K /var/log/messages

a fenti példa a /var/log könyvtár legnagyobb könyvtárát mutatja be /var/log/audit. Használhatja du együtt df meghatározni, hogy mi hasznosítja a lemezterület az alkalmazás host.

id

az alkalmazást futtató felhasználó ellenőrzéséhez használja az id parancsot a felhasználói identitás visszaadásához. Az alábbi példa a Vagrant-ot használja az alkalmazás tesztelésére és a fejlesztői környezet elkülönítésére. Miután bejelentkezett a Vagrant mezőbe, ha megpróbálja telepíteni az Apache HTTP szervert (függőség), a rendszer kijelenti, hogy nem tudja végrehajtani a parancsot rootként. A felhasználó és a csoport ellenőrzéséhez adja ki az id parancsot, és vegye észre, hogy a “vagrant” csoportban “vagrant” felhasználóként fut.

$ dnf -y install httpd
Loaded plugins: fastestmirror
You need to be root to perform this command.
$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

ennek kijavításához a parancsot superuserként kell futtatnia, amely emelt szintű jogosultságokat biztosít.

chmod

amikor először futtatja az alkalmazás binárisát a gazdagépen, az “engedély megtagadva” hibaüzenet jelenhet meg.”Amint az az ls példáján látható, ellenőrizheti az alkalmazás bináris engedélyeit.

$ ls -l
total 4
-rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

ez azt mutatja, hogy nincs végrehajtási joga (nincs “x”) a bináris futtatásához. a chmod kijavíthatja az engedélyeket, hogy lehetővé tegye a felhasználó számára a bináris futtatását.

$ chmod +x test.sh
$ ls -l
total 4
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

amint azt a példa mutatja, ez frissíti az engedélyeket végrehajtási jogokkal. Most, amikor megpróbálja végrehajtani a bináris fájlt, az alkalmazás nem dob engedélyt megtagadva hibát. A Chmod hasznos lehet, ha egy bináris fájlt is betölt egy tárolóba. Ez biztosítja, hogy a tároló rendelkezik a megfelelő engedélyekkel, hogy végre a bináris.

dig / nslookup

a domain name server (DNS) segít megoldani egy URL-t egy alkalmazáskiszolgálóhoz. Előfordulhat azonban, hogy egy URL nem oldódik meg, ami kapcsolódási problémát okoz az alkalmazás számára. Tegyük fel például, hogy megpróbálja elérni az adatbázist a mydatabase URL-en az alkalmazás gazdagépéről. Ehelyett “nem lehet megoldani” hibát kap. A hibaelhárításhoz próbálja meg használni a dig (DNS lookup utility) vagy az nslookup (query Internet name servers) alkalmazást annak kiderítésére, hogy az alkalmazás miért nem tudja megoldani az adatbázist.

$ nslookup mydatabase
Server: 10.0.2.3
Address: 10.0.2.3#53
** server can't find mydatabase: NXDOMAIN

az nslookup használata azt mutatja, hogy a mydatabase nem oldható meg. Ha megpróbálja megoldani a dig-et, ugyanazt az eredményt hozza.

$ dig mydatabase
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> mydatabase
;; global options: +cmd
;; connection timed out; no servers could be reached

ezeket a hibákat számos különböző probléma okozhatja. Ha nem tudja hibakeresni a kiváltó okot, forduljon a rendszergazdához további vizsgálat céljából. Helyi tesztelés esetén ez a probléma azt jelezheti, hogy a gazdagép névszerverei nincsenek megfelelően konfigurálva. Ezen parancsok használatához telepítenie kell a BIND Utilities csomagot.

firewall-cmd

hagyományosan a tűzfalakat Linuxon konfigurálták az iptables paranccsal, és bár megtartja mindenütt jelenlétét, valójában nagyrészt nftables váltotta fel. Az nftables barátságos kezelőfelülete, amely alapértelmezés szerint sok disztribúcióval rendelkezik, a firewall-cmd. Ez a parancs segít beállítani azokat a szabályokat, amelyek szabályozzák, hogy a számítógép milyen hálózati forgalmat engedélyez, mind a kimenő, mind a bejövő forgalmat. Ezek a szabályok zónákba csoportosíthatók, így gyorsan és egyszerűen mozoghat az egyik szabálykészletről a másikra, az Ön igényeitől függően.

a parancs szintaxisa egyszerű. Használja a parancsot és néhány opciót, amelyek mindegyike olyan módon van megnevezve, hogy szinte egy ember által olvasható mondatot készítsen. Például, hogy megnézze, melyik zónában tartózkodik jelenleg:

$ sudo firewall-cmd --get-active-zones``
corp
interfaces: ens0
dmz
interfaces: ens1

ebben a példában a számítógép két hálózati eszközzel rendelkezik, az egyik a corp zónához, a másik pedig a dmz zónához van hozzárendelve.

az egyes zónák engedélyezésének megtekintéséhez használja a --list-all opciót:

$ sudo firewall-cmd --zone corp --list-all
corp
target: default
interfaces: ens0
services: cockpit dhcpv6-client ssh
ports:
protocols:

a Szolgáltatások hozzáadása ugyanolyan egyszerű:

$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload

Interacting with firewall-cmd úgy tervezték, hogy intuitív, és van egy kiterjedt gyűjteménye predifined szolgáltatások, valamint a képesség, hogy írjon nft szabályok közvetlenül. Miután elkezdte használni a firewall-cmd-t, letöltheti a firewall-cmd csalólapunkat, hogy emlékezzen a legfontosabb lehetőségekre.

sestatus

a selinuxot (egy Linux biztonsági modult) általában egy vállalkozás által kezelt alkalmazás-gazdagépen kell végrehajtani. A SELinux a legkevésbé jogosult hozzáférést biztosít a gazdagépen futó folyamatokhoz, megakadályozva a potenciálisan rosszindulatú folyamatok hozzáférését a rendszer fontos fájljaihoz. Bizonyos helyzetekben az alkalmazásnak hozzá kell férnie egy adott fájlhoz, de hibát okozhat. Annak ellenőrzéséhez, hogy a SELinux blokkolja-e az alkalmazást, a tail és a grep segítségével keresse meg a “denied” üzenetet a /var/log/audit naplózásban. Ellenkező esetben ellenőrizheti, hogy a mezőben engedélyezve van-e a SELinux a sestatus használatával.

$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28

a fenti kimenet azt jelzi, hogy az alkalmazás gazdagépén engedélyezve van a SELinux. A helyi fejlesztési környezetben frissítheti a Selinuxot, hogy megengedőbb legyen. Ha segítségre van szüksége egy távoli gazdagéppel kapcsolatban, a rendszergazda segíthet meghatározni azt a bevált gyakorlatot, amellyel az alkalmazás hozzáférhet a szükséges fájlhoz. Ha gyakran lép kapcsolatba a Selinuxszal, töltse le a SELinux csalólapunkat a gyors tájékozódás érdekében.

előzmények

ha olyan sok parancsot ad ki tesztelésre és hibakeresésre, elfelejtheti a hasznosakat! Minden héjnak van egy változata a történelem parancsnak. Megmutatja a munkamenet kezdete óta kiadott parancsok előzményeit. Az előzmények segítségével naplózhatja, hogy mely parancsokat használta az alkalmazás hibaelhárításához. Például, amikor a cikk során előzményeket ad ki, megmutatja a különféle parancsokat, amelyekkel kísérletezett és megtanult.

$ history
1 clear
2 df -h
3 du

mi a teendő, ha a korábbi előzményekben egy parancsot szeretne végrehajtani, de nem akarja újra begépelni? Használja ! mielőtt a parancs számát újra végrehajtani.

example_history.png

 parancs végrehajtása az előzményekben

Hozzáadás ! a végrehajtani kívánt parancsszám előtt ismét kiadja a parancsot.

az alapvető parancsok javíthatják a hibaelhárítási szakértelmet annak meghatározásakor, hogy az alkalmazás miért működik az egyik fejlesztési környezetben, de talán nem a másikban. Sok rendszergazda kihasználja ezeket a parancsokat a rendszerekkel kapcsolatos problémák hibakeresésére. Ezen hasznos hibaelhárítási parancsok némelyikének megértése segíthet a rendszergazdákkal való kommunikációban és az alkalmazással kapcsolatos problémák megoldásában.

ez a cikk eredetileg 2017 júliusában jelent meg, és a szerkesztő frissítette.



+