105.1 Lecke 1
Tanúsítvány: |
LPIC-1 |
---|---|
Verzió: |
5.0 |
Témakör: |
105 Shellek és shell scriptelés |
Fejezet: |
105.1 A shell testre szabása és használata |
Lecke: |
1/3 |
Bevezetés
A shell vitathatatlanul a legerősebb eszköz a Linux rendszerben és úgy definiálható, mint a felhasználó és az operációs rendszer magja közötti interfész. A felhasználó által beírt parancsokat értelmezi, ezért minden rendszergazdának jártasnak kell lennie a shell használatában. Amint azt mostanra már bizonyára tudjuk, a Bourne Again Shell (Bash) a Linux disztribúciók túlnyomó többségének de facto shellje.
Az első dolog, amit a Bash — vagy bármely más parancsértelmező — indítás után csinál, az egy sor startup script végrehajtása. Ezek a scriptek testre szabják a munkamenet környezetét. Vannak rendszerszintű és felhasználó-specifikus scriptek is. Ezekben a scriptekben a személyes preferenciáinkat vagy a felhasználók igényeinek leginkább megfelelő beállításokat helyezhetjük el változók, aliasok és függvények formájában.
Az indítófájlok pontos sorozata egy nagyon fontos paramétertől függ: a shell típusától. Nézzük meg, hogy milyen sokféle shell létezik!
Shell-típusok: Interaktív vs. Non-Interaktív és Login vs. Non-Login
Először is tisztázzuk az interaktív és a login (bejelentkezés) fogalmát a shellek kontextusában:
- Interaktív / non-interaktív shellek
-
Ez a fajta shell a felhasználó és a shell között zajló interakcióra utal: A felhasználó a terminálba a billentyűzet segítségével parancsokat ír be, a shell pedig a képernyőre kiírt üzenetekkel ad kimenetet.
- Login / non-login shellek
-
Ez a fajta shell arra az esetre utal, amikor egy felhasználó belép egy számítógépes rendszerbe, megadva a hitelesítő adatokat, például a felhasználónevet és a jelszót.
Mind az interaktív és non-interaktív shellek lehetnek login vagy non-login shellek és e típusok minden lehetséges kombinációjának megvan a saját felhasználási módja.
Az interaktív login shellek akkor kerülnek végrehajtásra, amikor a felhasználók bejelentkeznek a rendszerbe, és arra szolgálnak, hogy a felhasználók konfigurációit az igényeiknek megfelelően alakítsák. Jó példa az ilyen típusú shellre az azonos osztályhoz tartozó felhasználók egy csoportja, akiknek egy adott változó beállítására van szükségük a munkameneteikben.
Az interaktív, non-login shellek alatt minden más shellt értünk, amelyet a felhasználó a rendszerbe való bejelentkezés után megnyit. A felhasználók ezeket a shelleket a munkamenetek során karbantartási és adminisztrációs feladatok elvégzésére használják, mint például változók vagy az idő beállítása, fájlok másolása, scriptek írása stb.
Másrészt a non-interaktív shellek nem igényelnek semmiféle emberi beavatkozást. Így ezek a shellek nem kérnek a felhasználótól bemenetet, és a kimenetük — ha van — a legtöbb esetben egy logba íródik.
A non-interaktív login shellek meglehetősen ritkák és nem is praktikusak. Felhasználásuk gyakorlatilag nincs példa, és csak a shell viselkedésébe való betekintés kedvéért fogunk róluk nyilatkozni. Néhány furcsa példa: egy script futtatásának kikényszerítése a bejelentkezési shellből a /bin/bash --login <some_script>
paranccsal, vagy egy parancs standard kimenetének (stdout) átvezetése egy ssh kapcsolat standard bemenetére (stdin):
<some_command> | ssh <some_user>@<some_server>
A non-interaktív, non-login shell esetében nincs sem interakció, sem bejelentkezés a felhasználó részéről, tehát itt az automatizált scriptek használatáról van szó. Ezeket a scripteket többnyire ismétlődő adminisztrációs és karbantartási feladatok elvégzésére használják, mint például a cronjobokban lévők. Ilyen esetekben a bash
nem olvas be semmilyen indítófájlt.
Egy terminál megnyitása
Amikor asztali környezetben vagyunk, megnyithatunk egy terminálalkalmazást, vagy átválthatunk valamelyik rendszerkonzolra. Ezért egy új shell vagy pts
shell, ha a GUI-ban egy terminál emulátorból nyitjuk meg, vagy tty
shell, ha egy rendszerkonzolról futtatjuk. Az első esetben nem terminállal, hanem terminálemulátorral van dolgunk. A grafikus munkamenetek részeként az olyan terminálemulátorok, mint a gnome-terminal vagy a konsole, nagyon gazdag funkciójúak és felhasználóbarátok a szöveges felhasználói felületű terminálokhoz képest. A kevésbé gazdag funkciójú terminál emulátorok közé tartozik — többek között — az XTerm és a sakura.
A Ctrl+Alt+F1-F6 kombinációkkal a konzolos bejelentkezésekhez léphetünk, amelyek egy interaktív szöveges login shellt nyitnak meg. Ctrl+Alt+F7 visszaváltja a munkamenetet a Desktopra.
Note
|
A |
Shellek indítása a bash
használatával
Bejelentkezés után írjuk be a terminálba a bash
parancsot, hogy megnyissunk egy új parancsértelmezőt. Gyakorlatilag ez a shell az aktuális shell gyermekprocessze.
A bash
gyermekprocessz indításakor különböző kapcsolókkal határozhatjuk meg, hogy milyen shellt akarunk indítani. Íme néhány fontos bash
invokáló/indítási opció:
bash -l
orbash --login
-
Egy login shellt invokál.
bash -i
-
Egy interaktív shellt invokál.
bash --noprofile
-
A login shellekkel figyelmen kívül hagyja mind a rendszerszintű
/etc/profile
startup fájlt, mind a felhasználói szintű~/.bash_profile
,~/.bash_login
és~/.profile
startup fájlokat. bash --norc
-
Az interaktív shellekkel figyelmen kívül hagyja mind a rendszerszintű
/etc/bash.bashrc
startup fájlt, mind a felhasználói szintű~/.bashrc
startup fájlt. bash --rcfile <file>
-
Az interaktív shellekkel a
<file>
-t veszi startup fájlnak, figyelmen kívül hagyva a rendszerszintű/etc/bash.bashrc
-t és a felhasználói szintű~/.bashrc
-t.
Az alábbiakban a különböző startup fájlokat tárgyaljuk.
Shellek indítása a su
és sudo
segítségével
E két hasonló program használatával különleges shell-típusokat kaphatunk:
su
-
Felhasználói azonosító módosítása vagy szuperfelhasználóvá válás (
root
). Ezzel a paranccsal mind a login, mind a non-login shelleket meg tudjuk hívni:-
A
su - user2
,su -l user2
vagysu --login user2
egy interaktív login shellt indít eluser2
-ként. -
A
su user2
egy interaktív, non-loign shellt indít eluser2
-ként. -
su - root
vagysu -
egy interaktív login shellt indít elroot
-ként. -
su root
vagysu
egy interaktív, non-login shellt indít elroot
-ként.
-
sudo
- Hajtsuk végre a parancsokat más felhasználóként (beleértve a szuperfelhasználót is). Mivel ezt a parancsot elsősorban a root jogosultságok ideiglenes megszerzésére használjuk, a parancsot használó felhasználónak szerepelnie kell a
sudoers
fájlban. Ahhoz, hogy felhasználókat adjunk hozzá asudoers
állományhoz,root
-nak kell lennünk, majd futtatnunk kell a következőt -
root@debian:~# usermod -aG sudo user2
A
su
-hoz hasonlóan asudo
is lehetővé teszi, hogy login és non-login shelleket egyaránt használjunk:-
A
sudo su - user2
,sudo su -l user2
vagysudo su --login user2
egy interaktív login shellt indít eluser2
-ként. -
A
sudo su user2
egy interaktív, non-login shellt indít eluser2
-ként. -
A
sudo -u user2 -s
egy interaktív, non-login shellt indít eluser2
-ként. -
A
sudo su - root
vagysudo su -
egy interaktív login shellt indít elroot
-ként. -
A
sudo -i
egy interaktív logint shellt indít elroot
-ként. -
sudo -i <some_command>
interaktív login shellt indítroot
-ként, lefuttatja a parancsot, és visszatér az eredeti felhasználóhoz. -
A
sudo su root
vagysudo su
egy interaktív, non-login shellt indít elroot
-ként. -
A
sudo -s
vagy asudo -u root -s
egy non-login shellt indít elroot
-ként.
-
A su
vagy a sudo
használatakor fontos figyelembe venni az új shell indításának sajátos forgatókönyvét: szükségünk van-e a célfelhasználó környezetére vagy sem? Ha igen, akkor azokat a kapcsolókat használjuk, amelyek a login shelleket hívják meg; ha nem, akkor azokat, amelyek a non-login shelleket hívják meg.
Milyen shell típusaink vannak?
Ahhoz, hogy megtudjuk, milyen típusú shellel dolgozunk, beírhatjuk a echo $0
parancsot a terminálba, és a következő kimenetet kapjuk:
- Interaktív login
-
-bash
vagy-su
- Interaktív non-login
-
bash
vagy/bin/bash
- Non-interaktív non-login (scriptek)
-
<name_of_script>
Hány shellünk van?
Ha meg akarjuk nézni, hogy hány bash
shell fut a rendszeren, használhatjuk a ps aux | grep bash
parancsot:
user2@debian:~$ ps aux | grep bash user2 5270 0.1 0.1 25532 5664 pts/0 Ss 23:03 0:00 bash user2 5411 0.3 0.1 25608 5268 tty1 S+ 23:03 0:00 -bash user2 5452 0.0 0.0 16760 940 pts/0 S+ 23:04 0:00 grep --color=auto bash
A user2
a debian
-nál bejelentkezett egy GUI (vagy X Window System) munkamenetbe és megnyitotta a gnome-terminalt, majd megnyomta a Ctrl+Alt+F1 billentyűt, hogy egy tty
terminál munkamenetbe lépjen. Végül a Ctrl+Alt+F7 billentyűkombinációval visszalépett a GUI munkamenetbe és beírta a ps aux | grep bash
parancsot. Így a kimenet egy interaktív, non-login shellt mutat a terminálemulátoron keresztül (pts/0
) és egy interaktív login shellt a megfelelő szöveges terminálon keresztül (tty1
). Figyeljük meg azt is, hogy az egyes sorok utolsó mezője (a parancs) az előbbinél bash
, az utóbbinál pedig -bash
!
Honnan kapják a shellek a konfigurációjukat: a startup fájlok
Most, hogy már ismerjük a Linux rendszerben megtalálható shelltípusokat, itt az ideje, hogy megnézzük, milyen startup fájlokat milyen shell hajt végre! Vegyük figyelembe, hogy a rendszerszintű vagy globális scriptek a /etc/
mappában találhatók, míg a helyi vagy felhasználói szintűek a felhasználó home (~
) mappájában! Továbbá, ha egynél több fájlt kell keresni, ha az egyiket megtaláltuk és lefuttattuk, a többit figyelmen kívül hagyjuk. Fedezzük fel és tanulmányozzuk ezeket a fájlokat a kedvenc szövegszerkesztőnkkel vagy a less <startup_file>
beírásával!
Note
|
A startup fájlok Bash-specifikus (csak a |
Interaktív login shell
Globális szint (Global Level)
/etc/profile
-
Ez az egész rendszerre kiterjedő
.profile
fájl a Bourne shell és a Bourne kompatibilis shellek (beleértve abash
-t is) számára. Ez a fájl egy sorif
utasításon keresztül számos változót állít be, mint például aPATH
ésPS1
, valamint — ha létezik — az/etc/bash.bashrc
és az/etc/profile.d
mappában lévő változókat. /etc/profile.d/*
-
Ez a mappa olyan scripteket tartalmazhat, amelyeket az
/etc/profile
hajt végre.
Lokális szint (Local Level)
~/.bash_profile
-
Ez a Bash-specifikus fájl a felhasználói környezet konfigurálására szolgál. A
~/.bash_login
és a~/.profile
forrásaként is használható. ~/.bash_login
-
Szintén Bash-specifikus, ez a fájl csak akkor lesz végrehajtva, ha nincs
~/.bash_profile
fájl. A neve arra utal, hogy a bejelentkezéskor szükséges parancsok futtatására kell használni. ~/.profile
-
Ez a fájl nem Bash-specifikus, és csak akkor lesz forrás, ha sem a
~/.bash_profile
, sem a~/.bash_login
nem létezik — ami általában így van. Így a~/.profile
fő célja az, hogy ellenőrizze, hogy egy Bash shell fut-e, és — ha igen — a~/.bashrc
-t is forrásként használja, ha létezik. Általában úgy állítja be aPATH
változót, hogy az tartalmazza a felhasználó privát~/bin
mappáját, ha az létezik. ~/.bash_logout
-
Ha létezik, ez a Bash-specifikus fájl a shell kilépésekor néhány takarítási műveletet végez. Ez például távoli munkamenetek esetén lehet kényelmes.
Interaktív login shell konfigurációs fájlok vizsgálata
Hadd mutassunk meg néhány ilyen fájlt működés közben a /etc/profile
és a /home/user2/.profile
módosításával. Mindegyikhez csatolunk egy-egy sort, amely emlékeztet minket a végrehajtott fájlra:
root@debian:~# echo 'echo Hello from /etc/profile' >> /etc/profile root@debian:~# echo 'echo Hello from ~/.profile' >> ~/.profile
Note
|
A két átirányítási operátor |
Így a megfelelő echo
parancsok kimenetén keresztül tudjuk, hogy mikor olvassa és hajtja végre az egyes fájlokat. Ennek bizonyítására nézzük meg, mi történik, amikor user2
bejelentkezik ssh
-n keresztül egy másik gépről:
user2@debian:~$ ssh user2@192.168.1.6 user2@192.168.1.6's password: Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Nov 27 19:57:19 2018 from 192.168.1.10 Hello from /etc/profile Hello from /home/user2/.profile
Amint az utolsó két sorból is látható, ez működött, de vegyünk észre három dolgot:
-
Először a globális fájl futott le.
-
Nem voltak
.bash_profile
vagy.bash_login
fájlok auser2
home mappájában. -
A tilde (
~
) a fájl abszolút elérési útvonalára (/home/user2/.profile
) bővült.
Interaktív non-login shell
Globális szint
/etc/bash.bashrc
-
Ez az egész rendszerre kiterjedő
.bashrc
fájl az interaktívbash
shellekhez. Végrehajtása során abash
meggyőződik arról, hogy interaktívan fut, minden parancs után ellenőrzi az ablak méretét (szükség esetén frissíti aLINES
ésCOLUMNS
értékeit), és beállít néhány változót.
Lokális szint
~/.bashrc
-
Amellett, hogy a
/etc/bash.bashrc
felhasználói szinten hasonló feladatokat lát el (például az ablak méretének ellenőrzése, vagy ha interaktívan futtatjuk), ez a Bash-specifikus fájl általában beállít néhány előzményváltozót és a~/.bash_aliases
forrását, ha létezik. Ettől eltekintve ez a fájl általában a felhasználó specifikus aliasok és függvények tárolására szolgál.Hasonlóképpen érdemes megjegyezni, hogy a
~/.bashrc
beolvasásra kerül, ha abash
érzékeli, hogy az<stdin>
egy hálózati kapcsolat (mint a fenti példában a Secure Shell (SSH) kapcsolat esetében).
Interaktív, non-login shell konfigurációs fájlok vizsgálata
Módosítsuk a /etc/bash.bashrc
és a /home/user2/.bashrc
fájlokat:
root@debian:~# echo 'echo Hello from /etc/bash.bashrc' >> /etc/bash.bashrc root@debian:~# echo 'echo Hello from ~/.bashrc' >> ~/.bashrc
És ez történik, amikor user2
egy új shell-t indít:
user2@debian:~$ bash Hello from /etc/bash.bashrc Hello from /home/user2/.bashrc
A két fájlt ismét beolvasásra és végrehajtásra került.
Warning
|
Ne feledjük, hogy a fájlok futtatási sorrendje miatt a helyi fájlok elsőbbséget élveznek a globálisakkal szemben. |
Non-Interaktív Login Shell
Az -l
vagy --login
kapcsolóval rendelkező non-interaktív shell kénytelen úgy viselkedni, mint egy login shell, így a futtatandó indítófájlok ugyanazok lesznek, mint az interaktív login shell esetében.
Ennek bizonyítására írjunk egy egyszerű scriptet, és tegyük futtathatóvá. Nem fogunk semmilyen shebang-ot beilleszteni, mert a parancssorból a bash executablet (/bin/bash
a login kapcsolóval) fogjuk meghívni.
-
Létrehozzuk a
test.sh
scriptet, amely tartalmazza aecho 'Hello from a script'
sort, hogy bizonyítani tudjuk a script sikeres futását:user2@debian:~$ echo "echo 'Hello from a script'" > test.sh
-
Futtathatóvá tesszük a scriptet:
user2@debian:~$ chmod +x ./test.sh
-
Végül meghívjuk a
bash
-t az-l
opcióval, hogy futtassuk a scriptet:user2@debian:~$ bash -l ./test.sh Hello from /etc/profile Hello from /home/user2/.profile Hello from a script
Működik! A script futtatása előtt megtörtént a bejelentkezés, és az
/etc/profile
és a~/.profile
is végrehajtásra került.
Note
|
A shebang-ekről és a shell scriptelés minden más aspektusáról a következő leckékben fogunk tanulni. |
Legyen most az echo
parancs standard kimenete (stdout) az ssh
kapcsolat standard bemenetére irányítva (stdin) egy pipe (|
) segítségével:
user2@debian:~$ echo "Hello-from-a-noninteractive-login-shell" | ssh user2@192.168.1.6 Pseudo-terminal will not be allocated because stdin is not a terminal. user2@192.168.1.6's password: Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Hello from /etc/profile Hello from /home/user2/.profile -bash: line 1: Hello-from-a-noninteractive-login-shell: command not found
Az /etc/profile
és a ~/.profile
ismét végrehajtásra kerül. Ettől eltekintve a kimenet első és utolsó sora elég sokatmondó a shell viselkedését illetően.
Non-Interaktív Non-Login Shell
A scriptek nem olvassák a fent felsorolt fájlok egyikét sem, hanem keresik a BASH_ENV
környezeti változót, szükség esetén kibővítik az értékét, és azt használják egy indítófájl neveként a parancsok beolvasásához és végrehajtásához. A környezeti változókról a következő leckében többet fogunk megtudni.
Mint fentebb említettük, általában az /etc/profile
és a ~/.profile
gondoskodik arról, hogy a sikeres bejelentkezés után mind az /etc/bash.bashrc
, mind a ~/.bashrc
végrehajtásra kerüljön. A következő parancs kimenete megmutatja ezt a jelenséget:
root@debian:~# su - user2 Hello from /etc/bash.bashrc Hello from /etc/profile Hello from /home/user2/.bashrc Hello from /home/user2/.profile
Figyelembe véve a korábban a startup scriptekhez csatolt sorokat — és az interaktív bejelentkezési shell meghívását felhasználói szinten a su - user2
paranccsal — a négy kimeneti sor a következőképpen magyarázható:
-
Hello from /etc/bash.bashrc
azt jelenti, hogy az/etc/profile
a/etc/bash.bashrc
forrásából származik. -
Hello from /etc/profile
azt jelenti, hogy az/etc/profile
teljes egészében beolvasásra és végrehajtásra került. -
Hello from /home/user2/.bashrc
azt jelenti, hogy a~/.profile
a~/.bashrc
-t vette át. -
Hello from /home/user2/.profile
azt jelenti, hogy a~/.profile
teljes egészében beolvasásra és végrehajtásra került.
Figyeljük meg, hogy a su - <felhasználónév>
(valamint a su -l <felhasználónév>
és su --login <felhasználónév>
) használatával garantáljuk a login shell meghívását, míg a su <felhasználónév>
csak az /etc/bash.bashrc
-t és a ~/.bashrc
-t hívta volna meg.
Sourcing fájlok
Az előző szakaszokban már beszéltünk arról, hogy egyes indítási parancsfájlok más parancsfájlokat tartalmaznak vagy hajtanak végre. Ezt a mechanizmust nevezzük sourcingnek, és ebben a szakaszban ismertetjük.
Sourcing fájlok és a .
A pont (.
) általában a startup fájlokban található.
A Debian szerverünk .profile
fájljában például a következő blokkot találjuk:
# include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi
Már láttuk, hogy egy script végrehajtása hogyan vezethet egy másik script végrehajtásához. Így az if
utasítás garantálja, hogy a $HOME/.bashrc
fájl — ha létezik (-f
) — a bejelentkezéskor sourced (azaz olvasás és végrehajtás) lesz:
. "$HOME/.bashrc"
Note
|
Amint azt a következő leckében megtanuljuk, a |
Továbbá használhatjuk a .
-t, ha módosítottunk egy startup fájlt, és a változtatásokat újraindítás nélkül akarjuk érvénybe léptetni. Például:
-
alias hozzáadása a
~/.bashrc
-hez:user2@debian:~$ echo "alias hi='echo We salute you.'" >> ~/.bashrc
Warning
|
Amikor egy parancs kimenetét egy fájlba küldjük, ne tévesszük össze az append (hozzáfűzés — |
-
a
~/.bashrc
utolsó sorának kimenete, hogy ellenőrizzük, minden rendben ment-e:user2@debian:~$ tail -n 1 !$ tail -n 1 ~/.bashrc alias hi='echo We salute you.'
NoteA
!$
az előző parancs utolsó argumentumára bővül, ami a mi esetünkben a "~/.bashrc". -
a fájl sourceolása kézzel:
user2@debian:~$ . ~/.bashrc
-
és az alias meghívása, hogy bizonyítsuk, működik:
user2@debian:~$ hi We salute you.
Note
|
A következő leckében megismerkedünk az aliasokkal és a változókkal. |
Fájlok sourcingja a source
paranccsal
A source
parancs a .
szinonimája. Tehát a ~/.bashrc
sourcingolását így is megtehetjük:
user2@debian:~$ source ~/.bashrc
A shell startup fájlok eredete: SKEL
A SKEL
egy változó, amelynek értéke a skel
mappa abszolút elérési útvonala. Ez a mappa szolgál sablonként a felhasználók home mappáinak fájlrendszeri struktúrájához. Tartalmazza azokat a fájlokat, amelyeket minden újonnan létrehozott felhasználói fiók örökölni fog (beleértve természetesen a shellek konfigurációs fájljait is). A SKEL
és más kapcsolódó változókat az /etc/adduser.conf
állományban tároljuk, amely az adduser
konfigurációs állománya:
user2@debian:~$ grep SKEL /etc/adduser.conf # The SKEL variable specifies the directory containing "skeletal" user SKEL=/etc/skel # If SKEL_IGNORE_REGEX is set, adduser will ignore files matching this SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"
A SKEL
a /etc/skel
-be van állítva; így a shelljeinket konfiguráló startup scriptek is ebben találhatók:
user2@debian:~$ ls -a /etc/skel/ . .. .bash_logout .bashrc .profile
Warning
|
Ne feledjük, hogy a |
Most hozzunk létre egy mappát az /etc/skel
-ben, ahol minden új felhasználó tárolhatja a személyes scriptjeit:
-
root
-ként lépünk az/etc/skel
-be:root@debian:~# cd /etc/skel/ root@debian:/etc/skel#
-
Kilistázzuk a tartalmát:
root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc .profile
-
Létrehozzuk a mappát és ellenőrizzük, hogy minden az elképzelésnek megfelelően alakult-e:
root@debian:/etc/skel# mkdir my_personal_scripts root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc my_personal_scripts .profile
-
Most töröljük a
user2
-t ahome
mappájával együtt:root@debian:~# deluser --remove-home user2 Looking for files to backup/remove ... Removing files ... Removing user `user2' ... Warning: group `user2' has no more members. Done.
-
Hozzáadjuk
user2
-t újra, így megkapja az új home mappáját:root@debian:~# adduser user2 Adding user `user2' ... Adding new group `user2' (1001) ... Adding new user `user2' (1001) with group `user2' ... Creating home directory `/home/user2' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for user2 Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y
-
Végül belépünk
user2
-ként és listázzuk az összes fájlt a/home/user2
-ben, hogy lássuk, minden az elképzeléseinknek megfelelően alakult-e:root@debian:~# su - user2 user2@debian:~$ pwd /home/user2 user2@debian:~$ ls -a . .. .bash_history .bash_logout .bashrc my_personal_scripts .profile
It did.
Gyakorló feladatok
-
Tanulmányozzuk, hogyan indultak a shellek a “Shell elindult…” oszlopban, és töltsük ki a szükséges információkat:
Shell elindult… Interaktív? Login? echo $0
eredményesudo ssh user2@machine2
Ctrl+Alt+F2
su - user2
gnome-terminal
Egy normál felhasználó a konzolt használja a sakura példányának elindításához
Egy
test.sh
nevű script, ami azecho $0
parancsot tartalmazza -
A
su
éssudo
parancsokkal indítsuk el a megadott shellt:- Interaktív login shell
user2
felhasználóként -
su
:sudo
: - Interaktív login shell
root
felhasználóként -
su
:sudo
: - Interaktív non-login shell
root
felhasználóként -
su
:sudo
: - Interaktív non-login shell
user2
felhasználóként -
su
:sudo
:
- Interaktív login shell
-
Milyen startup fájl kerül beolvasásra, amikor a “Shell típusa” alatti shell elindul?
Shell típusa /etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc
Interaktív-login shell
user2
felhasználókéntInteraktív login shell
root
felhasználókéntInteraktív non-login shell
root
felhasználókéntInteraktív non-login shell
user2
felhasználóként
Gondolkodtató feladatok
-
Bashben írhatunk egy egyszerű
Hello world!
függvényt, ha a következő kódot beillesztjük egy üres fájlba:function hello() { echo "Hello world!" }
-
Mi a következő teendőnk, hogy a funkciót elérhetővé tegyük a shell számára?
-
Ha már elérhető az aktuális shell számára, hogyan lehet invokálni?
-
Az automatizálás érdekében melyik fájlba tehetnénk a függvényt és annak meghívását, hogy az akkor is végrehajtódjon, amikor a
user2
megnyit egy terminált egy X Window munkamenetből? Milyen típusú shellről van szó? -
Milyen fájlban helyezhetnénk el a függvényt és annak invokálását, hogy akkor fusson le, amikor a
root
elindít egy új interaktív shellt, függetlenül attól, hogy bejelentkezik-e vagy sem?
-
-
Nézzük meg az alábbi, egyszerű
Hello world!
bash
scriptet:#!/bin/bash #hello_world: egy egyszerű bash script a scriptek interakciójának megvitatására. echo "Hello world!"
-
Tegyük fel, hogy a scriptet futtathatóvá tesszük és futtatjuk. Ez egy interaktív script lenne? Miért?
-
Mi teszi a scriptet interaktívvá?
-
-
Képzeljük el, hogy megváltoztattuk néhány változó értékét a
~/.bashrc
állományban, és azt szeretnénk, hogy ezek a változások újraindítás nélkül lépjenek életbe! Hogyan lehetne ezt a home mappából kétféleképpen megvalósítani? -
John most indított el egy X Window munkamenetet egy Linux-szerveren. Megnyit egy terminál emulátort, hogy elvégezzen néhány adminisztrációs feladatot, de meglepő módon a munkamenet lefagy, és meg kell nyitnia egy szöveges shellt.
-
Hogyan nyithatja meg a
tty
shellt? -
Melyik startup fájl lesz sourceolva?
-
-
Linda egy Linux-szerver felhasználója. Kéri a rendszergazdát, hogy legyen egy
~/.bash_login
fájlja, hogy bejelentkezéskor a képernyőre kiírhassa az időt és a dátumot. A többi felhasználónak tetszik az ötlet, és követik a példáját. A rendszergazdának nehézséget okoz a szerver összes többi felhasználója számára létrehozni a fájlt, ezért egy új policy hozzáadása mellett dönt, és minden potenciális új felhasználó számára létrehozza a~/.bash_login
fájlt. Hogyan tudja a rendszergazda ezt a feladatot elvégezni?
Összefoglalás
Ebben a leckében megtanultuk:
-
Azt, hogy hogyan állítják be a shellek a felhasználók környezetét egy Linux rendszerben.
-
Azt, hogy a Bash az első számú shell a GNU/Linux disztribúciókban.
-
Azt, hogy a shell első feladata egy vagy több indítófájl beolvasása és végrehajtása.
-
Az interakció és login fogalma a shellekkel kapcsolatban.
-
Azt, hogy hogyan indíthatunk különböző típusú shelleket a
bash
,su
,sudo
és Ctrl+Alt+F1-F6 segítségével. -
Azt, hogy hogyan ellenőrizhetjük a shell típusát a
echo $0
segítségével. -
Azt, hogy a helyi indítófájlok a
~/.bash_profile
, a~/.profile
, a~/.bash_login
, a~/.bash_logout
és a~/.bashrc
. -
Azt, hogy a globális indítási fájlok az
/etc/profile
, az/etc/profile.d/*
és az/etc/bash.bashrc
. -
Azt, hogy a helyi fájlok elsőbbséget élveznek a globálisakkal szemben.
-
Azt, hogy hogyan irányíthatjuk át egy parancs kimenetét a
>
(felülírás) és a>>
(hozzáfűzés) segítségével. -
Azt, hogy mi a
skel
mappa jelentése. -
Azt, hogy hogyan kell sourcolni a fájlokat.
A leckében használt parancsok:
bash
-
Új shellt hoz létre.
su
-
Új shellt hoz létre.
sudo
-
Új shellt hoz létre.
usermod
-
Módosít egy felhasználói fiókot.
echo
-
Megjelenít egy szöveget.
ps
-
A jelenlegi folyamatokról közöl egy pillanatképet.
less
-
Lapozó hosszabb fájlokhoz.
ssh
-
Elindít egy Open SSH kapcsolatot (távolról).
chmod
-
Megváltoztatja egy fájl üzemmódbitjeit, például futtathatóvá teszi.
grep
-
Egy mintának megfelelő sorokat jelenít meg.
ls
-
Kilistázza egy mappa tartalmát.
cd
-
Mappát vált.
mkdir
-
Létrehoz egy mappát.
deluser
-
Töröl egy felhasználót.
adduser
-
Hozzáad egy új felhasználót.
.
-
Sourceol egy fájlt.
source
-
Sourceol egy fájlt.
tail
-
Kiírja a fájlok utolsó részét.
Válaszok a gyakorló feladatokra
-
Tanulmányozzuk, hogyan indultak a shellek a “Shell elindult…” oszlopban, és töltsük ki a szükséges információkat:
Shell elindult… Interaktív? Login? echo $0
eredményesudo ssh user2@machine2
Igen
Igen
-bash
Ctrl+Alt+F2
Igen
Igen
-bash
su - user2
Igen
Igen
-bash
gnome-terminal
Igen
Nem
bash
Egy normál felhasználó a konzolt használja a sakura példányának elindításához
Igen
Nem
/bin/bash
Egy
test.sh
nevű script, ami azecho $0
parancsot tartalmazzaNem
Nem
./test.sh
-
A
su
éssudo
parancsokkal indítsuk el a megadott shellt:- Interaktív login shell
user2
felhasználóként su
-
su - user2
,su -l user2
vagysu --login user2
sudo
-
sudo su - user2
,sudo su -l user2
vagysudo su --login user2
- Interaktív login shell
root
felhasználóként su
-
su - root
vagysu -
sudo
-
sudo su - root
,sudo su -
vagysudo -i
- Interaktív non-login shell
root
felhasználóként su
-
su root
vagysu
sudo
-
sudo su root
,sudo su
,sudo -s
vagysudo -u root -s
- Interaktív non-login shell
user2
felhasználóként su
-
su user2
sudo
-
sudo su user2
orvagy`sudo -u user2 -s`
- Interaktív login shell
-
Milyen startup fájl kerül beolvasásra, amikor a “Shell típusa” alatti shell elindul?
Shell típusa /etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc
Interaktív-login shell
user2
felhasználókéntIgen
Igen
Igen
Igen
Interaktív login shell
root
felhasználókéntIgen
Igen
Nem
Nem
Interaktív non-login shell
root
felhasználókéntNem
Igen
Nem
Nem
Interaktív non-login shell
user2
felhasználókéntNem
Igen
Nem
Igen
Válaszok a gondolkodtató feladatokra
-
Bashben írhatunk egy egyszerű
Hello world!
függvényt, ha a következő kódot beillesztjük egy üres fájlba:function hello() { echo "Hello world!" }
-
Mi a következő teendőnk, hogy a funkciót elérhetővé tegyük a shell számára?
Ahhoz, hogy a funkciót az aktuális shell számára elérhetővé tegyük, sourceolnunk kell az azt tartalmazó fájlt.
-
Ha már elérhető az aktuális shell számára, hogyan lehet meghívni?
Úgy, hogy beírjuk a nevét a terminálba.
-
Az automatizálás érdekében melyik fájlba tehetnénk a függvényt és annak meghívását, hogy az akkor is végrehajtódjon, amikor a
user2
megnyit egy terminált egy X Window munkamenetből? Milyen típusú shellről van szó?A legjobb fájl a
/home/user2/.bashrc
. Az invokált shell egy interaktív non-login shell lesz. -
Milyen fájlban helyezhetnénk el a függvényt és annak meghívását, hogy akkor fusson el, amikor a
root
elindít egy új interaktív shellt, függetlenül attól, hogy bejelentkezik-e vagy sem?Az
/etc/bash.bashrc
állományban, mivel ez a fájl minden interaktív shell esetében végrehajtásra kerül - akár történik bejelentkezés, akár nem.
-
-
Nézzük meg az alábbi, egyszerű
Hello world!
bash
scriptet:#!/bin/bash #hello_world: egy egyszerű bash script a scriptek interakciójának megvitatására. echo "Hello world!"
-
Tegyük fel, hogy a scriptet futtathatóvá tesszük és futtatjuk. Ez egy interaktív script lenne? Miért?
Nem, mivel nincs benne emberi interakció és felhasználó által beírt parancsok sem.
-
Mi teszi a scriptet interaktívvá?
A tény, hogy felhasználói beavatkozást igényel.
-
-
Képzeljük el, hogy megváltoztattuk néhány változó értékét a
~/.bashrc
állományban, és azt szeretnénk, hogy ezek a változások újraindítás nélkül lépjenek életbe! Hogyan lehetne ezt a home mappából kétféleképpen megvalósítani?$ source .bashrc
vagy
$ . .bashrc
-
John most indított el egy X Window munkamenetet egy Linux-szerveren. Megnyit egy terminál emulátort, hogy elvégezzen néhány adminisztrációs feladatot, de meglepő módon a munkamenet lefagy, és meg kell nyitnia egy szöveges shellt.
-
Hogyan nyithatja meg a
tty
shellt?Megteheti a Ctrl+Alt+F1-F6 lenyomásával, amivel beléphet a hat tty shell egyikébe.
-
Melyik startup fájl lesz sourceolva?
/etc/profile
/home/john/.profile
-
-
Linda egy Linux-szerver felhasználója. Kéri a rendszergazdát, hogy legyen egy
~/.bash_login
fájlja, hogy bejelentkezéskor a képernyőre kiírhassa az időt és a dátumot. A többi felhasználónak tetszik az ötlet, és követik a példáját. A rendszergazdának nehézséget okoz a szerver összes többi felhasználója számára létrehozni a fájlt, ezért egy új policy hozzáadása mellett dönt, és minden potenciális új felhasználó számára létrehozza a~/.bash_login
fájlt. Hogyan tudja a rendszergazda ezt a feladatot elvégezni?Ezt úgy érheti el, hogy a
.bash_login
állományt a/etc/skel
mappába helyezi.