105.1 Lezione 1
Certificazione: |
LPIC-1 |
---|---|
Versione: |
5.0 |
Argomento: |
105 Shell e Script di Shell |
Obiettivo: |
105.1 Personalizzare e utilizzare l’ambiente di Shell |
Lezione: |
1 di 3 |
Introduzione
La shell è probabilmente lo strumento più potente in un sistema Linux e può essere definita come un’interfaccia tra l’utente e il kernel del sistema operativo che interpreta i comandi inseriti dall’utente. Tutti gli amministratori di sistema devono essere esperti nell’uso della shell. Come ormai sappiamo, la Bourne Again Shell (Bash) è la shell de facto per la stragrande maggioranza delle distribuzioni Linux.
Una volta avviata, la prima cosa che fa Bash - o qualsiasi altra shell - è eseguire una serie di script di avvio. Questi script personalizzano l’ambiente di sessione. Sono disponibili sia script a livello di sistema sia specifici dell’utente. Possiamo inserire le nostre preferenze o impostazioni personali che meglio si adattano alle esigenze dei nostri utenti in questi script sotto forma di variabili, alias e funzioni.
La serie esatta di file di avvio dipende da un parametro molto importante: il tipo di shell. Diamo uno sguardo alle varie shell esistenti.
Tipi di shell: Interattiva vs Non-interattiva ; Login vs Senza-Login
Per cominciare, chiariamo i concetti di interattivo e accesso nel contesto delle shell:
- Shell Interattive / Non-interattive
-
Ci si riferisce all’interazione che avviene tra l’utente e la shell: l’utente fornisce l’input digitando i comandi nel terminale utilizzando la tastiera; la shell fornisce l’output visualizzando messaggi sullo schermo.
- Shell con Login / Senza-Login
-
Ci si riferisce all’evento in cui un utente accede a un sistema informatico fornendo le sue credenziali, come nome utente e password.
Sia le shell interattive sia quelle non-interattive possono essere con login o senza-login e ogni possibile combinazione di questi tipi ha i suoi usi specifici.
Le shell di Login interattive vengono eseguite quando gli utenti accedono al sistema e vengono utilizzate per personalizzare le configurazioni degli utenti in base alle loro esigenze. Un buon esempio di questo tipo di shell sarebbe quella di un gruppo di utenti appartenenti allo stesso dipartimento che necessitano di un particolare set di variabili nelle loro sessioni.
Con shell interattive non di login si fa riferimento a qualsiasi altra shell aperta dall’utente dopo aver effettuato l’accesso al sistema. Gli utenti utilizzano queste shell durante le sessioni per eseguire attività di manutenzione e amministrative come l’impostazione di variabili, l’ora, la copia di file, la scrittura di script, ecc.
D’altra parte, le shell non interattive non richiedono alcun tipo di interazione umana. Pertanto, queste shell non chiedono input all’utente e il loro output, se presente, nella maggior parte dei casi viene scritto in un registro.
Le shell di login non interattive sono piuttosto rare e poco pratiche. I loro usi sono praticamente inesistenti e ne parleremo solo per motivi di comprensione del comportamento della shell. Alcuni strani esempi includono la forzatura di uno script da eseguire da una shell di login con /bin/bash --login <some_script>
o il piping dell’output standard (stdout) di un comando nello standard input (stdin) di una connessione ssh:
<some_command> | ssh <some_user>@<some_server>
Per quanto riguarda la shell non interattiva non di login non c’è né interazione né login per conto dell’utente, quindi ci riferiamo qui all’uso di script automatizzati. Questi script vengono utilizzati principalmente per eseguire attività amministrative e di manutenzione ripetitive come quelle incluse in cronjob. In questi casi, bash
non legge alcun file di avvio.
Apertura di un Terminale
Quando ci troviamo in un ambiente desktop possiamo aprire un’applicazione terminale o passare a una delle console di sistema. Pertanto, una nuova shell è una shell pts
quando viene aperta da un emulatore di terminale nella GUI o una shell tty
quando viene eseguita da una console di sistema. Nel primo caso non abbiamo a che fare con un terminale ma con un emulatore di terminale. Come parte delle sessioni grafiche, gli emulatori di terminale come gnome-terminal o konsole sono molto ricchi di funzionalità e facili da usare rispetto ai terminali con interfaccia utente basata su testo. Emulatori di terminale meno ricchi di funzionalità includono, tra gli altri, XTerm e sakura.
Usando le combinazioni di Ctrl+Alt+F1-F6 possiamo andare ai login della console che aprono una shell di login interattiva basata su testo. Ctrl+Alt+F7 ci riporterà nelle sessione desktop (GUI).
Note
|
|
Avviare una Shell con bash
Dopo il login, digitare bash
in un terminale per aprire una nuova shell. Tecnicamente, questa shell è un processo figlio della shell corrente.
Durante l’avvio del processo figlio bash
, possiamo specificare vari parametri per definire quale tipo di shell vogliamo avviare. Ecco alcune importanti opzioni di invocazione di bash
:
bash -l
orbash --login
-
invocherà una shell di login.
bash -i
-
invocherà una shell interattiva.
bash --noprofile
-
insieme alle shell di login, ignoreranno sia il file di avvio a livello di sistema
/etc/profile
che i file di avvio a livello utente~/.bash_profile
,~/.bash_login
e~ /.profile
. bash --norc
-
ignorerà sia il file di avvio a livello di sistema
/ etc / bash.bashrc
che il file di avvio a livello utente~/.bashrc
. bash --rcfile <file>
-
ignorerà sia il file di avvio a livello di sistema
/etc/bash.bashrc
che il file di avvio a livello utente~/.bashrc
.
Discuteremo i vari file di avvio in seguito.
Avvio di Shell con su
e sudo
Attraverso l’uso di questi due programmi simili possiamo ottenere specifici tipi di shell:
su
-
Cambia l’ID utente o diventa superutente (
root
). Con questo comando possiamo richiamare sia shell di login che shell non di login:-
su - user2
,su -l user2
osu --login user2
avvierà una shell di login interattiva comeuser2
. -
su user2
avvierà una shell interattiva non di login comeuser2
. -
su - root
osu -
avvieranno una shell di login interattiva comeroot
. -
su root
osu
avvieranno una shell interattiva non di login comeroot
.
-
sudo
-
Consente di eseguire i comandi come un altro utente (incluso il supersuser). Poiché questo comando viene utilizzato principalmente per ottenere temporaneamente i privilegi di root, l’utente che lo utilizza deve trovarsi nel file
sudoers
. Per aggiungere utenti asudoers
dobbiamo diventareroot
ed eseguire:root@debian:~# usermod -aG sudo user2
Proprio come
su
,sudo
ci permette di invocare sia shell di login che shell non di login:-
sudo su - user2
,sudo su -l user2
osudo su --login utente2
avvieranno una shell di login interattiva comeuser2
. -
sudo su user2
avvierà una shell interattiva non di login comeuser2
. -
sudo -u user2 -s
avvierà una shell interattiva non di login comeuser2
. -
sudo su - root
osudo su -
avvierà una shell di login interattiva comeroot
. -
sudo -i
avvierà una shell di login interattiva comeroot
. -
sudo -i <some_command>
avvierà una shell di login interattiva comeroot
, eseguirà il comando e tornerà all’utente originale. -
sudo su root ` o `sudo su
avvieranno una shell interattiva non di login comeroot
. -
sudo -s
osudo -u root -s
avvierà una shell non di login comeroot
.
-
Quando si usa su
o sudo
è importante considerare il nostro caso particolare per l’avvio di una nuova shell: abbiamo bisogno dell’ambiente dell’utente di destinazione, o no? Se è così, useremmo le opzioni che invocano le shell di login; in caso contrario, quelli che invocano shell non di login.
Che Tipi di Shell Abbiamo?
Per scoprire su quale tipo di shell stiamo lavorando, possiamo digitare echo $0
nel terminale e ottenere il seguente output:
- Login interattivo
-
-bash
o-su
- Non-login interattivo
-
bash
o/bin/bash
- Non-interattivo non-login (scripts)
-
<nome_dello_script>
Quante Shell abbiamo?
Per vedere quante shell bash
abbiamo attive e funzionanti nel sistema, possiamo usare il comando ps aux | grep bash
:
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
user2
in debian
ha effettuato l’accesso a una sessione GUI (o X Window System) e ha aperto gnome-terminal, quindi ha premuto Ctrl+Alt+F1 per entrare in una sessione di terminale tty
. Infine, è tornato alla sessione della GUI premendo Ctrl+Alt+F7 e digitato il comando ps aux | grep bash
. Pertanto, l’output mostra una shell interattiva non di login tramite l’emulatore di terminale (pts/0
) e una shell di login interattiva tramite l’appropriato terminale basato su testo (tty1
). Nota anche come l’ultimo campo di ogni riga (il comando) sia bash
per la prima e -bash
per la seconda.
Da Dove le Shell Ottengono la Loro Configurazione: File di Avvio
Bene, ora che conosciamo i tipi di shell che possiamo trovare in un sistema Linux, è giunto il momento di vedere quali file di avvio vengano eseguiti da quale shell. Notare che gli script globali o globali di sistema sono posti nella directory /etc/
, mentre quelli locali o a livello utente si trovano nella home dell’utente (~
). Inoltre, quando è presente più di un file da cercare, una volta trovato ed eseguito gli altri vengono ignorati. Esplora e studia questi file tu stesso con il tuo editor di testo preferito o digitando less <startup_file>
.
Note
|
I file di avvio possono essere suddivisi in specifici di Bash (quelli limitati solo alle configurazioni e ai comandi di |
Shell Interattive di Login
Livello Globale
/etc/profile
-
Questo è il file
.profile
a livello di sistema per la shell Bourne e per le shell compatibili con Bourne (bash
inclusa). Attraverso una serie di istruzioniif
, questo file imposta di conseguenza un numero di variabili comePATH
ePS1
così come il reperimento - qualora esistano - sia del file/etc/bash.bashrc
sia di altri file all’interno della directory/etc/profile.d
. /etc/profile.d/*
-
Questa directory può contenere script che vengono eseguiti da
/etc/profile
.
Livello Locale
~/.bash_profile
-
Questo file specifico di Bash viene utilizzato per configurare l’ambiente utente. Può anche essere usato per eseguire sia
~/.bash_login
sia~/.profile
. ~/.bash_login
-
Anch’esso specifico per Bash, questo file verrà eseguito solo se non c’è un file
~/.bash_profile
. Il suo nome suggerisce che dovrebbe essere usato per eseguire i comandi necessari all’accesso. ~/.profile
-
Questo file non è specifico di Bash e viene preso in considerazione solo se non esistono né
~/.bash_profile
né~/.bash_login
, il che è generalmente la norma. Quindi, lo scopo principale di~/.profile
è quello di controllare se una shell Bash è in esecuzione e, in tal caso, di cercare se esiste~/.bashrc
. Di solito imposta la variabilePATH
in modo che includa la directory privata~/bin
dell’utente, se esiste. ~/.bash_logout
-
Se esiste, questo file specifico di Bash esegue alcune operazioni di pulizia quando si esce dalla shell. Ciò può essere utile in casi come quelli dove si attivano sessioni remote.
Esplorazione dei File di Configurazione di una Shell di Login Interattiva
Mostriamo alcuni di questi file in azione modificando /etc/profile
e /home/user2/.profile
. Aggiungeremo a ciascuno una riga per ricordarci il file in esecuzione:
root@debian:~# echo 'echo Hello from /etc/profile' >> /etc/profile root@debian:~# echo 'echo Hello from ~/.profile' >> ~/.profile
Note
|
Due operatori di reindirizzamento |
Quindi, attraverso l’output dei rispettivi comandi echo
sapremo quando ciascuno di questi file viene letto ed eseguito. Per dimostrarlo, vediamo cosa succede quando user2
accede tramite ssh
da un’altra macchina:
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
Come mostrano le ultime due righe, ha funzionato. Inoltre, nota tre cose:
-
Il file globale è stato eseguito per primo.
-
Non c’erano file
.bash_profile
o.bash_login
nella directory home diuser2
. -
La tilde (
~
) espansa al percorso assoluto del file (/home/utente2/.profile
).
Shell Interattiva Non di Login
Livello Globale
/etc/bash.bashrc
-
Questo è il file
.bashrc
a livello di sistema per le shell interattivebash
. Attraverso la sua esecuzionebash
si assicura che venga eseguito in modo interattivo, controlla la dimensione della finestra dopo ogni comando (aggiornando i valori diLINES
eCOLUMNS
se necessario) e imposta alcune variabili.
Livello Locale
~/.bashrc
-
Oltre a svolgere attività simili a quelle descritte per
/etc/bash.bashrc
a livello utente (come controllare la dimensione della finestra o se viene eseguito in modo interattivo), questo file specifico di Bash di solito imposta alcune variabili di cronologia e esegue~/.bash_aliases
se esiste. A parte ciò, questo file viene normalmente utilizzato per memorizzare gli alias e le funzioni specifich degli utenti.Allo stesso modo, vale anche la pena notare che
~/.bashrc
viene letto sebash
rileva che<stdin>
è una connessione di rete (come nel caso della connessione Secure Shell (SSH) nell’esempio sopra) .
Esplorazione dei File di Configurazione della Shell Interattiva non di Login
Ora modifichiamo /etc/bash.bashrc
e /home/user2/.bashrc
:
root@debian:~# echo 'echo Hello from /etc/bash.bashrc' >> /etc/bash.bashrc root@debian:~# echo 'echo Hello from ~/.bashrc' >> ~/.bashrc
E questo è ciò che accade quando user2
avvia una nuova shell:
user2@debian:~$ bash Hello from /etc/bash.bashrc Hello from /home/user2/.bashrc
Anche in questo caso, i due file sono stati letti ed eseguiti.
Warning
|
Ricorda, a causa dell’ordine in cui vengono eseguiti i file, i file locali hanno la precedenza su quelli globali. |
Shell Non-Interattive di Login
Una shell non interattiva con le opzioni -l
o --login
è costretta a comportarsi come una shell di login e quindi i file di avvio da eseguire saranno gli stessi delle shell di login interattive.
Per dimostrarlo, scriviamo un semplice script e rendiamolo eseguibile. Non includeremo alcun shebang perché invocheremo l’eseguibile bash (/bin/bash
con l’opzione di login) dalla riga di comando.
-
Creiamo lo script
test.sh
contenente la rigaecho 'Hello from a script'
in modo da poter provare che lo script viene eseguito correttamente:user2@debian:~$ echo "echo 'Hello from a script'" > test.sh
-
Rendiamo eseguibile il nostro script:
user2@debian:~$ chmod +x ./test.sh
-
Infine, invochiamo
bash
con l’opzione-l
per eseguire lo script:user2@debian:~$ bash -l ./test.sh Hello from /etc/profile Hello from /home/user2/.profile Hello from a script
Funziona! Prima di eseguire lo script, è stato eseguito il login e sono stati eseguiti sia
/etc/profile
che~/.profile
.
Note
|
Impareremo a conoscere shebang e tutti gli altri aspetti dello scripting di shell nelle prossime lezioni. |
Facciamo ora lo standard output (stdout) del comando echo
nello standard input (stdin) di una connessione ssh
per mezzo di una pipe (|
):
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
Di nuovo, vengono eseguiti /etc/profile
e ~/.profile
. Oltre a questo, la prima e l’ultima riga dell’output sono abbastanza indicative per quanto riguarda il comportamento della shell.
Shell Non-Interattiva non di Login
Gli script non leggono nessuno dei file sopra elencati ma cercano la variabile d’ambiente BASH_ENV
, espanderne il valore se necessario e usarla come nome di un file di avvio per leggere ed eseguire comandi. Impareremo di più sulle variabili d’ambiente nella prossima lezione.
Come accennato in precedenza, tipicamente /etc/profile
e ~/.profile
si assicurano che sia /etc/bash.bashrc
sia ~/.bashrc
vengano eseguiti dopo un login riuscito. L’output del seguente comando mostra questo fenomeno:
root@debian:~# su - user2 Hello from /etc/bash.bashrc Hello from /etc/profile Hello from /home/user2/.bashrc Hello from /home/user2/.profile
Tenendo presente le righe precedentemente aggiunte agli script di avvio — e invocando una shell di login interattiva a livello utente con su - user2
— le quattro righe di output possono essere spiegate come segue:
-
Hello from /etc/bash.bashrc
indica che/etc/profile
ha eseguito/etc/bash.bashrc
. -
Hello from /etc/profile
indica che/etc/profile
è stato completamente letto ed eseguito. -
Hello from /home/user2/.bashrc
indica che~/.profile
ha eseguito~/.bashrc
. -
Hello from /home/user2/.profile
indica che~/.profile
è stato completamente letto ed eseguito.
Nota come con su - <username>
(anche su -l <username>
e su --login <username>
) garantiamo l’invocazione di una shell di login, mentre su <username>
avrebbe solo invocato /etc/bash.bashrc
e ~/.bashrc
.
Sourcing di File
Nelle sezioni precedenti abbiamo discusso del fatto che alcuni script di avvio includono o eseguono altri script. Questo meccanismo è chiamato "sourcing" ed è spiegato in questa sezione.
Sourcing di File con .
Il punto (.
) si trova normalmente nei file di avvio.
Nel file .profile
del nostro server Debian possiamo trovare, per esempio, il seguente blocco:
# include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi
Abbiamo già visto come l’esecuzione di uno script possa portare a quella di un altro. Pertanto, l’istruzione if
garantisce che il file $HOME/.bashrc
— se esiste (-f
) — verrà prelevato (cioè letto ed eseguito) al login:
. "$HOME/.bashrc"
Note
|
Come impareremo nella prossima lezione, |
Inoltre, possiamo usare il carattere .
ogni volta che abbiamo modificato un file di avvio e vogliamo rendere effettive le modifiche senza un riavvio. Per esempio possiamo:
-
aggiungere un alias a
~/.bashrc
:user2@debian:~$ echo "alias hi='echo We salute you.'" >> ~/.bashrc
Warning
|
Quando si invia l’output di un comando in un file, ricordarsi di non confondere accodare ( |
-
visualizza l’ultima riga di
~/.bashrc
per controllare che tutto sia andato bene:user2@debian:~$ tail -n 1 !$ tail -n 1 ~/.bashrc alias hi='echo We salute you.'
Note!$
si espande all’ultimo argomento del comando precedente, nel nostro caso:~/.bashrc
. -
richiama (source) il file a mano:
user2@debian:~$ . ~/.bashrc
-
e richiama l’alias per dimostrare che funziona:
user2@debian:~$ hi We salute you.
Note
|
Fare riferimento alla lezione successiva per informazioni su alias e variabili. |
Richiamare ( Sourcing ) i file con source
Il comando source
è equivalente di .
. Quindi per richiamare ~/.bashrc
possiamo anche fare in questo modo:
user2@debian:~$ source ~/.bashrc
L’Origine dei File di Avvio della Shell: SKEL
SKEL
è una variabile il cui valore è il percorso assoluto della directory skel
. Questa directory funge da modello per la struttura del file system delle directory home degli utenti. Include i file che verranno ereditati da qualsiasi nuovo account utente creato (inclusi, ovviamente, i file di configurazione per le shell). SKEL
e altre variabili correlate sono memorizzate in /etc/adduser.conf
, che è il file di configurazione per adduser
:
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)"
SKEL
è impostato su /etc/skel
; quindi, gli script di avvio che configurano le nostre shell si trovano qui:
user2@debian:~$ ls -a /etc/skel/ . .. .bash_logout .bashrc .profile
Warning
|
Ricorda, i file che iniziano con |
Creiamo ora una directory in /etc/skel
in cui memorizzare i file per i nuovi utenti:
-
Come
root
ci spostiamo in/etc/skel
:root@debian:~# cd /etc/skel/ root@debian:/etc/skel#
-
Visualizziamo il contenuto:
root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc .profile
-
Creiamo la nostra directory e controlliamo che tutto sia andato come previsto:
root@debian:/etc/skel# mkdir my_personal_scripts root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc my_personal_scripts .profile
-
Adesso cancelliamo
user2
insieme alla sua directoryhome
: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.
-
Aggiungiamo di nuovo
user2
in modo che ottenga una nuova directory home: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
-
Infine, accediamo come
user2
ed elenchiamo tutti i file in/home/user2
per vedere se tutto è andato come previsto:root@debian:~# su - user2 user2@debian:~$ pwd /home/user2 user2@debian:~$ ls -a . .. .bash_history .bash_logout .bashrc my_personal_scripts .profile
Tutto come previsto.
Esercizi Guidati
-
Studia come sono state avviate le shell sotto la colonna “Shell Avviata con…” e completa con le informazioni richieste:
Shell Avviata con… Interactive? Login? Risultato di echo $0
sudo ssh user2@machine2
Ctrl+Alt+F2
su - user2
gnome-terminal
Un utente normale utilizza konsole per avviare un’istanza di sakura
Uno script chiamato
test.sh
contenente il comandoecho $0
-
Scrivi i comandi
su
esudo
per avviare la shell specificata:- Shell di login interattiva come
user2
-
su
:sudo
: - Shell di login interattiva come
root
-
su
:sudo
: - Shell non di login interattiva come
root
-
su
:sudo
: - Shell non di login interattiva come
user2
-
su
:sudo
:
- Shell di login interattiva come
-
Quale file di avvio viene letto quando viene avviata la shell presente in “Tipo di Shell”?
Tipo di Shell /etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc
Shell di login interattiva come
user2
Shell di login interattiva come
root
Shell non di login interattiva come
root
Shell non di login interattiva come
user2
Esercizi Esplorativi
-
In Bash possiamo scrivere una semplice funzione
Hello world!
includendo il seguente codice in un file vuoto:function hello() { echo "Hello world!" }
-
Che cosa dovremmo fare dopo per rendere la funzione disponibile alla shell?
-
Una volta che è disponibile per la shell corrente, come la invocheresti?
-
Per automatizzare le cose, in quale file metteresti la funzione e la sua invocazione in modo che venga eseguita quando
user2
apre un terminale da una sessione X Window? Che tipo di Shell è? -
In quale file metteresti la funzione e la sua invocazione in modo che venga eseguita quando
root
lancia una nuova Shell interattiva indipendentemente dal fatto che sia login o meno?
-
-
Dai un’occhiata al seguente script di base
bash
Hello world!
:#!/bin/bash #hello_world: a simple bash script to discuss interaction in scripts. echo "Hello world!"
-
Supponiamo di rendere eseguibile lo script e di eseguirlo. Sarebbe uno script interattivo? Perché?
-
Che cosa rende interattivo uno script?
-
-
Immagina di aver cambiato i valori di alcune variabili in
~/.bashrc
e vuoi che tali modifiche abbiano effetto senza un riavvio. Dalla tua home directory, come puoi ottenerlo in due modi diversi? -
John ha appena avviato una sessione X Window su un server Linux. Apre un emulatore di terminale per svolgere alcune attività amministrative ma, sorprendentemente, la sessione si blocca e ha bisogno di aprire una shell di testo.
-
Come può aprire quella shell
tty
? -
Quali file di avvio verranno richiamati?
-
-
Linda è un utente di un server Linux. Chiede gentilmente all’amministratore di avere un file
~/.bash_login
in modo che possa avere l’ora e la data stampate sullo schermo quando accede. Ad altri utenti piace l’idea e seguono l’esempio. L’amministratore ha difficoltà a creare il file per tutti gli altri utenti sul server, quindi decide di aggiungere una nuova policy e di creare~/.bash_login
per tutti i potenziali nuovi utenti. Come può l’amministratore svolgere tale compito?
Sommario
In questa lezione abbiamo imparato:
-
Le shell impostano l’ambiente degli utenti in un sistema Linux.
-
Bash è la shell numero uno nelle distribuzioni GNU/Linux.
-
Il primo lavoro che una shell esegue è quello di leggere ed eseguire uno o più file di avvio.
-
I concetti di interattivo e login relativi alle shell.
-
Come avviare diversi tipi di shell con
bash
,su
,sudo
e kbd: [Ctrl+Alt+F1]-F6. -
Come controllare il tipo di shell con
echo $0
. -
I file di avvio locali
~/.bash_profile
,~/.profile
,~/.bash_login
,~/.bash_logout
e~/.bashrc
. -
I file di avvio globali
/etc/profile
,/etc/profile.d/*
,/etc/bash.bashrc
. -
I file locali hanno la precedenza su quelli globali.
-
Come reindirizzare l’output di un comando con
>
(sovrascrivi) e>>
(accoda). -
Il significato della directory
skel
. -
Come richiamare i file.
Comandi utilizzati in questa lezione:
bash
-
Avvia una nuova Shell.
su
-
Avvia una nuova Shell.
sudo
-
Avvia una nuova Shell.
usermod
-
Modifica un account utente.
echo
-
Visualizza una riga di testo.
ps
-
Mostra un’istantanea dei processi in corso.
less
-
Un paginatore di file lunghi.
ssh
-
Avvia una connessione Open SSH (remotamente).
chmod
-
Modifica i bit di modalità di un file, per esempio, renderlo eseguibile.
grep
-
Stampa le linee che corrispondono a un pattern.
ls
-
Elenca il contenuto della directory.
cd
-
Cambia directory.
mkdir
-
Crea una directory.
deluser
-
Elimina un utente.
adduser
-
Aggiunge un utente.
.
-
Richiama (Source) a file.
source
-
Richiama (Source) a file.
tail
-
Visualizza l’ultima parte di un file.
Risposte agli Esercizi Guidati
-
Studia come sono state avviate le shell sotto la colonna “Shell Avviata con…” e completa con le informazioni richieste:
Shell Avviata con… Interactive? Login? Risultato di echo $0
sudo ssh user2@machine2
Sì
Sì
-bash
Ctrl+Alt+F2
Sì
Sì
-bash
su - user2
Sì
Sì
-bash
gnome-terminal
Sì
No
bash
Un utente normale utilizza konsole per avviare un’istanza di sakura
Sì
No
/bin/bash
Uno script chiamato
test.sh
contenente il comandoecho $0
No
No
./test.sh
-
Scrivi i comandi
su
esudo
per avviare la shell specificata:- Shell di login interattiva come
user2
su
-
su - user2
,su -l user2
osu --login user2
sudo
-
sudo su - user2
,sudo su -l user2
osudo su --login user2
- Shell di login interattiva come
root
su
-
su - root
orsu -
sudo
-
sudo su - root
,sudo su -
osudo -i
- Shell non di login interattiva come
root
su
-
su root
osu
sudo
-
sudo su root
,sudo su
,sudo -s
osudo -u root -s
- Shell non di login interattiva come
user2
su
-
su user2
sudo
-
sudo su user2
osudo -u user2 -s
- Shell di login interattiva come
-
Quale file di avvio viene letto quando viene avviata la shell presente in “Tipo di Shell”?
Tipo di Shell /etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc
Shell di login interattiva come
user2
Sì
Sì
Sì
Sì
Shell di login interattiva come
root
Sì
Sì
No
No
Shell non di login interattiva come
root
No
Sì
No
No
Shell non di login interattiva come
user2
No
Sì
No
Sì
Risposte agli Esercizi Esplorativi
-
In Bash possiamo scrivere una semplice funzione
Hello world!
includendo il seguente codice in un file vuoto:function hello() { echo "Hello world!" }
-
Che cosa dovremmo fare dopo per rendere la funzione disponibile alla shell?
Per rendere la funzione disponibile alla shell corrente, dobbiamo generare un file che la includa.
-
Una volta che è disponibile per la shell corrente, come la invocheresti?
La invocheremmo digitando il suo nome nel terminale.
-
Per automatizzare le cose, in quale file metteresti la funzione e la sua invocazione in modo che venga eseguita quando
user2
apre un terminale da una sessione X Window? Che tipo di Shell è?Il miglior file da utilizzare è
/home/user2/.bashrc
. La shell invocata sarebbe una shell interattiva non di login. -
In quale file metteresti la funzione e la sua invocazione in modo che venga eseguita quando
root
lancia una nuova Shell interattiva indipendentemente dal fatto che sia login o meno?In
/etc/bash.bashrc
poiché questo file viene eseguito per tutte le shell interattive, indipendentemente dal fatto che siano di login o meno.
-
-
Dai un’occhiata al seguente script di base
bash
Hello world!
:#!/bin/bash #hello_world: a simple bash script to discuss interaction in scripts. echo "Hello world!"
-
Supponiamo di rendere eseguibile lo script e di eseguirlo. Sarebbe uno script interattivo? Perché?
No, poiché non vi è alcuna interazione umana e nessun comando viene digitato dall’utente.
-
Che cosa rende interattivo uno script?
Il fatto che richieda l’input dell’utente.
-
-
Immagina di aver cambiato i valori di alcune variabili in
~/.bashrc
e vuoi che tali modifiche abbiano effetto senza un riavvio. Dalla tua home directory, come puoi ottenerlo in due modi diversi?$ source .bashrc
o
$ . .bashrc
-
John ha appena avviato una sessione X Window su un server Linux. Apre un emulatore di terminale per svolgere alcune attività amministrative ma, sorprendentemente, la sessione si blocca e ha bisogno di aprire una shell di testo.
-
Come può aprire quella shell
tty
?Potrebbe farlo premendo Ctrl+Alt+F1-F6 per entrare in una delle sei shell tty.
-
Quali file di avvio verranno richiamati?
/etc/profile
/home/john/.profile
-
-
Linda è un utente di un server Linux. Chiede gentilmente all’amministratore di avere un file
~/.bash_login
in modo che possa avere l’ora e la data stampate sullo schermo quando accede. Ad altri utenti piace l’idea e seguono l’esempio. L’amministratore ha difficoltà a creare il file per tutti gli altri utenti sul server, quindi decide di aggiungere una nuova policy e di creare~/.bash_login
per tutti i potenziali nuovi utenti. Come può l’amministratore svolgere tale compito?Potrebbe ottenerlo inserendo
.bash_login
nella directory/etc/skel
.