Bash vs sh

Può succedere che alcune volte quando si usa la shell di Linux, non tutto funziona come dovrebbe.

Ad esempio, può succedere quando accedendo in ssh ad un sistema remoto, usando un utenza applicativa (tipo oracle):

ssh oracle@nome_server

non è come ci si aspetterebbe, infatti, appare una situazione di questo tipo:

$

Infatti ci si aspetterebbe ad esempio una situazione del genere:

oracle@weblogic-server:~$

dove compare sia l’utente connesso corrente e sia il nome del sistema a cui siamo connessi.

La causa di questo problema è molto semplice anche se “sottile”:

nei sistemi Linux (o più propriamente GNU-Linux) la shell di sistema predefinita è sh (Bourne Shell), controllando infatti nel file: /etc/passwd, la situazione iniziale era questa:

oracle@weblogic-server:~$ cat /etc/passwd | grep oracle
oracle:x:1001:1001::/home/oracle:/bin/sh

Invece dovrebbe essere come segue:

oracle@weblogic-server:~$ cat /etc/passwd | grep oracle
oracle:x:1001:1001::/home/oracle:/bin/bash

Essendo che la shell sh però è obsoleta ed non è più utilizzata quindi in realtà viene usata come link simbolico ad altre shell installate e presenti sul sistema in base alla distribuzione Linux utilizzata.

La maggior parte delle volte quindi di solito punterà alla shell bash nel seguente percorso: /bin/bash.

Nella situazione invece d’esempio essendo su sistema con distribuzione GNU-Linux: Ubuntu Server release 20.10 essa puntava alla shell dash che però non è una shell interattiva quindi non legge le configurazioni dai files: /home/nome_utente/.bashrc (modalità interattiva normale), /etc/profile e /home/nome_utente/.bash_profile (modalità interattiva di login) e quindi non effettua nessuna personalizzazione della shell per l’utente oracle e questo causa la situazione riscontrata all’inizio.

Questo succede perchè sulle distribuzioni GNU-Linux Ubuntu quando si crea un nuovo utente usando il comando useradd viene settata come shell predefinita: /bin/sh all’utente creato (in questo caso oracle) che punta alla shell dash.

Quindi la soluzione senza andare a modificare il file /etc/passwd per non compromettere il sistema è quella di usare il seguente comando per cambiare la shell usata dall’utente corrente a cui si ha accesso al sistema:

chsh /bin/bash

Oppure se si vuole tenere la shell predefinita linkata a quella dash, si deve usare questa per eseguire gli scripts mentre per i comandi di shell, si consiglia di passare alla shell bash che ha la modalità interattiva e quindi consente di personalizzare la shell in base all’utente.

In alternativa come soluzione si consiglia quando si crea un nuovo utente nel caso di usare il comando adduser, infatti andando a vedere nel file di configurazione per questo comando si trova:

paolo@weblogic-server:~$ cat /etc/adduser.conf
# /etc/adduser.conf: `adduser' configuration.
# See adduser(8) and adduser.conf(5) for full documentation.

# The DSHELL variable specifies the default login shell on your
# system.
DSHELL=/bin/bash

che è differente dalla configurazione per il comando useradd:

paolo@weblogic-server:~$ cat /etc/default/useradd
# Default values for useradd(8)
#
# The SHELL variable specifies the default login shell on your
# system.
# Similar to DSHELL in adduser. However, we use "sh" here because
# useradd is a low level utility and should be as general
# as possible
SHELL=/bin/sh

Riferimenti:

Dash come /bin/sh: https://wiki.ubuntu.com/DashAsBinSh

Differenza tra sh e bash: https://qastack.it/ubuntu/141928/what-is-the-difference-between-bin-sh-and-bin-bash

Problema shell prompt non visualizza il nome host utente per un utente: https://askubuntu.com/questions/306137/ssh-shell-prompt-does-not-show-userhost-for-one-user

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.