| Línea 9: | Línea 9: | ||
== El intérprete de órdenes == | == El intérprete de órdenes == | ||
| − | : | + | :El proceso login nos asigna un intérprete de mandatos, leído de nuestra entrada en /etc/passwd. Ya sabemos que un shell no es más que un programa del sistema que nos va a permitir relacionarnos con la máquina, introduciéndole órdenes desde el teclado; es la interfaz de usuario que nos ofrece cualquier sistema operativo. En nuestro sistema Unix podemos tener instalados diversos intérpretes de órdenes; en el archivo /etc/shells tenemos los disponibles para cada usuario, incluido el root. Por defecto se asigna el Bourne Again Shell (bash), el más cómodo, que incluye lo mejor de todos los anteriores intérpretes, como el C-Shell (csh) o el Korn Shell (ksh). El bash incluye rodillo de mandatos, histórico de órdenes (en el archivo .bash history del directorio $HOME de cada usuario), uso de tabuladores para completar órdenes, etc. Cualquier intérprete de Unix nos ofrece un entorno de programación completo con herramientas similares a las de la mayoría de lenguajes de programación secuencial (if, for, while. . . ). También nos va a ofrecer una serie de órdenes, denominadas órdenes internas, que no encontramos como archivos ejecutables en el sistema, y que por supuesto no va a ser necesario cargar en memoria para oder ejecutarlas; un ejemplo típico de este tipo de instrucciones es exit: no encontraremos ningún ejecutable en todos los sistemas de ficheros de Unix que se denomine así. |
:En Unix existe el mandato chsh, que permite a cualquier usuario modificar el shell que el sistema le asigna por defecto (recordemos que este dato está grabado en /etc/passwd). En determinados clones, chsh no va a comprobar que el shell sea válido (esto es, que sea una entrada de /etc/shells). Esto puede suponer un problema: imaginemos que un usuario inexperto cambia su shell de entrada a /bin/login; será imposible para él volver a entrar al sistema mediante conexión remota hasta que el administrador modifique la información de /etc/passwd. Por tanto, desde hace algún tiempo la mayoría de Unices del mercado (y por supuesto también Linux) hacen la comprobación oportuna. | :En Unix existe el mandato chsh, que permite a cualquier usuario modificar el shell que el sistema le asigna por defecto (recordemos que este dato está grabado en /etc/passwd). En determinados clones, chsh no va a comprobar que el shell sea válido (esto es, que sea una entrada de /etc/shells). Esto puede suponer un problema: imaginemos que un usuario inexperto cambia su shell de entrada a /bin/login; será imposible para él volver a entrar al sistema mediante conexión remota hasta que el administrador modifique la información de /etc/passwd. Por tanto, desde hace algún tiempo la mayoría de Unices del mercado (y por supuesto también Linux) hacen la comprobación oportuna. | ||
| − | + | :Analizando el funcionamiento de chsh, vemos que una de las cosas que realiza es modificar el fichero de contraseñas para cambiar el shell de entrada de un usuario; por tanto, el archivo está "setuidado". Puede ser interesante para nosotros resetear el bit setuid del archivo (chmod -s) para así conseguir un mayor nivel de seguridad del sistema, ya que, como veremos más adelante, es conveniente mantener al míınimo el número de archivos "setuidados" en la máquina. Si lo hacemos así y algún usuario quiere cambiar su intérprete de órdenes cada vez que entre al sistema puede incluir en su .profile una orden como: | |
| − | + | ''' exec <nuevoshell> ''' | |
| − | + | :De esta forma, sustituye el proceso que ejecuta .profile (el shell) por la orden <nuevoshell>, el nuevo intérprete que desea. | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | De esta forma, sustituye el proceso que ejecuta .profile (el shell) por la orden <nuevoshell>, el | + | |
| − | nuevo | + | |
| − | + | ||
shutdown -r/-h now
Con el parámetro -r hacemos un reboot, y con -h un halt (simplemente detenemos el sistema, sin reinicializar).
exec <nuevoshell>