UNIX
Martín García Valle
UNIX Índice date .......................................................................................................................................................................... 4 cat ............................................................................................................................................................................ 4 pico.......................................................................................................................................................................... 4 wc ............................................................................................................................................................................ 4 cal ............................................................................................................................................................................ 5 who.......................................................................................................................................................................... 5 clear ......................................................................................................................................................................... 5 man.......................................................................................................................................................................... 5 PASSWD ................................................................................................................................................................ 5 mail ......................................................................................................................................................................... 5 DIRECCIONAMIENTO RELATIVO Y ABSOLUTO ........................................................................................ 16 touch...................................................................................................................................................................... 16 ls ............................................................................................................................................................................ 17 mkdir ..................................................................................................................................................................... 18 cd ........................................................................................................................................................................... 19 rmdir...................................................................................................................................................................... 20 rm .......................................................................................................................................................................... 20 pwd........................................................................................................................................................................ 20 mv ......................................................................................................................................................................... 20 cp ........................................................................................................................................................................... 21 cat .......................................................................................................................................................................... 22 TREE .................................................................................................................................................................... 22 LESS ..................................................................................................................................................................... 23 whoami .................................................................................................................................................................. 23 which ..................................................................................................................................................................... 23 WHATIS ............................................................................................................................................................... 23 WHEREIS ............................................................................................................................................................. 24 head ....................................................................................................................................................................... 24 tail ......................................................................................................................................................................... 24 MORE ................................................................................................................................................................... 26 HISTORY ............................................................................................................................................................. 27 EJERCICIOS FICHEROS 1 ................................................................................................................................. 27 EJERCICIO FICHEROS 2 ................................................................................................................................... 30 REDIRECCION - DESCRIPTORES ESTANDAR ............................................................................................. 32 VARIOS COMANDOS EN UNA LINEA -> SEPARADOS POR ; .................................................................... 34 UN COMANDO LARGO EN VARIAS LINEAS \ al final de linea sin dejar espacio entre escribir \ y dar a ENTER.................................................................................................................................................................. 35 PIPE O TUBERIAS .............................................................................................................................................. 35 tee .......................................................................................................................................................................... 37 COMODINES ....................................................................................................................................................... 37 COMPARACION FICHEROS ............................................................................................................................. 39 ALIAS ................................................................................................................................................................... 41 FICHEROS INODE .............................................................................................................................................. 41 FILE ...................................................................................................................................................................... 44 LINKS ln ............................................................................................................................................................... 44 CUT ...................................................................................................................................................................... 46 TR ......................................................................................................................................................................... 46 COMPRESIÓN DE FICHEROS EN UNIX ......................................................................................................... 47 VI .......................................................................................................................................................................... 49 MODOS O PERMISOS ........................................................................................................................................ 50 EJERCICIO PERMISOS ...................................................................................................................................... 52 COMUNICACION CON USUARIOS ................................................................................................................. 58 GREP .................................................................................................................................................................... 58 banner .................................................................................................................................................................... 63 FIND ..................................................................................................................................................................... 63 2
SORT .................................................................................................................................................................... 67 SED ....................................................................................................................................................................... 70 PROCESOS .......................................................................................................................................................... 74 PS - PARA VER EL LISTADO DE PROCESOS ................................................................................................ 75 GESTION DE USUARIOS .................................................................................................................................. 81 SU - ....................................................................................................................................................................... 81 PASSWD .............................................................................................................................................................. 81 ID .......................................................................................................................................................................... 81 WHOAMI ............................................................................................................................................................. 82 USUARIOS EN UNIX ......................................................................................................................................... 83 FICHERO /ETC/PASSWD ................................................................................................................................... 83 GRUPOS EN UNIX.............................................................................................................................................. 84 CREACIÓN AUTOMÁTICA DE USUARIOS ................................................................................................... 85 CREACIÓN AUTOMÁTICA DE GRUPOS ....................................................................................................... 86 FICHERo /ETC/GROUP ...................................................................................................................................... 87 GESTIÓN DE USUARIOS .................................................................................................................................. 88 AT ......................................................................................................................................................................... 97 ARCHIVOS DE CONFIGURACIÓN .................................................................................................................. 98 EJERCICIOS GENERALES .............................................................................................................................. 103 COMUNICACION CON USUARIOS ............................................................................................................... 106 WRITE ................................................................................................................................................................ 106 WALL ................................................................................................................................................................. 107 TALK .................................................................................................................................................................. 107 MENSAJE DEL DIA .......................................................................................................................................... 108 MENSAJE ANTES DE HACER LOGIN ........................................................................................................... 108 FINGER - WHO - CHFN - ID ............................................................................................................................ 109 FTP...................................................................................................................................................................... 110 PING ................................................................................................................................................................... 110 EJEMPLO DE TELNET, WHO, WHO AM I y WRITE.................................................................................... 111 INETD.CONF ..................................................................................................................................................... 113 TTY..................................................................................................................................................................... 114 LOGNAME......................................................................................................................................................... 114 UNAME .............................................................................................................................................................. 114 MONTADO DE SISTEMA DE ARCHIVOS .................................................................................................... 115 CERRAR SISTEMA........................................................................................................................................... 118 SHELL SCRIPTS TEORIA ................................................................................................................................ 119 EJERCICIOS SHELL SCRIPT........................................................................................................................... 126 EJERCICIOS SHELL SCRIPTS ........................................................................................................................ 146 SHELL SCRIPTS INVOCAR SCRIPT .............................................................................................................. 150 EXIT ................................................................................................................................................................... 151 EXPORTACION DE VARIABLES ................................................................................................................... 152 EJERCICIOS GENERALES .............................................................................................................................. 153
3
DATE Fecha actual Date “+Mes:%m%nDia:%d%nHora:%T” Siempre al comenzar + %n salto de linea
CAT Visualiza ficheros cat f1 f2 Escribir fichero cat > f1 cat –n f1 : visualiza lineas del fichero martin8@NODE:/home/martin8/dir88> cat -n f1 1 1<e 2 2<a 3 3<t 4 4<b
PICO Editor de Linux Para salir y grabar CTRL+X
WC WC --> word count Cuenta palabras (w) Cuenta lineas (l) Cuenta letras (c) de un fichero wc –w –l f1 : cuenta las lineas y palabras del fichero f1 bash$ cat > martin Hola soy Martin bash$ wc martin 1 3 16 martin lineas/palabras/caracters (+1 --> CTRL+C y CTRL+C) CUIDADO cuenta 1 de mas.
4
CAL Muestra el calendario cal 2002 cal 2 2002
WHO Usuarios conectados en este momento al sistema martin8@NODE:/home/martin8> who martin8 pts/0 Jun 16 10:38 pts/X es pseudoterminal tty funcionando en la máquina
CLEAR Limpiar pantalla
MAN Comando de ayuda de UNIX Preguntar ayuda sobre X man X q para salir
PASSWD Cambia la password de un usuario bash$ passwd Changing password for martin6 (current) UNIX password: passwd: Authentication failure bash$ bash$ passwd Changing password for martin6 (current) UNIX password: New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully
MAIL Correo en UNIX 5
x salir sin grabar q salir grabando d borrar mensaje h mostrar lista de mensajes t ir a un determinado mensaje t2,t5 s grabar mensajes en un fichero s 1 2 3 mensaj1 mail –f leer mensajes grabados en X fichero mail –f mensaj1 r responder mensaje a alias de correo
MAIL mail <usuario al que va dirigido> Subject : Tema hola bla bla bla bla bla bla CTRL+D CC: Otros destinos Ejemplo: bash$ mail martin8 Subject: AYUDA Martin necesito que me acompañes a una reunion de^H^H^H^[[D Cc: root bash$ SI UNA VEZ ESCRITO EL MENSAJE NO LO QUEREMOS ENVIAR CTRL+C y CTRL+C Ejemplo: Subject: AYUDA Martin necesito que me acompañes a una reunion de^H^H^H^[[D Cc: bash$ mail martin8 Subject: N^HNO no hace falta la han retrasado (Interrupt -- one more to kill letter) bash$ (He pulsado dos veces CTRL+C) VISUALIZAR EL MAIL ENVIADO A MARTIN8 [martin8@localhost martin8]$ mail Unknown command: "export" Mail version 8.1 6/6/93. Type ? for help. 6
"/var/spool/mail/martin8": 1 message 1 new >N 1 martin6@localhost.lo Thu Feb 21 11:25 13/445 "AYUDA" & EXISTEN DOS OPCIONES: N --> nuevo mensaje U --> mensaje recibido anteriormente y no leido OPCIONES DE MAIL Si se pulsa ENTER sobre el mensaje activo, se単alado por > se visualiza. Ejemplo: "/var/spool/mail/martin8": 1 message 1 new >N 1 martin6@localhost.lo Thu Feb 21 11:25 13/445 "AYUDA" & Message 1: From martin6 Thu Feb 21 11:25:27 2002 Date: Thu, 21 Feb 2002 11:25:27 +0100 From: Martinv6 <martin6@localhost.localdomain> To: martin8@localhost.localdomain Subject: AYUDA Martin necesito que me acompa単es a una reunion de & x -- SALIR DE MAIL SIN ALTERAR EL BUZON, SIN GRABAR Ejemplo: (He leido el mensaje pero al salir con x es como si no hubiera realizado nada) &x [martin8@localhost martin8]$ mail Unknown command: "export" Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin8": 1 message 1 new >N 1 martin6@localhost.lo Thu Feb 21 11:25 13/445 "AYUDA" & ENVIAMOS UN SEGUNDO MENSAJE A MARTIN8 DESDE MARTIN6 Al pulsar de nuevo mail salen los dos mensajes [martin8@localhost martin8]$ mail Unknown command: "export" Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin8": 2 messages 2 new >N 1 martin6@localhost.lo Thu Feb 21 11:25 13/445 "AYUDA" N 2 martin6@localhost.lo Thu Feb 21 11:34 13/402 "dos" & 7
t --> NOS PERMITE LEER EL MENSAJE QUE LE ESPECIFIQUEMOS, por ejemplo si escribo t2 me lee el mensaje "dos" Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin8": 2 messages 2 new >N 1 martin6@localhost.lo Thu Feb 21 11:25 13/445 "AYUDA" N 2 martin6@localhost.lo Thu Feb 21 11:34 13/402 "dos" & t2 Message 2: From martin6 Thu Feb 21 11:34:01 2002 Date: Thu, 21 Feb 2002 11:34:01 +0100 From: Martinv6 <martin6@localhost.localdomain> To: martin8@localhost.localdomain Subject: dos segund mensaje & h --> ME MUESTRA LA CABECERA DE LOS MENSAJES. Al haber leido el mensaje 2 en esta ocasi贸n desaparece la opci贸n de N y U ya que ni es nuevo ni aun no lo he leido. Subject: dos segund mensaje &h N 1 martin6@localhost.lo Thu Feb 21 11:25 13/445 "AYUDA" > 2 martin6@localhost.lo Thu Feb 21 11:34 13/402 "dos" & AHORA HEMOS ENVIADO VARIOS CORREOS A MARTIN8 PARA PRACTICAR VISUALIZANDO, GRABANDO y ELIMINANDO. bash$ mail martin8 Subject: dos segund mensaje Cc: bash$ mail martin8 Subject: tres hola3 Cc: bash$ mail martin8 Subject: cuatro hola4 Cc: bash$ mail martin8 Subject: cinco y hola e nuevo campeon Cc: 8
bash$ Cuando martin8 escriba MAIL visualizara los mensajes: [martin8@localhost martin8]$ mail Unknown command: "export" Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin8": 5 messages 3 new 5 unread U 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 >N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 N 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 N 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 &
"AYUDA" "martin8" "tres" "cuatro" "cinco"
Como siempre para visualizar o bien dar ENTER o bien t y el nĂşmero de mensaje & t4 Message 4: From martin8 Thu Feb 21 11:42:20 2002 Date: Thu, 21 Feb 2002 11:42:20 +0100 From: martin8@localhost.localdomain To: martin8@localhost.localdomain Subject: cuatro 4 &h U 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 "AYUDA" 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 "martin8" N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 "tres" > 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 "cuatro" N 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 "cinco" & x --> SALIR SIN GRABAR Si salimos sin grabar de nuevo aparecerĂĄ como si no hubieramos entrado: &h U 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 "AYUDA" 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 "martin8" N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 "tres" > 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 "cuatro" N 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 "cinco" &x You have mail in /var/spool/mail/martin8 [martin8@localhost martin8]$ mail Unknown command: "export" Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin8": 5 messages 3 new 5 unread 9
U 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 >N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 N 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 N 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 &
"AYUDA" "martin8" "tres" "cuatro" "cinco"
d --> ELIMINAR MENSAJES d1 -- elimina mensaje 1 d* -- elimina todos los mensajes d 3-7 -- elimina los mensajes del 1 al 7 Ejemplo "/var/spool/mail/martin8": 5 messages 3 new 5 unread U 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 >N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 N 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 N 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 & d1 &h >U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 N 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 N 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 & &h >U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 N 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 N 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 & d 4-5 &h U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 >N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 &
"AYUDA" "martin8" "tres" "cuatro" "cinco" "martin8" "tres" "cuatro" "cinco"
"martin8" "tres" "cuatro" "cinco" "martin8" "tres"
u --> SIN SALIR DE MAIL RECUPERA MENSAJES u1 -- recupera el mensaje 1 u* - recupera todos los mensajes u 3 7 -- recupera los menajes3 y 7 u 3-7 recupera los mensajes del 3 al 7 Ejemplo &h U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 "martin8" >N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 "tres" 10
& u1 &h > 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 "AYUDA" U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 "martin8" N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 "tres" &u45 &h 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 "AYUDA" U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 "martin8" N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 "tres" 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 "cuatro" > 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 "cinco" r ..> RESPODER MENSAJE Ejemplo &h 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 "AYUDA" U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 "martin8" N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 "tres" 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 "cuatro" > 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 "cinco" & r1 To: martin8@localhost.localdomain martin6@localhost.localdomain Subject: Re: AYUDA GRACIAS Cc: & y a martin6 lo recibira: Held 3 messages in /var/spool/mail/martin6 bash$ mail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin6": 4 messages 1 new 4 unread U 1 martin6@localhost.lo Thu Feb 21 11:38 14/404 "tres" U 2 martin6@localhost.lo Thu Feb 21 11:38 14/406 "cuatro" U 3 martin6@localhost.lo Thu Feb 21 11:39 14/422 "cinco" >N 4 martin8@localhost.lo Thu Feb 21 11:51 13/409 "Re: AYUDA" s --> SALIR GRABANDO. Los mensajes no leidos pasan de N a U. "/var/spool/mail/martin8": 6 messages 4 new 6 unread U 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 "AYUDA" U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 "martin8" >N 3 martin8@localhost.lo Thu Feb 21 11:42 13/379 "tres" N 4 martin8@localhost.lo Thu Feb 21 11:42 13/381 "cuatro" N 5 martin8@localhost.lo Thu Feb 21 11:42 14/389 "cinco" N 6 martin8@localhost.lo Thu Feb 21 11:51 13/409 "Re: AYUDA" 11
&q Held 6 messages in /var/spool/mail/martin8 [martin8@localhost martin8]$ mail Unknown command: "export" Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin8": 6 messages 6 unread >U 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 "AYUDA" U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 "martin8" U 3 martin8@localhost.lo Thu Feb 21 11:42 14/389 "tres" U 4 martin8@localhost.lo Thu Feb 21 11:42 14/391 "cuatro" U 5 martin8@localhost.lo Thu Feb 21 11:42 15/399 "cinco" U 6 martin8@localhost.lo Thu Feb 21 11:51 14/419 "Re: AYUDA" Y si se ha borrado un mensaje ya no se recupera. S --> GRABAR MENSAJES s3 fich1 -- graba el mensaje 3 al fich1 s fich1 -- graba el mensaje actual al fich1 s* fich2 -- graba todos los mensajes al fich2 Ejemplo Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin8": 6 messages 6 unread >U 1 martin6@localhost.lo Thu Feb 21 11:25 14/455 U 2 martin8@localhost.lo Thu Feb 21 11:40 14/396 U 3 martin8@localhost.lo Thu Feb 21 11:42 14/389 U 4 martin8@localhost.lo Thu Feb 21 11:42 14/391 U 5 martin8@localhost.lo Thu Feb 21 11:42 15/399 U 6 martin8@localhost.lo Thu Feb 21 11:51 14/419 & s1 mensaje1 "mensaje1" [New file] & s* mensajes "mensajes" [New file] &
"AYUDA" "martin8" "tres" "cuatro" "cinco" "Re: AYUDA"
mail -f mensaje1 [martin8@localhost martin8]$ mail -f mensaje1 Unknown command: "export" Mail version 8.1 6/6/93. Type ? for help. "mensaje1": 1 message > 1 martin6@localhost.lo Thu Feb 21 11:25 14/456 "AYUDA" & Message 1: From martin6 Thu Feb 21 11:25:27 2002 Date: Thu, 21 Feb 2002 11:25:27 +0100 From: Martinv6 <martin6@localhost.localdomain> To: martin8@localhost.localdomain Subject: AYUDA
12
Martin necesito que me acompañes a una reunion de &h > 1 martin6@localhost.lo Thu Feb 21 11:25 14/456 "AYUDA" &q [martin8@localhost martin8]$ mail Unknown command: "export" No mail for martin8 O BIEN MAIL -F MENSAJES [martin8@localhost martin8]$ mail -f mensajes Unknown command: "export" Mail version 8.1 6/6/93. Type ? for help. "mensajes": 6 messages > 1 martin6@localhost.lo Thu Feb 21 11:25 14/456 2 martin8@localhost.lo Thu Feb 21 11:40 14/397 3 martin8@localhost.lo Thu Feb 21 11:42 14/390 4 martin8@localhost.lo Thu Feb 21 11:42 14/392 5 martin8@localhost.lo Thu Feb 21 11:42 15/400 6 martin8@localhost.lo Thu Feb 21 11:51 14/420 &
"AYUDA" "martin8" "tres" "cuatro" "cinco" "Re: AYUDA"
salen todos los mensajes grabados. ? --> todos los comandos MODIFICAR MENSAJE Al escribir un mensaje es muy fácil equivoarse y posteriormente no se puede borrar. Para ello vamos a explicar una serie de normas. [martin8@localhost martin8]$ mail martin6 Unknown command: "export" Subject: errores hola te escribo para saber algo de ti, como pierdas una bombona te mando a mover tres de I350 a Gijón sin jaulas :-) pero hay una baca en el mar~v [martin8@localhost martin8]$ VISUAL=/usr/bin/pico [martin8@localhost martin8]$ export VISUAL [martin8@localhost martin8]$ echo $VISUAL /usr/bin/vi [martin8@localhost martin8]$ [martin8@localhost martin8]$ mail martin6 Unknown command: "export" Subject: errores hola amigos ezcrivo mu mar finstro~v 13
Al escribir ALT+126 y V y dar ENTER me sale el editor por defecto definido. Aqui es mas facil corregir todas las faltas e ir hacia atras.
CTRL+X para salir una vez corregido seleccionamos Y para grabar y ENTER para salir. Pulsamos CTRL+d si ya no queremos seguir escribiendo y nos saldrá el mensaje típico de CC: ENTER y listo. Y en martin6 verá el mensaje corregido: N 6 martin8@localhost.lo Thu Feb 21 12:11 15/418 "errores" & t6 Message 6: From martin8 Thu Feb 21 12:11:04 2002 Date: Thu, 21 Feb 2002 12:11:04 +0100 From: martin8@localhost.localdomain To: martin6@localhost.localdomain Subject: errores hola amigos escribo muy mal finstro PARA NO TENER QUE VOLVER A ESCRIBIR EN CADA SESION EL EDITOR A UTILIZAR MEJOR ESCRIBIRLO EN EL FICHERO .MAILRC [martin8@localhost martin8]$ cat .mailrc alias m martin6 alias m1 martin8 alias m2 martin9 14
set VISUAL=/usr/bin/pico export VISUAL echo $VISUAL ALIAS a --> permite definir alias. Por ejemplo : & a group martin6, martin8, root & mail group Subject: reunion 10:30 euro Cc: & LLega el correo a todos los de group. TambiĂŠn es posible especificar en el fichero .mailrc alias m6 martin6 alias m8 martin8 ES POSIBLE REDIRECCIONAR UN FICHERO DE TEXTO A UN CORREO mail martin8 < carta1 Ejemplo: [martin8@localhost martin8]$ cat carta Hola amigo nos vemos en Mendez Alvaro. [martin8@localhost martin8]$ mail martin6 <carta y en martin6 bash$ mail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin6": 6 messages 1 new 6 unread U 1 martin6@localhost.lo Thu Feb 21 12:17 16/567 "reunion" U 2 MAILER-DAEMON@localh Thu Feb 21 12:17 64/1886 "Returned mail: User u" U 3 martin6@localhost.lo Thu Feb 21 12:18 16/567 "reunion" U 4 MAILER-DAEMON@localh Thu Feb 21 12:18 64/1886 "Returned mail: User u" U 5 martin8@localhost.lo Thu Feb 21 12:19 15/456 "reunion" >N 6 martin8@localhost.lo Thu Feb 21 12:24 12/402 & t6 Message 6: From martin8 Thu Feb 21 12:24:36 2002 Date: Thu, 21 Feb 2002 12:24:35 +0100 From: martin8@localhost.localdomain To: martin6@localhost.localdomain Hola amigo nos vemos en Mendez Alvaro.
15
& PARA COMPROBAR EL FICHERO DONDE SE GUARDA LOS MAIL [root@localhost martin8]# echo $MAIL /var/spool/mail/martin8
DIRECCIONAMIENTO RELATIVO Y ABSOLUTO
Absoluto desde la raiz /home/usdai1 Relativo desde la posición en la que me encuentro
FALLOS TIPICOS no empezar por / Seguir el camino hasta llegar al directorio deseado desde el actual Utilizar .. (dos puntos) si es necesario
TOUCH Crea fichero vacio si no existe y si existe modifica los valores de la fecha a los actuales Por ejemplo: [martin8@localhost martin8]$ ls -l total 24 -rw-r--r-- 1 martin8 users 12 feb 22 16:15 a -rw-r--r-- 1 martin8 users 13 feb 22 16:06 b drwxrwxr-x 3 martin8 users 4096 feb 22 15:57 datos -rw-r--r-- 1 martin8 users 1789 feb 22 14:58 fich drwxr-xr-x 2 martin6 ASI2 4096 feb 21 13:49 marto drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 pu [martin8@localhost martin8]$ touch b [martin8@localhost martin8]$ ls -l total 24 -rw-r--r-- 1 martin8 users 12 feb 22 16:15 a -rw-r--r-- 1 martin8 users 13 feb 22 16:15 b drwxrwxr-x 3 martin8 users 4096 feb 22 15:57 datos -rw-r--r-- 1 martin8 users 1789 feb 22 14:58 fich drwxr-xr-x 2 martin6 ASI2 4096 feb 21 13:49 marto drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 pu [martin6@localhost martin6]$ ls -l total 4 -rw-r--r-- 1 martin6 ASI2 0 feb 21 13:26 a -rw-r--r-- 1 martin6 ASI2 0 feb 21 13:27 b drwxr-xr-x 2 root root 4096 feb 20 13:17 mart [martin6@localhost martin6]$ touch a [martin6@localhost martin6]$ ls -l 16
total 4 -rw-r--r-- 1 martin6 ASI2 -rw-r--r-- 1 martin6 ASI2 drwxr-xr-x 2 root root
0 feb 25 11:55 a 0 feb 21 13:27 b 4096 feb 20 13:17 mart
LS Muestra el contenido de un directorio (como dir) ls –l muestra las caracterisiticas de lo mostrado, ficheros, propietario, grupo, fecha… ls –a muestra ficheros ocultos (empiezan por punto .f1) ls –i indica el i-node del fichero bash$ pwd /home/martin6 bash$ ls MART lolo lolo1 mart nuevofic pedro bash$ ls -la total 40 drwxr-xr-x 4 martin6 ASI2 4096 feb 21 12:45 . drwxr-xr-x 14 root root 4096 feb 20 13:12 .. -rw------- 1 martin6 ASI2 3352 feb 21 10:59 .bash_history -rw-r--r-- 1 martin6 ASI2 11 feb 13 12:14 .exrc -rw-r--r-- 1 martin6 ASI2 6 feb 19 13:26 .martin -rw-r--r-- 1 martin6 ASI2 6 feb 19 13:27 MART -rw-r--r-- 1 martin6 ASI2 24 feb 19 13:25 lolo -rw-r--r-- 1 martin6 ASI2 15 feb 19 13:25 lolo1 drwxr-xr-x 2 root root 4096 feb 20 13:17 mart -rw-r--r-- 1 martin6 ASI2 0 feb 19 13:25 nuevofic drwxr-xr-x 2 martin6 ASI2 4096 feb 21 10:40 pedro PErmite crear un fichero vacío o bien modificar los atributos de un fichero ya existente con la fecha actual [martin6@localhost martin6]$ ls -l total 4 -rw-r--r-- 1 martin6 ASI2 0 feb 21 13:26 a -rw-r--r-- 1 martin6 ASI2 0 feb 21 13:27 b drwxr-xr-x 2 root root 4096 feb 20 13:17 mart [martin6@localhost martin6]$ touch a [martin6@localhost martin6]$ ls -l total 4 -rw-r--r-- 1 martin6 ASI2 0 feb 25 11:55 a -rw-r--r-- 1 martin6 ASI2 0 feb 21 13:27 b drwxr-xr-x 2 root root 4096 feb 20 13:17 mart
17
MKDIR Crea directorio mkdir -- CREA DIRECTORIOS bash$ mkdir martin2 bash$ ls MART lolo lolo1 mart martin2 nuevofic pedro bash$ ls -l total 24 -rw-r--r-- 1 martin6 ASI2 6 feb 19 13:27 MART -rw-r--r-- 1 martin6 ASI2 24 feb 19 13:25 lolo -rw-r--r-- 1 martin6 ASI2 15 feb 19 13:25 lolo1 drwxr-xr-x 2 root root 4096 feb 20 13:17 mart drwxr-xr-x 2 martin6 ASI2 4096 feb 21 12:47 martin2 -rw-r--r-- 1 martin6 ASI2 0 feb 19 13:25 nuevofic drwxr-xr-x 2 martin6 ASI2 4096 feb 21 10:40 pedro También con rutas absolutas: bash$ pwd /home/martin6 bash$ mkdir /home/martin6/martin2/martin3 bash$ pwd /home/martin6 bash$ ls /home/martin6/martin2/ martin3 OPCION –P lo que realiza es crear los directorios anteriores en el caso de que no existan. Asi por ejemplo si queremos crear un subdirectorio y a su vez dentro de el otro subdirectorio dentro, en un solo paso. [root@martin /root]# mkdir dir1/dir12 [root@martin /root]# tree . |-- dir1 | |-- dir11 | `-- dir12 |-- dir1dir11 |-- dir1dir111 |-- dir2 |-- dir3 |-- dir4 `-- prueba 8 directories, 1 file [root@martin /root]# mkdir -p dir1/dir12/dir121/dir1211 (CREA LOS DOS, ANTES NO ESTABA) [root@martin /root]# tree 18
. |-- dir1 | |-- dir11 | `-- dir12 | `-- dir121 | `-- dir1211 |-- dir1dir11 |-- dir1dir111 |-- dir2 |-- dir3 |-- dir4 `-- prueba 10 directories, 1 file OPCION –M ASIGNA PERMISOS AL DIRECTORIO CREADO [root@martin /root]# mkdir -m 777 lola drwxr-xr-x 2 root root 4096 ago 10 17:54 dir4 drwxrwxrwx 2 root root 4096 ago 10 18:00 lola
CD Desplazarse a la ruta especificada cd /home/usdai1 cd va al directorio propio cd - va al directorio anterior cd .. directorio padre CD --> Ir a una ruta o al directorio propio cd ruta cd .. --> al directorio anterior cd --> va al directorio propio del usuario ./ parte del directorio actual cd - --> se va al ultimo directorio donde ha estado. bash$ pwd /home/martin6/mart bash$ cd /home/martin6/mart bash$ pwd /home/martin6/mart bash$ cd bash$ pwd /home/martin6 bash$ cd bash$ pwd 19
/home/martin6/mart bash$ cd .. bash$ pwd /home/martin6 cd ../martin8 bash$ pwd /home/martin8
RMDIR Borra directorio solo si no contiene nada dentro. Si quisiera borrar aunque tuviera cosas dentro rm –R dir1 (borra recursivamente) RMDIR --> elimina directorio (debe estar vacio) bash$ rmdir mart rmdir: mart: El directorio no está vacío
RM Elimina ficheros y tambien con la opción R permite borrar recursivamente directorios y ficheros -f sin confirmacion -r recursivo
PWD Directorio donde me encuentro actualmente
MV mover o cambiar nombre a un fichero o directorio mv nombre antiguo nuevo nombre martin8@NODE:/home/martin8> mv ultima2 dir88/ultimito Muevo un fichero a otro lugar cambiandole el nombre martin8@NODE:/home/martin8> mv ultima2 dir88 Lo mueve al directorio dir88 sin cambiar nombre Opcion –i pide confirmacion (si ya existe ese fichero para no eliminarlo)
20
MV --> mover o renombrar fichero cambiar nombre bash$ mv fich10 fich11 bash$ cat fich10 cat: fich10: No existe el fichero o el directorio bash$ cat fich11 hola me llamo Chiquito jandeMOR mover un fichero a otro directorio bash$ mv lolo ./pedro bash$ cd pedro bash$ ls lolo Ya no existe el fichero al moverlo bash$ ls MART lolo1 mart martin2 nuevofic pedro bash$ mv lolo1 ./pedro bash$ mv lolo1 ./pedro/lolo mv: lolo1: No existe el fichero o el directorio opcion -i pide confirmacion si ya existe el fichero. bash$ mv -i lolo lolo2 bash$ mv -i lolo2 lolo bash$ mv -i lolo lolo mv: `lolo' y `lolo' son el mismo fichero bash$ touch lolo2 bash$ mv -i lolo lolo2 mv: ¿sobreescribir `lolo2'? (s/n) n
CP copiar ficheros -i confirmacion -r recursividad bash$ pwd /home/martin6/pedro bash$ cd .. bash$ ls MART mart martin2 nuevofic pedro bash$ cp ./pedro/* . [copia lo que hay en el directorio pedro al directorio actual] bash$ ls 21
MART lolo1 lolo2 mart martin2 nuevofic pedro bash$ pwd /home/martin6 bash$ cd pedro bash$ ls lolo1 lolo2
Si selecciono mas de dos ficheros significa que el último parámetro debe ser un directorio y que movemos todos los ficheros al directorio último.
Por ejemplo: Mv f1 f2 f3 f4 dir1 mueve los ficheros f1 f2 f3 f4 al directorio dir1
CAT CAT --> visualiza el contenido de ficheros bash$ cat > fich10 hola me llamo Chiquito jandeMOR (CTRL+D) bash$ cat fich10 hola me llamo Chiquito jandeMOR bash$ cat fich10 fich10 hola me llamo Chiquito jandeMOR hola me llamo Chiquito jandeMOR Muestra el contenido de un fichero Con la opción -n nuemera las lineas martin8@NODE:/home/martin8> cat hlink Este es index de Martin martin8@NODE:/home/martin8> cat -n index 1 Este es el nuevo index de Martin martin8@NODE:/home/martin8> cat -n hlink 1 Este es index de Martin martin8@NODE:/home/martin8> cat -n index hlink 1 Este es el nuevo index de Martin 2 Este es index de Martin
TREE Muestra el arbol de directorios [root@martin /root]# tree . |-- dir1 | `-- dir11 |-- dir1dir11 |-- dir1dir111 |-- dir2 22
|-- dir3 |-- dir4 `-- prueba 7 directories, 1 file
LESS less < nombre del fichero> Muestra el contenido de un fichero pero permite avanzar o retroceder. Por ejemplo z avanzar y w retroceder pรกgina. Para ver las teclas less --help. Para salir Q. z - atras w - adelante h --help q -- salir martin8@NODE:/home/martin8> less /etc/passwd [martin8@localhost martin8]$ less fich
WHOAMI Que usuario soy yo actualmente. Se suele utilizar cuando una persona entra al sistema como varios usuarios, y no sabe en un momento dado con que usuario esta trabajando.
WHICH which passwd Donde se encuentra el fichero ejecutable del comando escrito WHICH --> que programa se ejecutara bash$ which cp /bin/cp bash$ which vi /bin/vi
WHATIS Especifica una descripciรณn rรกpida de un comando martin8@NODE:/home/martin8> whatis cat cat (1) - concatenate files and print on the standard output 23
martin8@NODE:/home/martin8> whatis ls ls (1) - list directory contents
WHEREIS Busqueda de un fichero Ejemplo martin8@NODE:/home/martin8> whereis passwd passwd: /usr/bin/passwd /etc/passwd /usr/man/man1/passwd.1.gz /usr/man/man5/pass wd.5.gz martin8@NODE:/home/martin8> which passwd /usr/bin/passwd La diferencia que existe con el comando WHICH estรก en que which nos dice el ejecutable, es decir que fichero se va a ejecutar, en que path se encuentra si escribimos passwd.
HEAD head -7 f1 Selecciona las primeras 7 lineas del texto del fichero f1 (DESDE EL PRINCIPIO) Cuenta las lineas de la cabecera de un fichero head -20 --> cuenta las primeras 20 lineas bash$ ls -la> listado bash$ head -10 listado total 120 drwxrwxrwx 17 martin8 users 4096 feb 21 13:56 . drwxr-xr-x 14 root root 4096 feb 20 13:12 .. -rw------- 1 martin8 users 0 feb 13 13:12 .ICEauthority -rw------- 1 martin8 users 115 feb 13 13:09 .Xauthority -rw------- 1 martin8 users 4918 feb 21 12:22 .bash_history -rw-r--r-- 1 martin8 users 24 ene 30 10:46 .bash_logout -rw-r--r-- 1 martin8 users 230 ene 30 10:46 .bash_profile -rw-r--r-- 1 martin8 users 124 ene 30 10:46 .bashrc -rwxr-xr-x 1 martin8 users 333 ene 30 10:46 .emacs
TAIL tail -7 f1
24
Selecciona las Ăşltimas 7 lineas del texto del fichero f1 (DESDE EL FINAL) Muestra las ultimas lineas de un fichero tail -10 drwxr-xr-x 3 martin8 users 4096 ene 31 13:35 datos -rw-r--r-- 1 martin6 ASI2 0 feb 21 13:34 f3 -rw-r--r-- 1 martin6 ASI2 2397 feb 21 13:56 listado -rw-r--r-- 1 martin6 ASI2 16 feb 21 13:51 martin drwxr-xr-x 2 martin6 ASI2 4096 feb 21 13:49 marto drwx------ 2 martin8 users 4096 feb 12 14:03 nsmail drwxr-xr-x 3 martin8 users 4096 ene 31 11:35 pa drwxr-xr-x 4 martin8 users 4096 ene 31 11:36 pu -rw-r--r-- 1 root root 17 feb 19 12:43 stdout -rw-r--r-- 1 martin8 users 0 feb 19 12:15 tty1 -rwxrwxrwx 1 martin6 ASI2 5 feb 21 13:54 vi bash$ tail -5 listado drwxr-xr-x 3 martin8 users 4096 ene 31 11:35 pa drwxr-xr-x 4 martin8 users 4096 ene 31 11:36 pu -rw-r--r-- 1 root root 17 feb 19 12:43 stdout -rw-r--r-- 1 martin8 users 0 feb 19 12:15 tty1 -rwxrwxrwx 1 martin6 ASI2 5 feb 21 13:54 vi OPCION +NUMERO DESDE LA QUE MOSTRAR TEXTO Tail +2 prueba ď&#x192; mostrar desde la linea 2 incluida [root@martin /root]# ls -la > listado [root@martin /root]# cat listado total 68 drwxr-x--- 9 root root 4096 ago 10 18:02 . drwxr-xr-x 20 root root 4096 ago 5 18:33 .. -rw-r--r-- 1 root root 1126 ago 23 1995 .Xdefaults -rw------- 1 root root 98 ago 8 13:59 .bash_history -rw-r--r-- 1 root root 24 jul 14 1994 .bash_logout -rw-r--r-- 1 root root 238 ago 23 1995 .bash_profile -rw-r--r-- 1 root root 176 ago 23 1995 .bashrc -rw-r--r-- 1 root root 182 mar 22 1999 .cshrc -rw-r--r-- 1 root root 166 mar 4 1996 .tcshrc [root@martin /root]# tail +2 listado drwxr-x--- 9 root root 4096 ago 10 18:02 . drwxr-xr-x 20 root root 4096 ago 5 18:33 .. -rw-r--r-- 1 root root 1126 ago 23 1995 .Xdefaults -rw------- 1 root root 98 ago 8 13:59 .bash_history -rw-r--r-- 1 root root 24 jul 14 1994 .bash_logout -rw-r--r-- 1 root root 238 ago 23 1995 .bash_profile -rw-r--r-- 1 root root 176 ago 23 1995 .bashrc -rw-r--r-- 1 root root 182 mar 22 1999 .cshrc
25
MORE Visualiza un fichero como cat pero paso a paso: ENTER: linea a linea ESPACIO : Pรกgina a pรกgina
Es un comando que muestra el contenido de un fichero pero permite paginar. martin8@NODE:/home/martin8> ls -la|more total 164 drwxrwxrwx 13 martin8 users 4096 Feb 25 14:00 . drwxr-xr-x 15 root root 4096 Feb 22 14:11 .. -rw------- 1 martin8 users 0 Feb 13 13:12 .ICEauthority -rw------- 1 martin8 users 115 Feb 13 13:09 .Xauthority -rw------- 1 martin8 users 15932 Feb 26 10:53 .bash_history -rw-r--r-- 1 martin8 users 24 Jan 30 10:46 .bash_logout -rw-r--r-- 1 martin8 users 522 Feb 25 12:57 .bash_profile -rw-r--r-- 1 martin8 users 303 Feb 25 12:28 .bashrc drwx------ 2 martin8 users 4096 Feb 25 14:00 .cedit -rwxr-xr-x 1 martin8 users 333 Jan 30 10:46 .emacs drwx------ 3 martin8 users 4096 Feb 13 13:12 .enlightenment -rw------- 1 martin8 users 12288 Feb 22 17:41 .fichero.swp drwx------ 6 martin8 users 4096 Feb 13 13:12 .gnome drwxr-xr-x 2 martin8 users 4096 Feb 12 14:02 .gnome-desktop 26
drwxr-xr-x 2 martin8 users 4096 Feb 12 14:03 .gnome-help-browser drwx------ 2 martin8 users 4096 Feb 12 14:02 .gnome_private -rw-r--r-- 1 martin8 users 105 Jan 30 12:37 .mailrc drwxr-xr-x 3 martin8 users 4096 Feb 25 13:56 .mc drwxr-xr-x 4 martin8 users 4096 Feb 12 14:03 .netscape -rwxrwxrwx 1 martin8 users 50 Jan 30 12:32 .profile -rw-r--r-- 1 martin8 users 3394 Jan 30 10:46 .screenrc --More-b -- vuelve a la pรกgina anterior q -- sale h -- muestra ayuda ENTER -- pasa una linea ESPACIO - siguiente pรกgina
HISTORY Comando que me guarda los ultimos comandos realizados. Ejemplo: [martin8@localhost martin8]$ history|more 1 pwd 2 logout 3 ls 4 exit 5 passwd martin 6 passwd 7 passwd 8 whoami 9 mail 10 mail .... 930 ps -f 931 whoami 932 history Para ejecutar un comando sin tener que volver a escribirlo: [martin8@localhost martin8]$ !931 whoami martin8
EJERCICIOS FICHEROS 1 CREAMOS LA SIGUIENTE ESTRUCTURA / home 27
martin6 a b MART fich1 fich2 fich3 martin8 1) bash$ cp -r mart/* /home/martin8 [copia todos los ficheros de dentro de mart a martin8] bash$ pwd /home/martin6 bash$ cd /home/martin8 bash$ ls 10 20 30 datos f1 f2 f3 nsmail pa pu stdout tty1 2) bash$ pwd /home/martin6 bash$ cp -r mart /home/martin8 [copia el directorio inclusive] bash$ cd /home/martin8 bash$ ls 10 20 30 datos f1 f2 f3 mart nsmail pa pu stdout tty1 bash$ cd mart bash$ ls f1 f2 f3 3) bash$ pwd /home/martin8 bash$ cp -r /home/martin6/mart martin (estando en martin8 direccion absoluta y copia mart por martin dentro de martin8) bash$ ls 10 20 30 datos f1 f2 f3 martin nsmail pa pu stdout tty1 bash$ cd martin bash$ ls f1 f2 f3 4) bash$ cp -r /home/martin6/mart mart [con el mismo nombre] bash$ ls f1 f2 f3 mart bash$ pwd [pero al estar en el directorio martin me ha creado mart dentro de martin] /home/martin8/martin bash$ cd .. bash$ pwd /home/martin8 [si aquiero crearlo bajo martin8] bash$ cp -r /home/martin6/mart mart bash$ ls 10 20 30 datos f1 f2 f3 mart martin nsmail pa pu stdout tty1 28
5) bash$ pwd /home/martin8 bash$ cp -r -f /home/martin6/mart mart (-f sin pedir confirmacion) bash$ cp -r /home/martin6/mart mart (por defecto sin) bash$ cp -r -i /home/martin6/mart mart (-i pide confirmacion) cp: 多sobreescribir `mart/mart/f1'? (s/n) n cp: 多sobreescribir `mart/mart/f2'? (s/n) n cp: 多sobreescribir `mart/mart/f3'? (s/n) n RM -- elimina ficheros y directorios 1) bash$ ls 10 20 30 datos f1 f2 f3 mart nsmail pa pu stdout tty1 bash$ rm f1 f2 bash$ ls 10 20 30 datos f3 mart nsmail pa pu stdout tty1 2) bash$ ls 10 20 30 datos f3 mart nsmail pa pu stdout tty1 bash$ cd mart bash$ ls f1 f2 f3 mart bash$ cd .. bash$ rm mart rm: mart: es un directorio [NO DEJA ELIMINAR DIRECTORIOS salvo...] 3) bash$ rm -r mart [-r RECURSIVO elimina directorio y TODO lo de dentro] bash$ ls 10 20 30 datos f3 nsmail pa pu stdout tty1 4) creamos directorio y ficheros dentro con opcion -i pide confirmacion, sin ella o con -f no pide confirmaci巽on bash$ mkdir marto bash$ cd marto bash$ touch 1 bash$ touch 2 bash$ touch 3 bash$ cd .. bash$ ls 10 20 30 datos f3 marto nsmail pa pu stdout tty1 29
bash$ rm -r -i marto rm: Âżdescender al directorio `marto'? (s/n) n
EJERCICIO FICHEROS 2 Mc â&#x20AC;&#x201C; programa para ver ficheros en Linux 1)Crear la estructura de arbol [martin8@localhost martin8]$ pwd /home/martin8 [martin8@localhost martin8]$ ls 10 50 f3 listado marto pa stdout vi 30 datos fich1 martin nsmail pu tty1 [martin8@localhost martin8]$ cd 10 [martin8@localhost 10]$ ls 20 a b c d [martin8@localhost 10]$ cd 20 [martin8@localhost 20]$ ls f g h 2)Borrar todo el contenido de 30 [martin8@localhost martin8]$ rm -r 30 [martin8@localhost martin8]$ ls 10 datos fich1 martin nsmail pu tty1 50 f3 listado marto pa stdout vi 3) Crear todo el contenido del directorio 10 a un nuevo directorio llamado 50 con ficheros y directorios incluidos [martin8@localhost martin8]$ cp -r 10 60 4) Copiar los ficheros del directorio 10 dentro del directorio /home/martin8/50/20 [martin8@localhost martin8]$ cp ./10/* ./50/20/ cp: ./10/20: se omite el directorio [martin8@localhost martin8]$ pwd /home/martin8 [martin8@localhost martin8]$ cd 50 [martin8@localhost 50]$ ls 20 a b c d [martin8@localhost 50]$ cd 20 [martin8@localhost 20]$ ls a b c d f g h 5) Desde el directorio principal /home/martin8 eliminar el directorio /50/20 [martin8@localhost martin8]$ rmdir ./50/20 30
rmdir: ./50/20: El directorio no estĂĄ vacĂo [martin8@localhost martin8]$ [martin8@localhost martin8]$ rm ./50/20/* [martin8@localhost martin8]$ cd 50/20 [martin8@localhost 20]$ ls [martin8@localhost 20]$ cd [martin8@localhost martin8]$ rmdir ./50/20 [martin8@localhost martin8]$ ls ./50 10 a b c d 6)Copiar lo que se encuentra en el directorio 10/20 al directorio 50 (solo ficheros) [martin8@localhost martin8]$ cp ./10/20/* 50 [martin8@localhost martin8]$ cd 10/20 [martin8@localhost 20]$ ls f g h [martin8@localhost 20]$ cd ../../50 [martin8@localhost 50]$ ls 10 a b c d f g h 7)Eliminar los ficheros del directorio 50, no el subdirectorio [martin8@localhost martin8]$ rm 50/* rm: 50/10: es un directorio [martin8@localhost martin8]$ cd 50 [martin8@localhost 50]$ ls 10 8) cambiar el nombre del directorio 10 a 80 [martin8@localhost martin8]$ mv 10 80 [martin8@localhost martin8]$ ls 50 80 f3 listado marto pa stdout vi 60 datos fich1 martin nsmail pu tty1 9)Mover los ficheros del directorio 80 al subdirectorio 20 [martin8@localhost 80]$ mv * ./20 mv: no se puede mover `20' a un directorio de sĂ mismo, `./20/20' [martin8@localhost 80]$ ls 20 [martin8@localhost 80]$ cd 20 [martin8@localhost 20]$ ls a b c d f g h 10) Copiar el directorio 50 con todos sus subdirectorios al nueo directorio 90 [martin8@localhost martin8]$ cp -r 50 90 [martin8@localhost martin8]$ ls 50 80 datos fich1 martin nsmail pu tty1 31
60 90 f3
listado marto pa
stdout vi
11) Crear un fichero con cat llamado X que diga "Iniciandome en UNIX..." en el directorio propio y haga una copia de el con el nombre MIO. [martin8@localhost martin8]$ cd [martin8@localhost martin8]$ cat > X Iniciandome en UNIX[martin8@localhost martin8]$ ls 50 80 X f3 listado marto pa stdout vi 60 90 datos fich1 martin nsmail pu tty1 [martin8@localhost martin8]$ cp X mio [martin8@localhost martin8]$ ls 50 80 X f3 listado marto nsmail pu tty1 60 90 datos fich1 martin mio pa stdout vi 12) Que hace esto? Que arbol de directorio tiene? [martin8@localhost datos]$ ls fich3 lolo report [martin8@localhost datos]$ cd reprot bash: reprot: No existe el fichero o el directorio [martin8@localhost datos]$ cd report [martin8@localhost report]$ ls informes [martin8@localhost report]$ mv ../fich3 . [martin8@localhost report]$ ls fich3 informes
REDIRECCION - DESCRIPTORES ESTANDAR 0 STDIN entrada 1 STDOUT salida por defecto 2 STDERROR salida en caso de error > redirecciona creando o eliminando si existiera >> redirecciona añadiendo a lo anterior y si no existiera lo crea nuevo cat f1 f2 > f3 cat f1 f2 > f1 martin8@NODE:/home/martin8/dir88> cat > f1 hola martin8@NODE:/home/martin8/dir88> cat > f2 adios martin8@NODE:/home/martin8/dir88> cat f1 f2 > f3 martin8@NODE:/home/martin8/dir88> cat f3 32
hola adios martin8@NODE:/home/martin8/dir88> cat f1 f2 f89>f4 2>ferror martin8@NODE:/home/martin8/dir88> cat f4 hola adios martin8@NODE:/home/martin8/dir88> cat ferror cat: f89: No such file or directory martin8@NODE:/home/martin8/dir88> cat f1 f2 f89>>f4 2>ferror martin8@NODE:/home/martin8/dir88> cat f4 hola adios hola adios martin8@NODE:/home/martin8/dir88> cat ferror cat: f89: No such file or directory cat f1 f2 f3 2>/dev/null
> >> 1) Ejemplo de como se redirecciona un error a nulo (a papelera) [martin8@localhost martin8]$ cat >f1 este es f1 [martin8@localhost martin8]$ cat >f2 este es f2 [martin8@localhost martin8]$ cat f1 f2 este es f1 este es f2 [martin8@localhost martin8]$ cat f1 f2 f3 este es f1 este es f2 cat: f3: No existe el fichero o el directorio [martin8@localhost martin8]$ cat f1 f2 f3 2>/dev/null este es f1 este es f2 [AQUI NO SALE EL ERROR POR PANTALLA]
2) [martin8@localhost martin8]$ cat <f1 >fi3 [martin8@localhost martin8]$ cat f1 este es f1 [martin8@localhost martin8]$ cat fi3 este es f1
33
Lo que entra en cat no es del teclado sino del fi1 para luego grabarlo en fi3 3) [martin8@localhost martin8]$ cat <f1 2>/dev/null este es f1 [martin8@localhost martin8]$ cat <f1 f6 2>/dev/null [martin8@localhost martin8]$ cat <f1 f6 2>err [martin8@localhost martin8]$ cat err cat: f6: No existe el fichero o el directorio entra en cat y se muestra por pantalla f1 si huvbiera error se tira a la papelera igual que el anterior pero con dos ficheros, f6 no existe, el error se tira a null igual que el anterior pero el error se lleva a fichero err 4) [martin8@localhost martin8]$ cat f1 f2 >> f3 2>>err [martin8@localhost martin8]$ cat f1 este es f1 [martin8@localhost martin8]$ cat f2 este es f2 [martin8@localhost martin8]$ cat f3 este es f1 este es f2 une dos ficheros f1 y f2 en f3 y si hay errores en err 5) [martin8@localhost martin8]$ cat f1 f10 >> f3 2>>err1 [martin8@localhost martin8]$ cat f1 este es f1 [martin8@localhost martin8]$ cat f10 cat: f10: No existe el fichero o el directorio [martin8@localhost martin8]$ cat f3 este es f1 este es f2 este es f1 [martin8@localhost martin8]$ cat err1 cat: f10: No existe el fichero o el directorio [martin8@localhost martin8]$ 6) Indicar en estas sentencias cual es la entrada, salida y direcion de error mail pepe (entrada teclado, salida pantalla, error pantalla) mail pepe <carta sort <fich >> fich2 2>err cat >nuevofich 2>1
VARIOS COMANDOS EN UNA LINEA -> SEPARADOS POR ; 34
UN COMANDO LARGO EN VARIAS LINEAS \ AL FINAL DE LINEA SIN DEJAR ESPACIO ENTRE ESCRIBIR \ Y DAR A ENTER PIPE O TUBERIAS La ejecución de un comando pasa al siguiente. Es una forma simple y muy util de redireccionar la salida de un comando como entrada de otro. Se utiliza el caracter | cat f1|head -3|wc –w Contar las palabras que tiene las 3 primeras lineas del fichero f1 El contenido del fichero f1 se pasa al comando head que únicamente selecciona las 3 primeras lineas y posteriormenete esas tres lineas son las que recoje el comando wc –w para contar las palabras que tiene. Ejemplo: 1) cat listado|tail -10 -rw-r--r-- 1 martin6 ASI2 0 feb 21 13:34 f3 -rw-r--r-- 1 martin6 ASI2 0 feb 21 13:56 listado -rw-r--r-- 1 martin6 ASI2 16 feb 21 13:51 martin drwxr-xr-x 2 martin6 ASI2 4096 feb 21 13:49 marto drwx------ 2 martin8 users 4096 feb 12 14:03 nsmail drwxr-xr-x 3 martin8 users 4096 ene 31 11:35 pa drwxr-xr-x 4 martin8 users 4096 ene 31 11:36 pu -rw-r--r-- 1 root root 17 feb 19 12:43 stdout -rw-r--r-- 1 martin8 users 0 feb 19 12:15 tty1 -rwxrwxrwx 1 martin6 ASI2 5 feb 21 13:54 vi 2)cat listado|wc -l 37 3) cat listado|more 4)ls -la|more 5) cat listado|sort 6) bash$ cat listado|sort > fich1 bash$ cat fich1|more Es una forma simple y muy util de redireccionar la salida de un comando como entrada de otro. Se utiliza el caracter | 35
Por ejemplo: [martin8@localhost martin8]$ ls|wc -w 16 es lo mismo que: [martin8@localhost martin8]$ ls > num [martin8@localhost martin8]$ wc -w num 16 num [martin8@localhost martin8]$ rm num Ordenar en un fichero el contenido del directorio [martin8@localhost martin8]$ cat num|sort > numord cat: num: No existe el fichero o el directorio [martin8@localhost martin8]$ ls > num [martin8@localhost martin8]$ cat num|sort > numord [martin8@localhost martin8]$ cat num a b datos err err1 f1 f2 f3 fi3 ls.out ls.out1 ls.out3 marto num numord pru pu [martin8@localhost martin8]$ cat numord a b datos err err1 f1 f2 f3 fi3 ls.out ls.out1 ls.out3 marto 36
num numord pru pu Mostrar los tres primeros ficheros ordenados alfabeticamente del directorio [martin8@localhost martin8]$ cat numord|head -3 a b datos Grabar en un fichero llamado tres los tres ultimos ficheros despues de realizar ls. Deseamos que salga por pantalla ordenados en orden inverso a la vez que se hayn grabado en dicho orden en un fichero llamado treso. [martin8@localhost martin8]$ ls|tail -3|tee tres|sort -r|tee treso treso tres pu [martin8@localhost martin8]$ cat tres pu tres treso
TEE Lee la entrada estandar y envia la saliada sin transformar a dos lugares a un fichero especificado salida estandar ls|tee f1|sort la salida del comando ls el comando tee lo recibe y lo graba en el fichero f1 y además lo envía al siguiente comando, en este caso sort
COMODINES * cualquier carácter ¿ un carácter (numero o letra, etc…) blanco o [ ] cualquiera de los caracteres ¡ not ls a* muestra ficheros que comienzan por a rm a?? b?? borra ficheros que empiezan por a o por b y tienen tres letras SOLO 37
rm [abcd]*[xy] borra ficheros que empiezan por cualquiera de las letras a,b,c,d y que terminen por x o y. Entre la letra de principio y final puede haber ninguno o infinitos caracteres. cat [ ¡ab]* muestra ficheros que no comienzan ni por a ni por b rm [A-Z]?[¡b][¡a] Ficheros de 4 letras que empiezan en su primera letra desde la A a la Z. LA segunda letra cualquiera, la tercera no puede ser una b, y la ultima no puede ser una a. 1) ls y ls * [martin8@localhost martin8]$ ls a datos err1 f2 fi10 ls.out ls.out3 num pru tres b err f1 f3 fi3 ls.out1 marto numord pu treso [martin8@localhost martin8]$ ls * a err f1 f3 fi3 ls.out1 num tres b err1 f2 fi10 ls.out ls.out3 numord treso datos: lolo report marto: 1 2 3 pru: a b c d pr pu: 2) [martin8@localhost martin8]$ ls a datos err1 f2 fi10 ls.out ls.out3 num pru tres b err f1 f3 fi3 ls.out1 marto numord pu treso [martin8@localhost martin8]$ ls f* f1 f2 f3 fi10 fi3 3) ? es un caracter y si se deja espacio en blanco es como si fuera un OR [martin8@localhost martin8]$ ls a datos err1 f2 fi10 ls.out ls.out3 num pru tres b err f1 f3 fi3 ls.out1 marto numord pu treso [martin8@localhost martin8]$ ls f? p? f1 f2 f3 pu: pu 38
4) [cualquiera de los caracteres entre corchetes] [martin8@localhost martin8]$ ls a datos err1 f2 fi10 ls.out ls.out3 num pru tres b err f1 f3 fi3 ls.out1 marto numord pu treso [martin8@localhost martin8]$ rm [tn]*[ms] [martin8@localhost martin8]$ ls a datos err1 f2 fi10 ls.out ls.out3 numord pu b err f1 f3 fi3 ls.out1 marto pru treso --> empieze por t o n luego lo que sea y termine por ms 5) ! NOT [martin8@localhost martin8]$ ls a datos err1 f2 fi10 ls.out ls.out3 numord pu b err f1 f3 fi3 ls.out1 marto pru treso [martin8@localhost martin8]$ ls [!lmpted]* a b f1 f2 f3 fi10 fi3 numord 6) [martin8@localhost martin8]$ ls a datos err1 f2 fi10 ls.out ls.out3 numord pu b err f1 f3 fi3 ls.out1 marto pru treso [martin8@localhost martin8]$ ls [f-l]?*[0-9] fi10 fi3 ls.out1 ls.out3 ? UNO OBLIGATORIO * MUCHOS O NINGUNO Para probarlo [martin8@localhost martin8]$ ls a datos err1 f2 f7 fi3 ls.out1 marto pru treso b err f1 f3 fi10 ls.out ls.out3 numord pu [martin8@localhost martin8]$ ls [f-l]?*[0-9] fi10 fi3 ls.out1 ls.out3
COMPARACION FICHEROS cmp Por omision lista el numero de caracter y la lĂnea de diferencia cmp [opciones] archivo1 archivo2 39
martin8@NODE:/home/martin8> cat > comp Este es el fichero comp el 0 martin8@NODE:/home/martin8> cat > comp1 Este es el fichero comp el 1 martin8@NODE:/home/martin8> martin8@NODE:/home/martin8> cmp comp comp1 comp comp1 differ: char 28, line 2 cmp [opciones] archivo1 archivo2 diff Muestra la diferencia entre dos ficheros. Si son iguales no muestra nada si son distintos mostrarรก la diferencia. martin8@NODE:/home/martin8> diff comp comp1 2c2 < el 0 --> el 1 [martin8@localhost martin8]$ touch a [martin8@localhost martin8]$ touch b [martin8@localhost martin8]$ diff a b [martin8@localhost martin8]$ cat >a hola [martin8@localhost martin8]$ cat>b hola [martin8@localhost martin8]$ diff a b [martin8@localhost martin8]$ cat>>a martin [martin8@localhost martin8]$ diff a b 2d1 < martin [martin8@localhost martin8]$ cat >b hola mart in [martin8@localhost martin8]$ diff a b 2c2 < martin --> mart in
40
DIRCMP (EN LINUX NO EXISTE) Salida con dos seccones: Archivos presentes en uno solo de los directorios Archivos del mismo nombre en los dos directorios indicando si coinciden o no
ALIAS Alias nos indica los alias creados en el sistema. Para crear un alias: alias nombre del alias='(y entre comillas simples el comando)' posteriormente al ejecutar el alias se ejecuta los comandos que hayamos realizado. Por ejemplo: [martin8@localhost martin8]$ alias ls1='ls ;pwd' [martin8@localhost martin8]$ alias alias l.='ls .[a-zA-Z]* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias ls1='ls ;pwd' [martin8@localhost martin8]$ ls1 a b datos fich marto pu /home/martin8
FICHEROS INODE Un inode es la estructura de datos en disco que desribe y almacena los atributos del fichero y su localización. Cuando el disco se inicializa para aceptar ficheros se crean un número específico de inodes. El número de inodes determina el número máximo de ficheros que puede haber en el disco. Existe un inode para cada 2 a 8 KBytes. Cada inode tiene un numero distinto y cada fichero tiene su inode. Por tanto cuando se crea un fichero un inode se le asigna a el y este es unico. La información que se guarda en un inode es: Propietario y grupo Tipo de fichero Permisos Fecha de creación acceso y modificación 41
Número de links al fichero Tamaño del fichero Direcciones del disco donde se situa el fichero Los inodes guardan toda la información del fichero excepto su localización en el directorio y su nombre. TIPOS DE FICHEROS: En UNIX todo es un fichero. incluso los dispositivos. Existen deistintos tipos de ficheros: 1. Ficheros regulares Contienen datos y corresponden a ficheros normales. Texto Binarios Scripts ejecutables Disponen de un - (ls -la) 2. Directorios Un directorio es un fichero binario que contiene una lista de los ficheros que contiene. En cada directorio existe una pareja de nombre de fichero e inodo. de esta manera es en la que se asocian el inode y la localización y nombre del fichero. Por este motivo cuando se quiere realizar un contenido de un directorio sin propiedades no es necesario acceder al directorio pero si deseamos ver sus propiedades si. (ls Vv Ls-s) ls -s para acceder a su tamaño por ejemplo debo acceder al inode que es donde se guarda ese tipo de información. Y para ver el inde debo accedr al directorio. 3. FICHEROS ESPECIALES Los ficheros especiales son el mecanismo por el que UNIX se comunica con la entrada y salida. Se encuentran en el directorio /dev y corresponden a dispositivos de entrada/salida 4. LINKS Un link es un mecanismo que permite referirse con distinto nombre de fichero a un mismo fichero en disco. Existen dos tipos de links: hard link: (duro) Asocian uno o mas nombre de fichero con el mismo inode. ln index hlink : crea un link con nombre hlink con el mismo inode que el fichero index index -- 3 hlink --- 3 42
soft link: (blando) Asocia un nombre a un nuevo inode que indica la posición en disco donde se guarda la información del path donde esta el fichero. ln -s index slink Asocia al nombre slink un nuevo inode. Este inode indica la posición en disco donde se guarda el path completo del fichero index. index -- 3 slink -- 4 LOS DOS PERMITEN VISUALIZAR EL CONTENIDO DE INDEX UTILIZANDO LOS NOMBRE DE hlink e slink PERO EXISTEN DIFERENCIAS EN LA ESTRUCTURA INTERNA. 5. SOCKETS Ficheros especiales para comunicaciones entre procesos dentro de la propia máquina o entre máquinas distintas utilizando TCP/IP. Se abre el socket, lee o escribe...como si fueran ficheros.En lugar de salida escribirlo a un fichero y enviarlo se envia directamente or comunicaciones, más rápido. 6. PIPES Ficheros de comunicaciones entre procesos de la misma máquina. IDENTIFICACIÓN DE LOS DIVERSOS TIPOS DE FICHEROS ls -l identifica los diversos tipos de ficheros que existen en UNIX - ficheros regulares d directorio l link simbolico d dispositivo s socket p pipe martin8@NODE:/home/martin8> ls -l total 24 -rw-r--r-- 2 martin8 users 24 Feb 25 10:46 hlink -rw-r--r-- 1 martin8 users 33 Feb 25 11:04 index -rw-r--r-- 1 martin8 users 20 Feb 23 02:35 l? drwxr-xr-x 2 martin6 ASI2 4096 Feb 21 13:49 marto/ drwxr-xr-x 3 martin8 users 4096 Feb 25 11:02 seg/ lrwxrwxrwx 1 martin8 users 5 Feb 25 10:56 slink -> index -rwxrwxrwx 1 martin8 users 14 Feb 22 18:50 treso* 43
FILE EL COMANDO FILE identifica el tipo de fichero file * martin8@NODE:/home/martin8> file * hlink: ASCII text index: ASCII text lรง: ASCII text marto: directory seg: directory slink: symbolic link to index treso: ASCII text
LINKS LN Existen dos tipos de links: hard link: (duro) ln index hlink : crea un link con nombre hlink con el mismo inode que el fichero index soft link: (blando) ln -s index slink LOS DOS PERMITEN VISUALIZAR EL CONTENIDO DE INDEX UTILIZANDO LOS NOMBRE DE hlink e slink PERO EXISTEN DIFERENCIAS EN LA ESTRUCTURA INTERNA. CASOS Y DIFERENCIA DE LINKS: 1) Si no ocurre nada, ambos link visualizan el fichero index martin8@NODE:/home/martin8> cat > index Este es index de Martin martin8@NODE:/home/martin8> cat index Este es index de Martin martin8@NODE:/home/martin8> ls -li total 20 36409 -rw-r--r-- 1 martin8 users 24 Feb 25 10:46 index 36408 -rw-r--r-- 1 martin8 users 20 Feb 23 02:35 l? 3924 drwxr-xr-x 2 martin6 ASI2 4096 Feb 21 13:49 marto/ 3934 drwxr-xr-x 3 martin8 users 4096 Feb 23 02:05 seg/ 36545 -rwxrwxrwx 1 martin8 users 14 Feb 22 18:50 treso* 44
martin8@NODE:/home/martin8> ln index hlink martin8@NODE:/home/martin8> ls -li index *link 36409 -rw-r--r-- 2 martin8 users 24 Feb 25 10:46 hlink 36409 -rw-r--r-- 2 martin8 users 24 Feb 25 10:46 index martin8@NODE:/home/martin8> ln -s index slink martin8@NODE:/home/martin8> ls -li index *link 36409 -rw-r--r-- 2 martin8 users 24 Feb 25 10:46 hlink 36409 -rw-r--r-- 2 martin8 users 24 Feb 25 10:46 index 36435 lrwxrwxrwx 1 martin8 users 5 Feb 25 10:56 slink -> index Si mostramos hlink o slink se muestra el mismo contenido martin8@NODE:/home/martin8> cat slink Este es index de Martin martin8@NODE:/home/martin8> cat hlink Este es index de Martin 2) Si se mueve index que significa solo aĂąadir una nueva entrada en el nuevo directorio y borrarla del antiguo no se afecta el hardlink pues el inode del fichero es el mismo. Por el contrario softlink apunta a lago que no existe pues ya no estĂĄ en el mismo directorio. Lo mismo ocurre si se borra el fichero index. martin8@NODE:/home/martin8> mv index seg/ martin8@NODE:/home/martin8> ls -l total 20 -rw-r--r-- 2 martin8 users 24 Feb 25 10:46 hlink -rw-r--r-- 1 martin8 users 20 Feb 23 02:35 l? drwxr-xr-x 2 martin6 ASI2 4096 Feb 21 13:49 marto/ drwxr-xr-x 3 martin8 users 4096 Feb 25 11:02 seg/ lrwxrwxrwx 1 martin8 users 5 Feb 25 10:56 slink -> index -rwxrwxrwx 1 martin8 users 14 Feb 22 18:50 treso* Ya hemos movido el fichero index al directorio seg. Vamos a intentar visualizar: martin8@NODE:/home/martin8> cat hlink Este es index de Martin martin8@NODE:/home/martin8> cat slink cat: slink: No such file or directory 3)Si creamos un nuevo index, que ocurre??? martin8@NODE:/home/martin8> cat > index Este es el nuevo index de Martin martin8@NODE:/home/martin8> cat hlink Este es index de Martin martin8@NODE:/home/martin8> cat slink Este es el nuevo index de Martin
45
Por tanto slink nos va a permitir siempre tener la versión actualizada de un fichero. Un hardlink nos va a obtener el original y va a evitar el que si se elimina por accidente podamos acceder por hlink de nuevo.
CUT Este comando permite cortar una secuencia de caracteres de un archivo. Cut –f1 agenda Imprime la primera columna del archivo. Tambien es posible seleccionar varias columnas: Cut –f1,3 agenda Obtiene los campos 1 y 3 de agenda. Si se quiere empler otro delimitador de campos que no sea el tabulador es preciso indicarlo con –d seguida del nuevo delimitador Cut –d : -f1,3 agenda Por ejemplo: [martin@martin martin]$ cat pr Hola me llamo Martin y tu como te llamas? voy a probar cut [martin@martin martin]$ cut -d ' ' -f2 pr [HACEMOS EL BLANCO COMO CAMPO] me tu a
TR Traducir un carácter por otros. Tr abc ABC < lista [martin@martin martin]$ cat pr Hola me llamo Martin y tu como te llamas? voy a probar cut [martin@martin martin]$ tr me ME < pr Hola ME llaMo Martin y tu coMo tE llaMas? voy a probar cut 46
Cambiará los caracteres a, b y c del archivo lista por sus correspondientes letras mayusculas. SE SUELE EMPLEAR PARA CAMBIAR EL SEPARADOR DE CAMPOS EN FICHEROS Tr : ‘<TAB>’ < datos Tengo que situar el TAB entre comillas para evitar que el interprete crea que es un espacio. En Linux por ejemplo el tabulador se representa como /t [martin@martin martin]$ tr ' ' '\t' < pr Hola me llamo Martin y tu como te llamas? voy a probar cut
COMPRESIÓN DE FICHEROS EN UNIX Existen dos formas de compresión en los ficheros UNIX:
compress, uncompress (1/5) gzip, gunzip
compress, uncompress [martin8@localhost martin8]$ cat pruebagrep hola voy a probar a ver si me dice en que lugares aparece la letra a el comando grep y este no tiene la letra est line no tiene :-) [martin8@localhost martin8]$ compress pruebagrep [martin8@localhost martin8]$ ls a datos err1 f2 f7 fi3 ls.out1 marto pru pu b err f1 f3 fi10 ls.out ls.out3 numord pruebagrep.Z treso Si intento visualizar el fichero comprimido no puedo, pero existe la sentencia zcat que lo permite [martin8@localhost martin8]$ cat pruebagrep.Z hÞ° ÂΛ<‘óFL 9 Ø) qN mÊ€ “fŒÆ2n@Ä©£‘M 3ËÌ ¡ ”Y†Ž ‚a ”a bÌ›6aÜ•y ⌜2pX"TIG£tÒ€,I MÍ›,™ÊLãÆ)T©]Aèh‘B [martin8@localhost martin8]$ [martin8@localhost martin8]$ zcat pruebagrep.Z hola voy a probar a ver si me dice en que lugares aparece la letra a el comando grep y este no tiene la letra est line no tiene :-) 47
IMPORTANTE AL COMPRIMIR ELIMINA EL ORIGINAL Y CREA EL COMPRIMIDO. AL DESCOMPRIMIR ELIMINA EL COMPRIMIDO Y CREA EL ORIGINAL. [martin8@localhost martin8]$ ls a datos err1 f2 f7 fi3 ls.out1 marto pru pu b err f1 f3 fi10 ls.out ls.out3 numord pruebagrep.Z treso [martin8@localhost martin8]$ uncompress pru pru pruebagrep.Z [martin8@localhost martin8]$ uncompress pruebagrep.Z [martin8@localhost martin8]$ ls a datos err1 f2 f7 fi3 ls.out1 marto pru pu b err f1 f3 fi10 ls.out ls.out3 numord pruebagrep treso Podemos visualizarlo en tuberias: [martin8@localhost martin8]$ zcat pruebagrep.Z|head -1 hola voy a probar a Lo que no podria realizar es utilizar el cat.
gzip Compresi贸n de GNU, genera ficheros en lugar de .Z .gz. Con zcat se puede visualizar tambi茅n. [martin8@localhost martin8]$ gzip pruebagrep [martin8@localhost martin8]$ ls a datos err1 f2 f7 fi3 ls.out1 marto pru pu b err f1 f3 fi10 ls.out ls.out3 numord pruebagrep.gz treso Descomprimirlo: [martin8@localhost martin8]$ gunzip pruebagrep.gz [martin8@localhost martin8]$ ls a datos err1 f2 f7 fi3 ls.out1 marto pru pu b err f1 f3 fi10 ls.out ls.out3 numord pruebagrep treso Tarea: probar cual comprime mas un fichero. [martin8@localhost martin8]$ ls -laR > co [martin8@localhost martin8]$ ls -l co -rw-r--r-- 1 martin8 users 2870649 feb 22 20:00 co [martin8@localhost martin8]$ compress co [martin8@localhost martin8]$ ls -l co* -rw-r--r-- 1 martin8 users 62277 feb 22 20:00 co.Z [martin8@localhost martin8]$ gzip co 48
[martin8@localhost martin8]$ ls -l co* -rw-r--r-- 1 martin8 users 13682 feb 22 20:00 co.gz
VI EDITOR DE TEXTO vi fichero a -- para empezar a escribir Al pulsar aparece en la parte inferior : --INSERT
cuando quiero terminar de escribir ESC :wq 2) vi fichero --> vuelve a abrir el fichero a -- escribir escribir varias lineas: ESC -- pasar a comando --> probar desplazamientos (h, l, j, k, etc).
49
MODOS O PERMISOS rwx rwx rwx USUARIO, GRUPO, OTROS Fichero: r permite leer el contenido w permite modificar o eliminar X permite ejecutar el fichero (programas o shell script) Directorio: r permite listar su contenido w permite crear ficheros y directorios dentro y eliminarlos (requiere X) x permite hacer cd al directorio 2 modos de cambiar permisos: SIMBÓLICO uno o mas de u g o a
+
+ añade - elimina = asigna
+
uno o más de r w x
chmod ug+w f1 chmod a+r f1 chmod g-x f1 chmod –R a+r * cambia los permisos de forma recursiva a TODOS lo que contiene el directorio actual.
OCTAL r w x
4 2 1
chmod 764 f1 7 Permisos de usuario 6 permisos de grupo 4 permisos de otros Permisos especiales 50
SUID,SGID Asigna permisos del propietario y grupo durante la ejecución. Cuando el fichero se ejecuta hace que el usuario que ejecuta el programa adquiera los privilegios del propietario chmod u+s f1 (SUID) chmod g+s f1 (SGID) Por ejemplo el comando passwd which passwd cd /usr/bin/passwd ls –la passwd STICKY BIT Cuando un directorio tiene este permiso un usuario solo puede borrar los ficheros que sean de ese usuario y no de otros. Ejemplo : Directorio /tmp cd /tmp (Se asignaria chmod u+t) ls –l /tmp umask Establece permisos por defecto al crear ficheros o directorios. 777-permisos que quiero asignar (p. ejemplo 754) = 023 umask 023 lo que hace es crear permisos por defecto de 754 rwxr-x-r— CUIDADO: 666 para ficheros 777 para directorios PERMISOS NECESARIOS Comando cd ls mkdir rmdir cat mv cp rm
Directorio origen r xw xw x xw x ww
Fichero origen Directorio destino x
r r
xw xw 51
ln
x
xw
CAMBIO DE PROPIETARIO Y GRUPO chown usdai1 f1 cambia el propietario al fichero f1 por usdai1 chown usdai1:staff cambia el usuario y grupo al fichero f1 chgrp staff f1 cambia el grupo al fichero f1 por staff Se puede cambiar de grupo actual con newgrp
EJERCICIO PERMISOS EJERCICI0 PERMISOS Crear el arbol de directorios [martin8@localhost martin8]$ mkdir datos [martin8@localhost martin8]$ mkdir datos/report [martin8@localhost martin8]$ mkdir datos/report/informes [martin8@localhost martin8]$ touch datos/report/informes/datos.junio [martin8@localhost martin8]$ touch datos/datos.enero [martin8@localhost martin8]$ ls datos Cambiar los permisos a los adecuados: [martin8@localhost martin8]$ ls -l total 12 drwxr-xr-x 3 martin8 users 4096 feb 22 13:59 datos Permisos de directorio datos: [martin8@localhost martin8]$ chmod 755 datos [martin8@localhost martin8]$ ls -l total 12 drwxr-xr-x 3 martin8 users 4096 feb 22 13:59 datos drwxr-xr-x 2 martin6 ASI2 4096 feb 21 13:49 marto drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 pu Permisos del directorio datos.enero [martin8@localhost martin8]$ cd datos [martin8@localhost datos]$ ls -la total 12 drwxr-xr-x 3 martin8 users 4096 feb 22 13:59 . drwxrwxrwx 12 martin8 users 4096 feb 22 13:59 .. -rw-r--r-- 1 martin8 users 0 feb 22 13:59 datos.enero drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 report [martin8@localhost datos]$ chmod 664 datos.enero 52
[martin8@localhost datos]$ ls -la total 12 drwxr-xr-x 3 martin8 users 4096 feb 22 13:59 . drwxrwxrwx 12 martin8 users 4096 feb 22 13:59 .. -rw-rw-r-- 1 martin8 users 0 feb 22 13:59 datos.enero drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 report 1) Se ha creado el usuario juan useadd -g users -p notocar juan se ha realizado login con el usuario juan y se ha probado: login: juan Password: bienvenido caraculo [juan@localhost juan]$ id uid=2005(juan) gid=100(users) groups=100(users) [juan@localhost juan]$ cd [juan@localhost juan]$ pwd /home/juan [juan@localhost juan]$ cd /home/martin8 [juan@localhost martin8]$ ls datos marto pu [juan@localhost martin8]$ cd datos [juan@localhost datos]$ ls datos.enero report [juan@localhost datos]$ cat >>datos.enero juan lo ha modificado[juan@localhost datos]$ ls datos.enero report [juan@localhost datos]$ cat datos.enero juan lo ha modificado[juan@localhost datos]$ EJEMPLO DE COMO MODIFICANDO SUS PERMISOS ROOT PUEDE HACER TODO [juan@localhost datos]$ cat datos.enero juan lo ha modificado[juan@localhost datos]$ su root Password: [root@localhost datos]# ls datos.enero report [root@localhost datos]# cat >>datos.enero [root@localhost datos]# chmod 000 datos.enero [root@localhost datos]# ls -l total 8 ---------- 1 martin8 users 21 feb 22 14:13 datos.enero drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 report [root@localhost datos]# cat >> datos.enero y root TODO[root@localhost datos]# cat datos.enero juan lo ha modificadoy root TODO[root@localhost datos]# 2) 53
Cabio de permisos DATOS [martin8@localhost martin8]$ ls -l total 12 drwxr-xr-x 3 martin8 users 4096 feb 22 13:59 datos drwxr-xr-x 2 martin6 ASI2 4096 feb 21 13:49 marto drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 pu [martin8@localhost martin8]$ chmod 775 datos [martin8@localhost martin8]$ ls -l total 12 drwxrwxr-x 3 martin8 users 4096 feb 22 13:59 datos REPORT [martin8@localhost datos]$ ls -l total 8 ---------- 1 martin8 users 32 feb 22 14:15 datos.enero drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 report [martin8@localhost datos]$ chmod 765 report [martin8@localhost datos]$ ls -l total 8 ---------- 1 martin8 users 32 feb 22 14:15 datos.enero drwxrw-r-x 3 martin8 users 4096 feb 22 13:57 report INFORMES [martin8@localhost report]$ ls -l total 4 drwxr-xr-x 2 martin8 users 4096 feb 22 13:58 informes [martin8@localhost report]$ chmod 775 informes [martin8@localhost report]$ ls -l total 4 drwxrwxr-x 2 martin8 users 4096 feb 22 13:58 informes DATOS.JUNIO [martin8@localhost informes]$ ls -l total 0 -rw-r--r-- 1 martin8 users 0 feb 22 13:58 datos.junio [martin8@localhost informes]$ chmod 664 datos.junio [martin8@localhost informes]$ ls -l total 0 -rw-rw-r-- 1 martin8 users 0 feb 22 13:58 datos.junio SOLUCION [juan@localhost datos]$ whoami juan [juan@localhost datos]$ pwd 54
/home/martin8/datos [juan@localhost datos]$ cd report bash: report: Permiso denegado 3) Cambiar permisos DATOS [martin8@localhost martin8]$ ls -l total 12 drwxrwxr-x 3 martin8 users 4096 feb 22 13:59 datos [martin8@localhost martin8]$ chmod 755 datos [martin8@localhost martin8]$ ls -l total 12 drwxr-xr-x 3 martin8 users 4096 feb 22 13:59 datos datos.enero [martin8@localhost datos]$ ls -l total 8 ---------- 1 martin8 users 32 feb 22 14:15 datos.enero drwxrw-r-x 3 martin8 users 4096 feb 22 13:57 report [martin8@localhost datos]$ chmod 600 datos.enero [martin8@localhost datos]$ ls -l total 8 -rw------- 1 martin8 users 32 feb 22 14:15 datos.enero drwxrw-r-x 3 martin8 users 4096 feb 22 13:57 report datos/report drwxrw-r-x 3 martin8 users 4096 feb 22 13:57 report [martin8@localhost datos]$ chmod 755 report [martin8@localhost datos]$ ls -l total 8 -rw------- 1 martin8 users 32 feb 22 14:15 datos.enero drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 report SOLUCION [juan@localhost datos]$ ls datos.enero report [juan@localhost datos]$ cp datos.enero /home/juan cp: datos.enero: Permiso denegado 5) Cambiar permisos DATOS [martin8@localhost martin8]$ ls -l total 12 drwxr-xr-x 3 martin8 users 4096 feb 22 13:59 datos drwxr-xr-x 2 martin6 ASI2 4096 feb 21 13:49 marto 55
drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 pu [martin8@localhost martin8]$ chmod 775 datos [martin8@localhost martin8]$ ls -l total 12 drwxrwxr-x 3 martin8 users 4096 feb 22 13:59 datos Cambiar permisos datos.enero [martin8@localhost datos]$ ls -l total 8 -rw------- 1 martin8 users 32 feb 22 14:15 datos.enero drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 report [martin8@localhost datos]$ chmod 400 datos.enero [martin8@localhost datos]$ ls -l total 8 -r-------- 1 martin8 users 32 feb 22 14:15 datos.enero drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 report SOLUCION [juan@localhost datos]$ ls -l total 8 -r-------- 1 martin8 users 32 feb 22 14:15 datos.enero drwxr-xr-x 3 martin8 users 4096 feb 22 13:57 report [juan@localhost datos]$ rm -f datos.enero [juan@localhost datos]$ ls report PROPIEDAD DE LOS PERMISOS 1) Cambiar la propiedad de un fichero: (antes era de root y ahora de martin6) [root@localhost pru]# ls -l total 0 -rw-r--r-- 1 root root 0 feb 22 17:52 a -rw-r--r-- 1 root root 0 feb 22 17:53 b -rw-r--r-- 1 root root 0 feb 22 17:53 c -rw-r--r-- 1 root root 0 feb 22 17:53 d [root@localhost pru]# chown martin6 a [root@localhost pru]# ls -l total 0 -rw-r--r-- 1 martin6 root 0 feb 22 17:52 a -rw-r--r-- 1 root root 0 feb 22 17:53 b -rw-r--r-- 1 root root 0 feb 22 17:53 c -rw-r--r-- 1 root root 0 feb 22 17:53 d 2) Cambiar la propieda y el grupo de un fichero [root@localhost pru]# ls -l total 0 -rw-r--r-- 1 root root -rw-r--r-- 1 root root
0 feb 22 17:52 a 0 feb 22 17:53 b 56
-rw-r--r-- 1 root root 0 feb 22 17:53 c -rw-r--r-- 1 root root 0 feb 22 17:53 d [root@localhost pru]# chown martin6 a [root@localhost pru]# ls -l total 0 -rw-r--r-- 1 martin6 root 0 feb 22 17:52 a -rw-r--r-- 1 root root 0 feb 22 17:53 b -rw-r--r-- 1 root root 0 feb 22 17:53 c -rw-r--r-- 1 root root 0 feb 22 17:53 d [root@localhost pru]# chown martin8:users b [root@localhost pru]# ls-l bash: ls-l: command not found [root@localhost pru]# ls -l total 0 -rw-r--r-- 1 martin6 root 0 feb 22 17:52 a -rw-r--r-- 1 martin8 users 0 feb 22 17:53 b -rw-r--r-- 1 root root 0 feb 22 17:53 c -rw-r--r-- 1 root root 0 feb 22 17:53 d 3) Cambiar el grupo de un fichero [root@localhost pru]# ls -l total 0 -rw-r--r-- 1 martin6 root 0 feb 22 17:52 a -rw-r--r-- 1 martin8 users 0 feb 22 17:53 b -rw-r--r-- 1 root root 0 feb 22 17:53 c -rw-r--r-- 1 root root 0 feb 22 17:53 d [root@localhost pru]# chgrp users d [root@localhost pru]# ls -l total 0 -rw-r--r-- 1 martin6 root 0 feb 22 17:52 a -rw-r--r-- 1 martin8 users 0 feb 22 17:53 b -rw-r--r-- 1 root root 0 feb 22 17:53 c -rw-r--r-- 1 root users 0 feb 22 17:53 d 4) De forma recursiva todo un directorio [root@localhost martin8]# chown -R root pru [root@localhost martin8]# cd pru [root@localhost pru]# ls -l total 0 -rw-r--r-- 1 root root 0 feb 22 17:52 a -rw-r--r-- 1 root users 0 feb 22 17:53 b -rw-r--r-- 1 root root 0 feb 22 17:53 c -rw-r--r-- 1 root users 0 feb 22 17:53 d 5) Cambiar propietarios y grupos de todos los ficheros [root@localhost pru]# chown -R root:users ../pru [root@localhost pru]# ls -l total 0 -rw-r--r-- 1 root users 0 feb 22 17:52 a 57
-rw-r--r-- 1 root -rw-r--r-- 1 root -rw-r--r-- 1 root
users users users
0 feb 22 17:53 b 0 feb 22 17:53 c 0 feb 22 17:53 d
6) Con subdirectorios incluidos chown -R martin8:users ../pru [root@localhost pru]# ls -la total 12 drwxr-xr-x 3 martin8 users 4096 feb 22 18:00 . drwxrwxrwx 13 martin8 users 4096 feb 22 17:52 .. -rw-r--r-- 1 martin8 users 0 feb 22 17:52 a -rw-r--r-- 1 martin8 users 0 feb 22 17:53 b -rw-r--r-- 1 martin8 users 0 feb 22 17:53 c -rw-r--r-- 1 martin8 users 0 feb 22 17:53 d drwxr-xr-x 2 martin8 users 4096 feb 22 18:00 pr [root@localhost pru]# cd pr [root@localhost pr]# ls -l total 0 -rw-r--r-- 1 martin8 users
0 feb 22 18:00 a
COMUNICACION CON USUARIOS WRITE write <username> [tty] bash$ whoami martin6 bash$ write martin8 nos vemos en el jamaicano Message from martin6@localhost.localdomain on pts/1 at 13:18 ... nos vemos en el jamaicano EOF Si hubiera un usuario conectado a varios terminales habria que especificar por cual sacar el mensaje. Realizarlo mediante el comando who. el usuario puede estar en un host distinto tty se usa cuando un usuario ha realizado varios logins para identificar una de sus terminales Al escribir el mensaje pulsar CTRL+D para terminar
GREP
58
Este comando busca un patrón en ficheros y muestra la línea en la que aparece el patrón. Es preferible poner la opción a buscar entre comillas. Por ejemplo para buscar las líneas en las que aparece la cadena 'a' en el fichero pruebagrep [martin8@localhost martin8]$ cat pruebagrep hola voy a probar a ver si me dice en que lugares aparece la letra a el comando grep y este no tiene la letra est line no tiene :-) [martin8@localhost martin8]$ grep 'letra' pruebagrep aparece la letra a y este no tiene la letra MODIFICADORES -c --> nº de veces que aparece -i --> ignora mayusculas y minusculas -l --> muestra el nombre del fichero -n --> indica el numero de linea -v --> muestra las lineas en las que no aparece Ejemplos: -i (ignorar mayusculas) [martin8@localhost martin8]$ grep -i 'LETRA' pruebagrep aparece la letra a y este no tiene la letra [martin8@localhost martin8]$ grep 'LETRA' pruebagrep [martin8@localhost martin8]$ -c (numero de lineas en las que aparece) [martin8@localhost martin8]$ grep -i -c 'LETRA' pruebagrep 2 -n (indica el numero de linea) [martin8@localhost martin8]$ grep -i -n 'LETRA' pruebagrep 3:aparece la letra a 5:y este no tiene la letra [martin8@localhost martin8]$ -v (muestra las lineas en las que no aparece) [martin8@localhost martin8]$ grep -i -v -n 'LETRA' pruebagrep 1:hola voy a probar a 2:ver si me dice en que lugares 59
4:el comando grep 6:est line no tiene :-) -l (muestra ficheros) [martin8@localhost martin8]$ grep -l "Martin" * 2>err hlink index l lรง slink [martin8@localhost martin8]$ cat index Este es el nuevo index de Martin [root@localhost martin8]# grep -l "Hola" * grep: basura: Es un directorio grep: marto: Es un directorio prueba2 grep: seg: Es un directorio [root@localhost martin8]# cat index Este es el nuevo index de Martin [root@localhost martin8]# cat hlink Este es index de Martin [root@localhost martin8]# grep in* * grep: basura: Es un directorio hlink:Este es index de Martin index:Este es el nuevo index de Martin lolo:index grep: marto: Es un directorio grep: seg: Es un directorio slink:Este es el nuevo index de Martin [root@localhost martin8]# grep -l in* * grep: basura: Es un directorio hlink index lolo grep: marto: Es un directorio grep: seg: Es un directorio slink -cv --> indica la linea donde no aparece [root@localhost martin8]# cat >prueba2 Hola soy Chiquito como estan ustedes? :-) [root@localhost martin8]# grep "soy" prueba2 Hola soy Chiquito [root@localhost martin8]# grep -cv "soy" prueba2 2 60
^ -- al comienzo de una linea [root@localhost martin8]# grep ^Hola prueba2 Hola soy Chiquito [root@localhost martin8]# grep ^Ho prueba2 Hola soy Chiquito [root@localhost martin8]# grep ^o prueba2 [root@localhost martin8]# grep ^co prueba2 como estan ustedes? [root@localhost martin8]# cat dicho Cada fracaso enseña al hombre algo que debería haber aprendido. El unico hombre que nunca se equivoca es el que nunca hace nada [root@localhost martin8]# grep ^a dicho algo que aprendido. [aeiou] -- uno de los caracteres [root@localhost martin8]# grep qu[aeiou] dicho algo que que nunca se equivoca es el que nunca que/qua/qui/quo/quu [root@localhost martin8]# grep equ[aeiou] dicho que nunca se equivoca es CUIDADO porque es una letra o varias --> equivoca [martin8@localhost martin8]$ who|grep "martin8" martin8 pts/0 Feb 22 18:19 martin8 pts/1 Feb 22 19:43 [martin8@localhost martin8]$ who|grep "martin8"|wc -l 2 Busca el patrón donde el “punto” es una letra (como la ¿) [root@martin /root]# grep ".a.t.." prueba 61
Martin va a probar algo $ ď&#x192; FINAL DE LA LINEA [root@martin /root]# cat > prueba Martin va a probar algo mucho cuidado [root@martin /root]# cat prueba Martin va a probar algo mucho cuidado [root@martin /root]# cat prueba Martin va a probar algo mucho cuidado [root@martin /root]# grep 'Martin'$ prueba [root@martin /root]# grep 'o'$ prueba Martin va a probar algo mucho cuidado [root@martin /root]# grep 'algo'$ prueba Martin va a probar algo [martin@martin martin]$ cat pr Hola me llamo Martin y tu como te llamas? voy a probar cut [martin@martin martin]$ grep 'MARTIN'$ pr [root@martin /root]# cat prueba Martin va a probar algo mucho cuidado [root@martin /root]# grep 'Martin'$ prueba [root@martin /root]# grep 'o'$ prueba Martin va a probar algo mucho cuidado [root@martin /root]# grep 'algo'$ prueba Martin va a probar algo
EJEMPLOS CON PIPE y GREP Procesos que estĂĄ ejecutando martin8 [martin8@localhost martin8]$ ps -fe|grep martin8 root 1754 1753 0 18:18 pts/0 00:00:00 login -- martin8 martin8 1755 1754 0 18:19 pts/0 00:00:01 -bash martin8 2039 1755 0 19:39 pts/0 00:00:00 ps -fe martin8 2040 1755 0 19:39 pts/0 00:00:00 grep martin8 personas que jueguen al Doom:
62
[martin8@localhost martin8]$ ps -fe|grep "[Dd]oom"|awk '{print $1}' [martin8@localhost martin8]$ Que sesiones tiene abiertas martin8 [martin8@localhost martin8]$ who root tty1 Feb 22 12:32 martin8 pts/0 Feb 22 18:19 martin8 pts/1 Feb 22 19:43 martin6 pts/2 Feb 22 19:44 [martin8@localhost martin8]$ who|grep "martin8" martin8 pts/0 Feb 22 18:19 martin8 pts/1 Feb 22 19:43 多Cuantas? [martin8@localhost martin8]$ who|grep "martin8" martin8 pts/0 Feb 22 18:19 martin8 pts/1 Feb 22 19:43 [martin8@localhost martin8]$ who|grep "martin8"|wc -l 2
BANNER [martin8@localhost martin8]$ /usr/games/banner -w19 hola # ############# # ## ####### ### ####### # # ##### # ############# # #### ## # # #######
FIND Este comando busca ficheros que tienen ciertas caracteristicas que se especifican. La sintaxis es la siguiente: 63
find directorio criterios-acciones Opciones -size n ficheros con tama単o n bloques (512 bytes) -type c tipo de fichero f=regular d=directorio -name nombre fichero de nombre -perm p ficheros con permisos p -user str ficheros del usuario usr -group gp ficheros del grupo gp Ejemplos: find . -name "core" find / -name "core" -type f Sintaxis de las opciones es variada: -size +100 tama単o mayor de 50 K (100*512=51200/1024=50K) -name '*.dat' todos los ficheros.dat ejemplo: [martin8@localhost martin8]$ ls a co.gz err f1 f3 fi10 ls.out ls.out3 numord pruebagrep treso b datos err1 f2 f7 fi3 ls.out1 marto pru pu [martin8@localhost martin8]$ find . -name '*.out' ./ls.out [martin8@localhost martin8]$ find . -name "*.out" ./ls.out [martin8@localhost martin8]$ SE PUEDEN AGRUPAR CONDICIONES AND POR DEFECTO -atime +60 -mtime +120 SE PUEDEN AGRUPAR POR OR \(-atime +7 -o -mtime +30\) CUIDADO BARRA Y PARENTESIS JUNTOS NEGACION DE UNA CONDICION CON !. Comando que busca ficheros .dat ecepto gold.dat ! -name gold.dat -name *.dat
64
ACCIONES Permiten al comando fin ejecutar ciertos comandos sobre los ficheros que se han encontrado. -print -- muestra el path del fichero (por defecto) -exec cmd -- ejecuta el comando cmd -ok cmd pregunta antes de ejecutar el comando LOS COMANDOS CON -exec, -ok deben terminar en \; LA FORMA {} SE USA PARA DETERMINAR LA POSICION DEL ARGUMENTO, ES DECIR LA SALIDA DEL COMANDO FIND. -exec rm -f {}\; borra todos los ficheros que encuentre en la búsqueda (sin confirmacion) Copiar todo lo que encuentre en pepe -exec cp {} pepe\; Copia los ficheros con nombre core de tipo fichero en el directorio pablo. find . -name core -type f -exec cp {} pablo \; Copia el fichero paco sobre lo que encuentres sin confirmacion find . name core -type f -exec cp paco {}\; Buscar los ficheros con extensión .c a partir del directorio actual find . -name *.c -print Buscar los ficheros core y borrarlos unicamente los ficheros ya que existen directorios llamados también core. find . -name core -type f -exec rm -f {}\; Buscar los ficheros de mas de 1Mb que no se hayn modificado desde hace 1 mes. Estos ficheros son candidatos posteriormente a eliminarlos. find / -size +2048 -mtime +30 -exec ls -l {}\; si un bloque son 0,5 pues 1 MB son 1024*2 = 2048 TRUCO DE BLOQUES: Pasar a kb Multiplicar por 2 Borrar ficheros que no sirven y se van quedando en el sistema. find . \(-name a.out -o -name core -o -name '*~' \ 65
-o -name '.*~'\) -type f -exec rm -f {} \; Buscar ficheros con permisos especiales SUID, SGID find / \( -perm -2000 -o -perm -4000 \) -print Mover los ficheros de .c del directorio martin8/1 al martin8/2 find 1 -name *.c -exec mv {} 2 \; Cambiar de nombre a los ficheros del directorio martin8 que empiezen por f y sean de dos letras y a単adirles la extension .txt find martin8 -name 'f?' -type f -exec mv {} {}.txt Mas ejemplos: [martin8@localhost prueba]$ ls -l total 8 -rwxr----x 1 martin8 users 0 feb 22 20:21 a -rwx--x--x 1 martin8 users 0 feb 22 20:21 b -r-xr-xr-x 1 martin8 users 0 feb 22 20:21 c -------rw- 1 martin8 users 7 feb 22 20:22 d -rw-r--r-- 1 martin8 users 0 feb 22 20:58 ed -rw-r--r-- 1 martin8 users 7 feb 22 20:21 m [martin8@localhost prueba]$ find . -name "?" -type f -print ./a ./b ./c ./m ./d [martin8@localhost prueba]$ ls -l total 8 -rwxr----x 1 martin8 users 0 feb 22 20:21 a -rwx--x--x 1 martin8 users 0 feb 22 20:21 b -r-xr-xr-x 1 martin8 users 0 feb 22 20:21 c -------rw- 1 martin8 users 7 feb 22 20:22 d -rw-r--r-- 1 martin8 users 0 feb 22 20:58 ed -rw-r--r-- 1 martin8 users 7 feb 22 20:21 m [martin8@localhost prueba]$ find . -name "?" -type f -exec mv {} {}.txt find: missing argument to `-exec' [martin8@localhost prueba]$ find . -name "?" -type f -exec mv {} {}.txt \; [martin8@localhost prueba]$ ls -l total 8 -rwxr----x 1 martin8 users 0 feb 22 20:21 a.txt -rwx--x--x 1 martin8 users 0 feb 22 20:21 b.txt -r-xr-xr-x 1 martin8 users 0 feb 22 20:21 c.txt -------rw- 1 martin8 users 7 feb 22 20:22 d.txt -rw-r--r-- 1 martin8 users 0 feb 22 20:58 ed -rw-r--r-- 1 martin8 users 7 feb 22 20:21 m.txt 66
[martin8@localhost prueba]$ find / \( -perm -2000 -o -perm -4000 \) -print \ > 2>err los errores cuando sea directorios sin permiso no saldran por pantalla [martin8@localhost prueba]$ find / \( -perm -2000 -o -perm -4000 \) -print \ > > f20 2>err [martin8@localhost prueba]$ cat f20|head -3 /usr/lib/emacs/20.5/i386-redhat-linux-gnu/movemail /usr/man/es /usr/man/es/man1 Mover ficheros a otro lugar modificando su extension [martin8@localhost prueba]$ find . -name "??" -type f -exec mv {} mar/{}.txt \; [martin8@localhost prueba]$ ls a abe b mar [martin8@localhost prueba]$ cd mar [martin8@localhost mar]$ ls aa.txt ab.txt
SORT Este comando ordena las lineas de un fichero y escribe la salida a la salida estándar Si se especifica mas de un fichero los une y los ordena como si se tratase de uno solo Opciones mas importantes: -f --- cambia a mayusculas antes de ordenar, ignora mayusulas y minusculas -r orden inverso -u suprime lineas repetidas en el fichero de salida -o output file escribe la salida a un fichero -d ignora caracteres especiales (solo letras y numeros) Para especificar un fichero de salida hay que especificar la opciom -o SORT CON CAMPOS -t ‘<’ el carácter que se utiliza para separar campos -k n por que campo ordenar Ejemplos [martin8@localhost martin8]$ cat frutas banana orange 67
Persimmon apple apple ORANGE [martin8@localhost martin8]$ sort frutas ORANGE Persimmon apple apple banana orange {LAS MAYUSCULAS ESTAN ANTES} [martin8@localhost martin8]$ sort -f frutas (ignora mayusculas) apple apple banana ORANGE orange Persimmon [martin8@localhost martin8]$ sort -f -u frutas (suprime las repetidas) apple banana orange Persimmon [martin8@localhost martin8]$ sort -fur frutas (orden inverso) Persimmon orange banana apple ES LO MISMO ESCRIBIR SORT -f -u -r frutas Ejemplos con pipe [martin8@localhost martin8]$ head -3 frutas|sort Persimmon banana orange [martin8@localhost martin8]$ head -3 frutas|sort -u -f banana orange Persimmon SORT CON CAMPOS -t ‘<’ el carácter que se utiliza para separar campos -k n por que campo ordenar
68
martin8@NODE:/home/martin8/dir88> cat > f1 1e 2a 3t 4 bmartin8@NODE:/home/martin8/dir88> sort f1 1e 2a 3t 4b martin8@NODE:/home/martin8/dir88> sort -k2 f1 2a 4b 1e 3t martin8@NODE:/home/martin8/dir88> cat f1 1<e 2<a 3<t 4<b martin8@NODE:/home/martin8/dir88> sort -t '<' -k2 f1 2<a 4<b 1<e 3<t
Ejemplos [martin8@localhost martin8]$ cat frutas banana orange Persimmon apple apple ORANGE [martin8@localhost martin8]$ sort frutas ORANGE Persimmon apple apple banana orange {LAS MAYUSCULAS ESTAN ANTES} [martin8@localhost martin8]$ sort -f frutas (ignora mayusculas) apple apple banana 69
ORANGE orange Persimmon [martin8@localhost martin8]$ sort -f -u frutas (suprime las repetidas) apple banana orange Persimmon [martin8@localhost martin8]$ sort -fur frutas (orden inverso) Persimmon orange banana apple ES LO MISMO ESCRIBIR SORT -f -u -r frutas Ejemplos con pipe [martin8@localhost martin8]$ head -3 frutas|sort Persimmon banana orange [martin8@localhost martin8]$ head -3 frutas|sort -u -f banana orange Persimmon N煤mero de usuarios con procesos activos [martin8@localhost martin8]$ ps -fe|awk '{print $1}'|sort -u|wc -l 8 [martin8@localhost martin8]$ ps -fe|awk '{print $1}'|sort -u UID bin daemon martin6 martin8 nobody root xfs
SED Comando para sutituci贸n de texto dentro de un fichero. sed 's/banana/MARTIN GV/' frutas
70
sed s/cadena a sustituir/nueva cadena/ fichero Para cada linea del fichero procesa el comando y la salida la devuelve a stdout. Por tanto despues de realizar el comando sed el fichero original no se altera. El comando se suele emplear entre comillas aunque en casos simples no es necesario -
Varias instrucciones separadas por -e Crear fichero de scripts - [sed -f fichero fichero_a_sustituir]
[martin8@localhost martin8]$ cat frutas banana orange Persimmon apple apple ORANGE [martin8@localhost martin8]$ sed s/banana/BANA/ frutas BANA orange Persimmon apple apple ORANGE Cuando existen espacios si es necesario [martin8@localhost martin8]$ sed 's/banana/MARTIN GV/' frutas MARTIN GV orange Persimmon apple apple ORANGE Varias instrucciones separadas por -e [martin8@localhost martin8]$ sed -e 's/banana/MARTIN GV/' -e 's/ap/AP/' frutas MARTIN GV orange Persimmon APple APple ORANGE Redirecionar la salida a un fichero [martin8@localhost martin8]$ sed 's/ap/AP/' frutas > frutas2 [martin8@localhost martin8]$ cat frutas2 banana orange 71
Persimmon APple APple ORANGE Crear fichero de scripts - [sed -f fichero fichero_a_sustituir] [martin8@localhost martin8]$ cat > fichero.sed s/AP/MGV/ s/or/OR/ s/mm/MM/ [martin8@localhost martin8]$ sed -f fichero.sed frutas > frutas3 [martin8@localhost martin8]$ cat frutas3 banana ORange PersiMMon apple apple ORANGE ----------Para cada linea del fichero procesa el comando y la salida la devuelve a stdout. Por tanto despues de realizar el comando sed el fichero original no se altera. El comando se suele emplear entre comillas aunque en casos simples no es necesario Opcion -n hace que no se produzca la salida por stdout. En el caso de que deseemos que solo se muestren lo sustituido incluir el comando p y solo se producir谩 la salida para los que cumplen la condici贸n. [martin8@localhost martin8]$ cat frutas banana orange Persimmon apple apple ORANGE [martin8@localhost martin8]$ sed -n 's/ap/AP/' frutas [martin8@localhost martin8]$ sed -n 's/ap/AP/p' frutas APple APple [martin8@localhost martin8]$ sed -n 's/ap/AP/p' frutas APple APple Redirecionar la salida a un fichero [martin8@localhost martin8]$ sed 's/ap/AP/' frutas > frutas2 72
BORRADO /d sed â&#x20AC;&#x2DC;1,4dâ&#x20AC;&#x2122; datos Borra las lineas 1 a 4 del archivo datos [root@martin /root]# cat prueba Martin va a probar algo mucho cuidado [root@martin /root]# sed '1d' prueba mucho cuidado [root@martin /root]# sed '1,2d' prueba [root@martin /root]# cat prueba Martin va a probar algo mucho cuidado
73
PROCESOS Un proceso es un programa que corre en memoria. Es distinto de un comando que puede ejecutar varios procesos. Comandos como ls ejecutan un proceso simple pero comando compuestos por pipes pueden ejecutar varios procesos. ls *|sort -u|tee lolo|wc -lw cada uno de ellos es un proceso distinto TIPOS DE PROCESOS PROCESOS INTERACTIVOS --> iniciados y controlados desde la consola o terminal. Pueden funcionar en background o foreground. Foreground : Se mantienen coenctados con la terminal directamente. Background : dejan el terminal libre. PROCESOS Batch : Los procesos se mandan a una cola en donde son ejecutados secuencialemnete. Daemons : Programas que estan funcionando continuamente en el sistema y que proporcionan diversos servicios: impresora (lptd), mail (sendmail), TCP (inetd)... Estan esperando a que alguien solicite el servicio y en ese momento se ponen a trabajar. ATRIBUTOS DE LOS PROCESOS Process ID (PID) : Número único que identific al proceso Parent Process ID (PPID). PID del proceso que crea el proceso Real y Efective User ID (RUID, EUID). El primero corresponde al UID del usuario que ejecuta el proceso. El segundo es distinto del primero si está activo el SUID. Real y Efective Group ID (RGID, EGID) El primero corresponde al GID del grupo que ejecuta el proceso. El segundo es distinto del primero si está activo el SGID. RELACIÓN ENTRE COMANDO Y FICHERO UNIX no distingue entre comando y fichero. Los comandos son ficheros con permiso de ejecución colocados en directorios del sistema. Acceso a los comandos es igual que el acceso a ficheros Los comandos se buscan en el path de cada usuario que viene definido en la variable de entorno PATH. 74
martin8@NODE:/home/martin8> echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/martin8/bin:/home/martin8/bin:. La búsqueda se realiza en el orden en el que aparece en el path Para interrumpir un proceso --> CTRL+C
PS - PARA VER EL LISTADO DE PROCESOS Este comando pertenece a root y tiene SUID por tanto quien lo ejecuta adquere privilegios de root durante su ejecución. Muestra informaión sobre los procesos activos del sistema. [martin8@localhost martin8]$ ps PID TTY TIME CMD 1149 pts/0 00:00:00 bash 1184 pts/0 00:00:00 ps ps -f : información mas detallada [martin8@localhost martin8]$ ps -f UID PID PPID C STIME TTY TIME CMD martin8 1149 1148 0 14:59 pts/0 00:00:00 -bash martin8 1187 1149 0 15:03 pts/0 00:00:00 ps -f Por ejemplo al realizar un cat y su... si ejecutamos ps -f [juan@localhost datos]$ ps -f UID PID PPID C STIME TTY TIME CMD juan 998 997 0 14:12 pts/1 00:00:00 -bash juan 1185 998 0 15:02 pts/1 00:00:00 ps -f [juan@localhost datos]$ su root Password: [root@localhost datos]# cat >>fich3& [1] 1199 [1]+ Stopped (tty input) cat >>fich3 [root@localhost datos]# jobs [1]+ Stopped (tty input) cat >>fich3 [root@localhost datos]# ps -f UID PID PPID C STIME TTY TIME CMD root 997 996 0 14:11 pts/1 00:00:00 login -- juan root 1188 998 0 15:03 pts/1 00:00:00 su root root 1189 1188 0 15:03 pts/1 00:00:00 bash root 1199 1189 0 15:04 pts/1 00:00:00 cat root 1200 1189 0 15:04 pts/1 00:00:00 ps -f ps -u procesos cuyo usuario está en la lista [root@localhost datos]# ps -u martin8 75
PID TTY TIME CMD 699 tty2 00:00:00 bash 1149 pts/0 00:00:00 bash Ha entrado en el ordenador principal y un pseudo-terminal. OPCION RECOMENDADA PS -FE Indica el usuario, etc... [root@localhost datos]# ps -fe|sort|more UID PID PPID C STIME TTY TIME CMD daemon 463 1 0 12:30 ? 00:00:00 /usr/sbin/atd juan 998 997 0 14:12 pts/1 00:00:00 -bash martin8 699 671 0 12:32 tty2 00:00:00 -bash martin8 1149 1148 0 14:59 pts/0 00:00:00 -bash root 495 1 0 12:30 ? 00:00:00 inetd root 509 1 0 12:30 ? 00:00:00 [lpd] root 554 1 0 12:30 ? 00:00:00 sendmail: accepting connections root 569 1 0 12:30 ttyS0 00:00:00 gpm -t ms root 583 1 0 12:30 ? 00:00:01 httpd root 670 1 0 12:30 tty1 00:00:00 login -- root root 671 1 0 12:30 tty2 00:00:00 login -- martin8 root 1188 998 0 15:03 pts/1 00:00:00 su root root 1189 1188 0 15:03 pts/1 00:00:00 bash root 1199 1189 0 15:04 pts/1 00:00:00 cat root 1225 1189 0 15:10 pts/1 00:00:00 ps -fe root 1226 1189 0 15:10 pts/1 00:00:00 sort root 1227 1189 0 15:10 pts/1 00:00:00 more Por ejemplo podriamos saber los procesos que estรก ejecutando una determinada persona con: [root@localhost datos]# ps -fe|grep martin8 root 671 1 0 12:30 tty2 00:00:00 login -- martin8 martin8 699 671 0 12:32 tty2 00:00:00 -bash root 1148 1147 0 14:59 pts/0 00:00:00 login -- martin8 martin8 1149 1148 0 14:59 pts/0 00:00:00 -bash root 1229 1189 0 15:13 pts/1 00:00:00 grep martin8 o si alguien estรก jugando al Doom y saber su nombre de usuario [root@localhost datos]# ps -fe|grep "[Dd]oom"|awk '{print $1}' [root@localhost datos]# ps -fe|grep "grep"|awk '{print $1}' root o ejecutando grep. FOREGROUND y BACKGROUND [martin8@localhost martin8]$ ps -f UID PID PPID C STIME TTY
TIME CMD 76
martin8 1378 1377 0 16:24 pts/0 00:00:00 -bash martin8 1411 1378 0 16:31 pts/0 00:00:00 ps -f [martin8@localhost martin8]$ ls -laR>fich1& (se ejecuta en background) [1] 1412 [martin8@localhost martin8]$ jobs [1]+ Running ls --color=tty -laR >fich1 & [martin8@localhost martin8]$ jobs [1]+ Running ls --color=tty -laR >fich1 & [martin8@localhost martin8]$ jobs [1]+ Done ls --color=tty -laR >fich1 [martin8@localhost martin8]$ ls -laR>fich1& [1] 1413 [martin8@localhost martin8]$ jobs [1]+ Running ls --color=tty -laR >fich1 & [martin8@localhost martin8]$ kill %1 [martin8@localhost martin8]$ jobs [1]+ Terminated ls --color=tty -laR >fich1 [martin8@localhost martin8]$ ls -laR>fich1 [INMEDIATAMENTE DAR CTRL+Z para pararlo] [1]+ Stopped ls --color=tty -laR >fich1 [martin8@localhost martin8]$ ls -laR>fich2& [2] 1415 [martin8@localhost martin8]$ jobs [1]+ Stopped ls --color=tty -laR >fich1 [2]- Running ls --color=tty -laR >fich2 & Al cabo de un tiempo [martin8@localhost martin8]$ jobs [1]+ Stopped ls --color=tty -laR >fich1 [2]- Done ls --color=tty -laR >fich2 Ejecuto 3 procesos y al ponerlos en background puedo seguir escribiendo comandos, como ps. [martin8@localhost martin8]$ jobs [1]+ Stopped ls --color=tty -laR >fich1 [2]- Done ls --color=tty -laR >fich2 [martin8@localhost martin8]$ ls -laR>fich2& [2] 1416 [martin8@localhost martin8]$ ls -laR>fich3& [3] 1417 [martin8@localhost martin8]$ ls -laR>fich4& [4] 1418 [martin8@localhost martin8]$ jobs [1]+ Stopped ls --color=tty -laR >fich1 [2] Running ls --color=tty -laR >fich2 & [3] Running ls --color=tty -laR >fich3 & 77
[4]- Running ls --color=tty -laR >fich4 & [martin8@localhost martin8]$ ps PID TTY TIME CMD 1378 pts/0 00:00:00 bash 1414 pts/0 00:00:00 ls 1416 pts/0 00:00:09 ls 1417 pts/0 00:00:05 ls 1418 pts/0 00:00:02 ls 1419 pts/0 00:00:00 ps [martin8@localhost martin8]$ Para volver a seguir ejecutando un proceso parado o llevarlo a background [martin8@localhost martin8]$ jobs [1]+ Stopped ls --color=tty -laR >fich1 [2] Done ls --color=tty -laR >fich2 [3] Done ls --color=tty -laR >fich3 [4]- Done ls --color=tty -laR >fich4 [martin8@localhost martin8]$ bg %1 [1]+ ls --color=tty -laR >fich1 & [martin8@localhost martin8]$ jobs [1]+ Running ls --color=tty -laR >fich1 & Para finalizar un proceso del todo kill % numero del proceso. Tabien se puede emplear el numero del PID [martin8@localhost martin8]$ jobs [1] Running ls --color=tty -laR >fich4 & [2]- Running ls --color=tty -laR >fich3 & [3]+ Running ls --color=tty -laR >fich2 & [martin8@localhost martin8]$ kill %2 [martin8@localhost martin8]$ jobs [1] Running ls --color=tty -laR >fich4 & [2]- Terminated ls --color=tty -laR >fich3 [3]+ Running ls --color=tty -laR >fich2 & [martin8@localhost martin8]$ jobs [1]- Running ls --color=tty -laR >fich4 & [3]+ Running ls --color=tty -laR >fich2 &
[martin8@localhost martin8]$ ls -laR>fich3& [1] 1425 [martin8@localhost martin8]$ ls -laR>fich2& [2] 1426 [martin8@localhost martin8]$ ls -laR>fich4& [3] 1427 [martin8@localhost martin8]$ ls -laR>fich6& 78
[4] 1428 [martin8@localhost martin8]$ ls -laR>fich8& [5] 1429 [martin8@localhost martin8]$ ls -laR>fich87& [6] 1430 [martin8@localhost martin8]$ nohup ls -laR>fich90& [7] 1431 exit [SALIR ] Pasar a foreground un proceso [martin8@localhost martin8]$ jobs [martin8@localhost martin8]$ top& [1] 1564 [1]+ Stopped (tty output) top [martin8@localhost martin8]$ fg %1 Q para salir de top KILL [martin8@localhost martin8]$ top& [1] 1566 [1]+ Stopped (tty output) top [martin8@localhost martin8]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 2003 1486 1485 0 69 0 - 434 wait4 pts/1 00:00:00 bash 000 T 2003 1566 1486 0 68 0 - 362 do_sig pts/1 00:00:00 top 000 R 2003 1567 1486 0 75 0 - 630 - pts/1 00:00:00 ps [martin8@localhost martin8]$ kill -15 1566 [martin8@localhost martin8]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 2003 1486 1485 0 67 0 - 434 wait4 pts/1 00:00:00 bash 000 T 2003 1566 1486 0 64 0 - 362 do_sig pts/1 00:00:00 top 000 R 2003 1568 1486 0 72 0 - 630 - pts/1 00:00:00 ps Se単al 9 de KILL [martin8@localhost martin8]$ kill -9 1566 [1]+ Killed top [martin8@localhost martin8]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 2003 1486 1485 0 67 0 - 434 wait4 pts/1 00:00:00 bash 000 R 2003 1572 1486 0 71 0 - 630 - pts/1 00:00:00 ps
NICE y RENICE
79
PRIORIDAD DE PROCESOS NICE Al ejecutar un proceso se lanza con la prioridad dada por el usuario RENICE Ya en ejecución del proceso se puede cambiar la prioridad [martin8@localhost martin8]$ ls -laR>fi1& [1] 1515 [martin8@localhost martin8]$ renice 20 1515 1515: old priority 0, new priority 20 [martin8@localhost martin8]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 2003 1486 1485 0 60 0 - 434 wait4 pts/1 00:00:00 bash 000 R 2003 1515 1486 99 80 19 - 350 - pts/1 00:00:12 ls 000 R 2003 1517 1486 0 66 0 - 630 - pts/1 00:00:00 ps [martin8@localhost martin8]$ nice -15 ls -laR>fi2& [1] 1551 [martin8@localhost martin8]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 2003 1486 1485 0 71 0 - 434 wait4 pts/1 00:00:00 bash 000 R 2003 1551 1486 98 78 15 - 348 - pts/1 00:00:03 ls 000 R 2003 1552 1486 0 78 0 - 630 - pts/1 00:00:00 ps [martin8@localhost martin8]$ renice 20 1551 1551: old priority 15, new priority 20 [martin8@localhost martin8]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 2003 1486 1485 0 60 0 - 434 wait4 pts/1 00:00:00 bash 000 R 2003 1551 1486 99 80 19 - 350 - pts/1 00:00:20 ls 000 R 2003 1554 1486 0 66 0 - 630 - pts/1 00:00:00 ps
80
GESTION DE USUARIOS
SU su – pedro Permite cambiar de usuario en la propia sesión. CUIDADo, a veces su root y luego se olvida salir y alguién puede estar manejando root sin saberlo. SALIR SIEMPRE CON EXIT
PASSWD Cambia la password de un usuario bash$ passwd Changing password for martin6 (current) UNIX password: passwd: Authentication failure bash$ bash$ passwd Changing password for martin6 (current) UNIX password: New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully OPCION passwd –l nombre_de_usuario permite bloquear al usuario por parte de root para que no pueda entrar al sistema ID Especifica las caracteristicas de un usuario martin8@NODE:/home/martin8> id uid=2003(martin8) gid=100(users) groups=100(users) Opciones especificas id -u --> UID id -un --> login id -g --> GID id -gn --> nombre grupo id -G --> grupos 81
martin8@NODE:/home/martin8> id uid=2003(martin8) gid=100(users) groups=100(users) martin8@NODE:/home/martin8> id -u 2003 martin8@NODE:/home/martin8> id -un martin8 martin8@NODE:/home/martin8> id -g 100 martin8@NODE:/home/martin8> id -gn users Con root [root@localhost martin8]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10 (wheel) [root@localhost martin8]# id -u 0 [root@localhost martin8]# id -un root [root@localhost martin8]# id -g 0 [root@localhost martin8]# id -gn root [root@localhost martin8]# id -G 0 1 2 3 4 6 10 [root@localhost martin8]# id -Gn root bin daemon sys adm disk wheel WHOAMI martin8@NODE:/home/martin8> whoami martin8 martin8@NODE:/home/martin8> id uid=2003(martin8) gid=100(users) groups=100(users) martin8@NODE:/home/martin8> su root Password: [root@localhost martin8]# whoami root [root@localhost martin8]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10 (wheel) [root@localhost martin8]# exit exit martin8@NODE:/home/martin8> whoami martin8
82
USUARIOS EN UNIX Características generales
UNIX es un sistema multiusuario Agrupación de usuarios en grupos (proyecto) UID, GID (Valores únicos) Información de usuarios y grupos en: o /etc/passwd o /etc/group Fichero /etc/shadow (/etc/security/shadow enAIX) contraseña encriptada martin8@NODE:/home/martin8> id uid=2003(martin8) gid=100(users) groups=100(users) uid numero unívoco del usuario internamente en UNIX gid numero unívoco del grupo internamente en UNIX groups GID de los grupos secundarios del usuario
FICHERO /ETC/PASSWD Fichero donde se almacena la información de usuarios en UNIX. nombre:passwd-cod:UID:GID:informacion:home:shell nombre: nombre asociado al usuario No es información confidencial Passwd-cod password del usuario encriptada Por seguridad el passwd se guarda en fichero /etc/shadow La passwd se cambia con el comando passwd Bloqueo de cuenta con *LK* en lugar de passw encriptada (ó * donde x) UID Número de identificación del usuario, único por usuario. UID<100 se suelen utilizar para el sistema GID Número de identificación del grupo Varios usuarios pueden pertenecer al mismo grupo Los grupos se definen en /etc/group GID<10 reservados al sistema información Detalles sobre el usuario: nombre completo, teléfono, despacho,etc. 83
HOME Directorio de trabajo del usuario al entrar en el sistema AIX, LINUX --> /home/susuario SOLARIS --> /export/home/usuario SHELL Programa que UNIX utiliza como interprete de comandos para el usuario Al entrar en el sistema se ejecuta este programa Los shell permitidos están en el fichero /etc/shells (Solaris) y /etc/security/login.cfg (AIX) FICHERO /ETC/PASSWD [root@localhost /etc]# cat passwd|more root:x:0:0:root:/root:/bin/bash ftp:x:14:50:FTP User:/home/ftp: jaime:x:500:500::/home/jaime:/bin/bash martin:x:501:501::/home/martin:/bin/bash jose:x:502:502::/home/jose:/bin/bash martin2:x:503:503::/home/martin2:/bin/bash martin4:x:2000:2100:Martingarcia:/home/martin5:/bin/bash martin6:x:2001:2101:Martinv6:/home/martin6:/bin/bash martin7:x:2002:2002::/home/martin7:/bin/bash martin8:x:2003:100::/home/martin8:/bin/bash martin9:x:2004:2004::/home/martin9:/bin/bash juan:x:2005:100::/home/juan:/bin/bash GRUPOS EN UNIX Los grupos son un mecanismo para compartir ficheros y recursos por un conjunto de usuarios Grupo primario de un usuario. Es el grupo que aparece en el fichero /etc/passwd (para ese usuario) Grupo secundario de un usuario. Cualquier otro grupo al que pertenezca el usuario (Definido en /etc/group) El comando groups muestra a que grupos pertenece el usuario [root@localhost /etc]# whoami root [root@localhost /etc]# groups root bin daemon sys adm disk wheel Un usuario unicamente puede tener un grupo activo cada vez Al comenzar el grupo activo corresponde al que aparece en /etc/passwd El comando id muestra el UID y grupo activo del usuario [root@localhost /etc]# groups root bin daemon sys adm disk wheel 84
[root@localhost /etc]# whoami root [root@localhost /etc]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10 (wheel) Los grupos se definen de dos formas: 1. Cuando un GID aparece en el cuarto campo del fichero /etc/passwd significa que dicho usuario tiene como grupo principal el señalado en este fichero martin8:x:2003:100::/home/martin8:/bin/bash 2. Cuando un nombre y GID aparece en el fichero /etc/group. Si aparecen usuarios (por ejemplo usdai1)en el fichero significa que dicho usuario tiene como grupo secundario dicho grupo. ASI2:x:2101:usdai1 Aunque no es necesario excepto en AIX, todos los grupos aparecen en el fichero /etc/group. En cualquier caso sería aconsejable. Formato de fichero /etc/groups: group-name:*:GID:usuarios group-name : Nombre del grupo. Por ejemplo si un grupo de trabajo desarrolla proyectos SAP pues el grupo se podrá denominar SAP * : El segundo campo no se usa y suele aparecer como * o blanco. GID: Nombre de identificación del grupo. Debe ser único. usuarios: Lista de usuarios separados por comas que pertenecen al grupo. Además de los definidos en /etc/passwd. SIN PONER BLANCOS ENTRE USUARIOS. CREACIÓN AUTOMÁTICA DE USUARIOS Crear usuario: Añadir un nuevo usuario supone añadir una línea al fichero /etc/passwd useradd opciones nombre_usuario opciones: -d : directorio padre -u : UID del usuario -c : comentario -g : grupo principal al que pertenece el usuario -G : grupo/s secundario/s al que pertenece el usuario -s : shell
85
nombre : martin10 home: /home/martin10 grupo : 5000 Si no se especifica un valor se asigna uno por defecto, en el caso de d el directorio propio sería /home/nombre de usuario; en el caso de UID el siguiente número libre de usuarios; useradd –d/home/midirectorio –u 5010 –c “Martín” –g 5000 –G 5001,5002 unuevo Modificar usuario: usermod opciones nombre de usuario usermod –c “PepitoGrillo” unuevo cambia el comentario al usuario unuevo OPCION IMPORTANTE (SOLO ROOT) usermod –l nuevonombre antiguonombre Permite cambiar el nombre de un usuario manteniendo todas las opciones al crearlo. [root@martin /root]# usermod -l martin88 martin8 SE TIENE EN CUENTA CUANDO EL USUARIO INICIE DE NUEVO LA SESION Modificamos el usuario martin1 por martin3. Al salir y volver a entrar al sistema NO EXISTE martin1 sino martin3. [root@martin /root]# usermod -l martin3 martin1 [jaime@martin jaime]$ su - martin1 su: user martin1 does not exist [jaime@martin jaime]$ su - martin3 Password: [martin3@martin ~]$ Borrar usuario userdel nombreusuario userdel unuevo
CREACIÓN AUTOMÁTICA DE GRUPOS Crear grupo groupadd -g 2200 especial 86
Crea el grupo 2200 llamado especial Modifica el fichero /etc/groups: Crea lĂnea con el grupo, su GID y los usuarios que pertenecen a el como grupo SECUNDARIO. Borrar grupo groupdel especial Ejemplo [root@martin /root]# groupadd -g 6000 mar [root@martin /root]# groupdel mar FICHERO /ETC/GROUP [root@localhost /etc]# cat /etc/group|more root:x:0:root jaime:x:500: martin:x:501: jose:x:502: martin2:x:503: ASI:x:2100: ASI2:x:2101: martin7:x:2002: martin9:x:2004: Para averiguar los grupos de un usuario: bash$ whoami martin6 bash$ groups ASI2 [root@localhost /etc]# whoami root [root@localhost /etc]# groups root bin daemon sys adm disk wheel Comando UNIX con awk que averigue los GID de los grupos [root@localhost /etc]# cat /etc/group|awk -F':' '{print $3}'|sort|more 0 1 10 100 12 13 14 15
87
GESTIÓN DE USUARIOS Añadir nuevos usuarios: UID, GID, home, shell Grupos Usuarios y frupos standard de UNIX Características generales UNIX es un sistema multiusuario Agrupación de usuarios en grupos (proyecto) UID, GID (Valores únicos) Información de usuarios y grupos en: /etc/passwd /etc/group Fichero /etc/sahdow (/etc/security/hadow enAIX) martin8@NODE:/home/martin8> who root tty1 Feb 28 10:07 martin8 pts/0 Feb 28 09:53 martin6 pts/1 Feb 28 10:06 martin8 pts/2 Feb 28 10:07 martin8@NODE:/home/martin8> id uid=2003(martin8) gid=100(users) groups=100(users) AÑADIR NUEVO SUARIO 1. 2. 3. 4. 5. 6. 7.
Asignar un nombre de usuario, UID (no ocupado) y grupo primario GID Introducir datos en /etc/passwd/ y /etc/group Asignar password al nuevo usuario Crear el directorio home para el usuario Crear ficheros de inicialización Utilizar chown y chgrp para cambiar la propiedad del directorio home Probar la nueva cuenta
DEFINIR UN NUEVO USUARIO Añadir un nuevo usuario supone añadir una línea al fichero /etc/passwd Este fichero se puede editar con cualquier editor de textos pero solo root puede modificarlo martin8@NODE:/home/martin8> cd /etc martin8@NODE:/etc> ls -l passwd -rw-r--r-- 1 root root 1227 Feb 23 00:48 passwd Aconsejable hacer una copia antes de modificarlo martin8@NODE:/etc> cp passwd passwd.new cp: cannot create regular file `passwd.new': Permission denied martin8@NODE:/etc> su root Password: [root@localhost /etc]# cp passwd passwd.new Posteriormente modificamos y si realizamos algo MAL lo volvemos a restaurar 88
EJEMPLO FICHERO /ETC/PASSWD nombre:passwd-cod:UID:GID:informacion:home:shell nombre: nombre asociado al usuario No es información confidencial Passwd-cod password del usuario encriptada Por seguridad el passwd se guarda en fichero /etc/shadow La passwd se cambia con el comando passwd Bloqueo de cuenta con *LK* en lugar de passw encriptada (ó * donde x) UID Número de identificación del usuario, único por usuario. UID<100 se suelen utilizar para el sistema GID Número de identificación del grupo Varios usuarios pueden pertenecer al mismo grupo Los grupos se definen en /etc/group GID<10 reservados al sistema información Detalles sobre el usuario: nombre completo, teléfono, despacho,etc. HOME Directorio de trabajo del usuario al entrar en el sistema AIX, LINUX --> /home/susuario SOLARIS --> /export/home/usuario SHELL Programa que UNIX utiliza como interprete de comandos para el usuario Al entrar en el sistema se ejecuta este programa Los shell permitidos están en el fichero /etc/shells (Solaris) y /etc/security/login.cfg (AIX) FICHERO /ETC/PASSWD [root@localhost /etc]# cat passwd|more root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin: daemon:x:2:2:daemon:/sbin: adm:x:3:4:adm:/var/adm: lp:x:4:7:lp:/var/spool/lpd: sync:x:5:0:sync:/sbin:/bin/sync 89
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail: news:x:9:13:news:/var/spool/news: uucp:x:10:14:uucp:/var/spool/uucp: operator:x:11:0:operator:/root: games:x:12:100:games:/usr/games: gopher:x:13:30:gopher:/usr/lib/gopher-data: ftp:x:14:50:FTP User:/home/ftp: jaime:x:500:500::/home/jaime:/bin/bash martin:x:501:501::/home/martin:/bin/bash jose:x:502:502::/home/jose:/bin/bash martin2:x:503:503::/home/martin2:/bin/bash martin4:x:2000:2100:Martingarcia:/home/martin5:/bin/bash martin6:x:2001:2101:Martinv6:/home/martin6:/bin/bash martin7:x:2002:2002::/home/martin7:/bin/bash martin8:x:2003:100::/home/martin8:/bin/bash martin9:x:2004:2004::/home/martin9:/bin/bash juan:x:2005:100::/home/juan:/bin/bash FICHERO /ETC/SHADOW [root@localhost /etc]# cat shadow|more root:$1$Zzodb5uY$XxHLkezJQrzBgbi55BNp50:11688:0:99999:7:-1:-1:134540356 bin:*:11688:0:99999:7::: jaime:$1$uXJs0gtj$/LmZnVx43D8img01JvGE9/:11691:-1:99999:-1:-1:-1:134540356 martin:$1$HBJ8hlLU$KZntIkP.nEaZ3uw/7QXUM0:11715:0:99999:7:::135748788 jose:$1$JeqsKOlO$ogJ/hH3B.ap19XEEeEep20:11706:0:99999:7:-1:-1:134539228 martin2:$1$YNdU7DeG$/Q/7RY/rpZvG1hPO9Hxbn0:11710:0:99999:7:-1:-1:134540396 martin4:$1$whV/qN06$nn8ir9.sU6Ag28auiEfcH0:11710:0:99999:7:-1:-1:134540340 martin7:!!:11710:0:99999:7::: martin6:$1$kbHN7kEf$xcEh4RRWmeO24D02ZNgrB/:11740:-1:99998:-1:0:-1:134540364 martin8:$1$CtAf9Jh.$N14nCZA4g5MvEqRwFZZcZ0:11717:0:99999:7:-1:-1:134540364 martin9:$1$4NXIyP4g$294TYa/39Ki32uMJfaMsi1:11717:0:99999:7:-1:-1:134540332 juan:$1$2QSd5FTY$BEur8IPYrdDxM40HulqNv/:11740:0:99999:7:-1:-1:134540308 [root@localhost /etc]# ls -la shadow -rw------- 1 root root 1334 feb 23 00:48 shadow GRUPOS EN UNIX Los grupos son un mecanismo para compartir ficheros y recursos por un consjunto de usuarios Los grupos se definen de dos formas: Cuando un GID aparece en el cuarto campo del fichero /etc/passwd martin8:x:2003:100::/home/martin8:/bin/bash Cuando un nombre y GID aparece en el fichero /etc/group ASI2:x:2101: 90
Aunque no es necesario excepto en AIX, todos los grupos aparecen en el fichero /etc/group. En cualquier caso sería aconsejable. Formato: group-name:*:GID:usuarios group-name : Nombre del grupo. Por ejemplo si un grupo de trabajo desarrolla proyectos SAP pues el grupo se podrá denominar SAP * : El segundo campo no se usa y suele aparecer como * o blanco. GID: Nombre de identificación del grupo. Debe ser único. usuarios: Lista de usuarios separados por comas que pertenecen al grupo. Además de los definidos en /etc/passwd. SIN PONER BLANCOS ENTRE USUARIOS. GRUPOS SECUNDARIOS Grupo primario de un usuario. Es el grupo que aparece en el fichero /etc/passwd (para ese usuario) Grupo secundario de un usuario. Cualquier otro grupo al que pertenezca el usuario (Definido en /etc/group) El comando groups muestra a que grupos pertenece el usuario [root@localhost /etc]# whoami root [root@localhost /etc]# groups root bin daemon sys adm disk wheel Un usuario unicamente puede tener un grupo activo cada vez Al comenzar el grupo activo corresponde al que aparece en /etc/passwd El comando id muestra el UID y grupo activo del usuario [root@localhost /etc]# groups root bin daemon sys adm disk wheel [root@localhost /etc]# whoami root [root@localhost /etc]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10 (wheel) bash$ whoami martin6 bash$ id uid=2001(martin6) gid=2101(ASI2) groups=2101(ASI2) Cuando un usuario crea un fichero, ese fichero pertenece al grupo activo del usuario. Pero yo puedo cambiar mi grupo activo: newgrp [root@localhost /etc]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10 91
(wheel) [root@localhost /etc]# whoami root [root@localhost /etc]# newgrp sys [root@localhost /etc]# id uid=0(root) gid=3(sys) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10( wheel) Prueba de creaci贸n de ficheros: [root@localhost /etc]# newgrp sys [root@localhost /etc]# id uid=0(root) gid=3(sys) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10( wheel) [root@localhost /etc]# cat > fisys hola [root@localhost /etc]# newgrp root [root@localhost /etc]# cat > firoot hola2 [root@localhost /etc]# ls -l fi* -rw-r--r-- 1 root root 43 feb 17 2000 filesystems -rw-r--r-- 1 root root 6 feb 28 11:18 firoot -rw-r--r-- 1 root sys 5 feb 28 11:18 fisys FICHERo /ETC/GROUP [root@localhost /etc]# cat /etc/group|more root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin,adm adm:x:4:root,adm,daemon tty:x:5: disk:x:6:root lp:x:7:daemon,lp mem:x:8: kmem:x:9: wheel:x:10:root mail:x:12:mail news:x:13:news uucp:x:14:uucp jaime:x:500: martin:x:501: jose:x:502: martin2:x:503: ASI:x:2100: ASI2:x:2101: martin7:x:2002: martin9:x:2004: Para averiguar los grupos de un usuario: 92
bash$ whoami martin6 bash$ groups ASI2 [root@localhost /etc]# whoami root [root@localhost /etc]# groups root bin daemon sys adm disk wheel Aunque pueden no aparerer, como es el caso, suele tener el grupo los usuarios a los que pertenecen. Comando UNIX con awk que averigue los GID de los grupos [root@localhost /etc]# cat /etc/group|awk -F':' '{print $3}'|sort|more 0 1 10 100 12 13 14 15 19 2 20 2002 2004 21 FICHERO /ETC/SHELLS [root@localhost /etc]# ls -al shells -rw-r--r-- 1 root root 66 ene 1 21:49 shells [root@localhost /etc]# cat shells|more /bin/bash /bin/sh /bin/ash /bin/bsh /bin/bash2 /bin/tcsh /bin/csh CUIDADO ! PELIGRO DE ESTAR COMO ROOT -- Si escribo en la shell bash3 (no existe) para root -- al intentar entrar en la mรกquina root -- NO PUEDE -- HAY QUE REINSTALAR LA MAQUINA -- NUNCA MAS PODRIA ENTRAR ASIGNACION DE PASSWORD AL USUARIO
93
Despues de actualizar el fichero /etc/passwd hay que asignar assword Comando: passwd martin8 asigna una passwd al usuario. Se pide confirmación de la passwd sin que aparezca en pantalla. NO SE PUEDE PONER LA PASSWD A MANO ENCRIPTADA EN EL FICHERO SHADOW. Comando passwd -f martin8 fuerza al usuario a cambiar la passwd al entrar en el sistema la próxima vez. Clave: spell --> determina si una palabra está en el diccionario interno de UNIX [root@localhost /etc]# echo xhgss|spell xhgss [root@localhost /etc]# echo martingvalle|spell martingvalle la palabra xhgss no se encuentra en el diccionario Las passwd se deben cambiar cuando: un usuario deja el sistema el administrador deja el sistema muchas de las cuentas debian estar bloqueadas y no lo estan Realizan instalación (Oracle, AIX) FICHERO /ETC/SHADOW Solaris, En AIX /etc/security/passwd user:passwd:lastchg:min:max:inactive:expire:flag user: nombre del usuario passwd: passwd encriptada lastchg: Número del día desde el 1 enero de 1970 hasta la fecha que fue modificada por ultima vez min: Numero minimo de dias requeridos entre cambios max:Numero maximo de dias que la passwd es valida warn: Número de dias, antes de que la passwd caduque, que el usuario es avisado. inactive: Fecha en la que caduca la passwd. Si no entra en el sistema 2 dias caduca. flag: no se usa Valores por defecto en: Solaris: /etc/default/passwd AIX: /etc/security/user
94
CREAR DIRECTORIO HOME Después de añadir el usuario en el fichero /etc/passwd hay que crear el directorio donde se entra al hacer logi. mkdir /home/martin8 (AIX, Linux) mkdir /export/home/martin8 El directorio donde se encuentran los usuarios depende de cada sistema. CREAR FICHEROS DE CONFIGURACIÓN Al entrar en la cuenta se leen una serie de ficheros de configuración para todos los usuarios del sistema. Estos ficheros son: /etc/profile : shells ksh, bash /etc/.login : shells csh, tchs En estos ficheros se encuentran las variables de entorno como PATH, umask, etc. SOLO ROOT PUEDE MODIFICR ESTOS FICHEROS GENERALES. Una vez leidos los ficheros generales se leen los particulares para cada usuario: .cshrc y .login para csh, tcsh .bash_profile y .profile para bash .profile para ksh En estos ficheros se encuentran variables de entorno particulares de cada usuario: Definición del prompt PS1 Definición del path Definición de alias (.kshrc) Redefinición de umask ASIGNAR PROPIEDAD DE LOS FICHEROS Una vez creada la cuenta para un determinado usuario hay que aignarle la propiedad de los ficheros ya que hata el momento hemos estado trabajando como root. chown -R martin8:users /home/martin8 La opción -R cambia la propiedad del directorio y todos los ficheros que este contiene
CREACIÓN AUTOMÁTICA DE USUARIOS Crear usuario: nombre : martin10 home: /home/martin10 grupo : especial 95
shell : bash PASOS: Crear grupo (Puede que al crear un usuario le asigne un grupo que aun no existe) groupadd -g 2200 especial Crear usuario useradd -m -d/home/martin10 -u 2000 -c ''Martín GV 5404" -g 2200 -s/usr/local/bin/bash martin10 Borrar usuario userdel -r martin10 En AIX --> mkuser HERRAMIENTAS DE ADMINISTRACIÓN GRÁFICAS Las herramientas de administración actuales realizan esta labor de forma más sencilla mediante menus. AIX --> smitty (modo texto), smit (gráfico) SOLARIS --> admintool (modo gráfico) LINUX startx (Gnome, KDE) USUARIOS ESTANDAR EN UNIX Todas las versiones de UNIX predefinen un número determinado de usuarios. Los UID de estos dependen del sistema UXIS en particular. Usuarios: root Usuario con UID=0, el superusuario. Tiene acceso a todas las partes del sistema daemon Se usa para ejecutar servicios de servidor del sistema. Este usuario sirve para ser propietario de estos procesos y garantizar que se ejecutan con los permisos adecuados. bin 96
es el propietario de la mayoria de los comandos de usuario sys Usuario al que pertenecen los archivos del sistema cron, news, mail, lp Usuarios necesarios para ejecutar procesos que corresponden a sus respectivas tareas. A todos estos usuarios nunca se realiza login excepto root. Por esta razón sus cuentas deben estar bloqueadas. bin:*:11688:0:99999:7::: daemon:*:11688:0:99999:7::: adm:*:11688:0:99999:7::: lp:*:11688:0:99999:7::: /etc/shadow GRUPOS ESTÁNDAR EN UNIX LOs sistemas UNIX definen un conjunto de grupos estandar en /etc/group system o root Grupo con GID = 0, en algunos sistemas solo estos usuarios tienen acceso a ser root a traves del comando su. daemon Grupo propietario de los servidores del sistema kmen o mem Grupos con GID=2. A este grupo pertenecen programas que leen la memoria del kernel directamente. sys A este grupo pertenecen varios ficheros del sistema user, staff. other Corresponde al grupo por defecto de todos los usuaros si no se dice nada.
AT
97
Permite decir al sistema que os ejecute un proceso en una hora y fecha determinada. At <hora>:minuto> [<dia>/<mes>/<año>] Introducimos la orden y pulsamos CTRL+d para salirnos. Salida nos la muestra por mail. Para comprobar los comandos ejecutados con at: Atq – podremos ver los procesos pendientes de ejecucion Atrm --< borramos un proceso esperando a ser ejecutado pasandole el numero de identificacion de la tarea. EJEMPLO At 22:30 Ls CTRL.+D Atq visualizo los trabajos pendientes Se muestra en el correo el resultado. [root@martin /root]# date lun ago 12 17:34:27 CEST 2002 [root@martin /root]# at 17:36 at> ls -la at> <EOT> [PULSO CTRL+D] job 1 at 2002-08-12 17:36 [root@martin /root]# atq 1 2002-08-12 17:36 a ARCHIVOS DE CONFIGURACIÓN Al entrar en el sistema se realizan las siguientes acciones: SHELL DE COMANDOS : Se ejecuta la shell de comandos (ksh en AIX, csk en SOLARIS, bash en LINUX, etc...) CONFIGURACION GENERAL : Se lee el fichero de configuración general de usuarios, normalmente /etc/profile (ksh), /etc/.login (csk) CONFIGURACIÓN PARTICULAR : Se lee el fichero de configuración de cada usuario : /home/martin/.profile ó /home/martin/.login El sistema aparece en el directorio home del usuario. El directorio home del usuario se configura al crear dicho usuario y los datos se encuentran entre otros ficheros en /etc/passwd Características de la shell de comandos Podemos avanzar o retroceder comandos con las teclas de dirección Completar comandos con el tabulador. 98
Ficheros de configuración de cada usuario .profile .bash_profile--> Define las variables de entorno, PATH, MANPATH, DISPLAY, propias de cada usuario. .kshrc o .bashrc--> Define los alias de los usuarios que corresponden a comandos redefinidos para cada usuario. .emacs --> configuración particular del editor emacs .mailrc --> Fichero de configuración de alias para el correo .Xdefault --> Fichero de configuración de las XWindows .exrc --> Fichero de configuracion vi. .bash_history --> historia de comandos Todos los ficheros de configuración suelen comenzar por . (OCULTOS) SHELL Es el interprete de comandos de UNIX. Hay diversas shell a elegir. Una shell sería como el archivo command.con en MS-DOS donde se encuentran los comandos: dir, etc. Para pasar de una shell a otra basta con esribir el nombre de la shell y para salir de ella tan solo escribir exit. martin8@NODE:/home/martin8> sh martin8@NODE:/home/martin8> ps PID TTY TIME CMD 712 pts/0 00:00:00 bash 738 pts/0 00:00:00 sh 739 pts/0 00:00:00 ps martin8@NODE:/home/martin8> exit exit martin8@NODE:/home/martin8> ps PID TTY TIME CMD 712 pts/0 00:00:00 bash 740 pts/0 00:00:00 ps Para mostrar las diferentes shell disponibles en nuestro sistema : chsh -l martin8@NODE:/home/martin8> chsh -l /bin/bash /bin/sh /bin/ash /bin/bsh /bin/bash2 /bin/tcsh /bin/csh Para las distintas shell: shell sh y ksh o /etc/profile o .profile 99
shell bash o .bash_profile o .bashrc shell csh o .login o .cshrc Yo puedo cambiar de shell martin8@NODE:/home/martin8> /bin/csh [martin8@localhost ~]$ whoami martin8 [martin8@localhost ~]$ /bin/bash Para salir de shell EXIT
Fichero .PROFILE # .bash_profile # User specific environment and startup programs PATH=$PATH:$HOME/bin USERNAME="" export USERNAME PATH NODE='hostname' export NODE #cambiar el prompt PS1='$USER@NODE:$PWD> ' export PS1 #Lenguaje LANG=Es_ES LANG=C export LANG #especificar editor VISUAL=vi export VISUAL #Asignar paths PATH=$PATH:$HOME/bin:.: export PATH 100
#permisos de acceso umask 022 if [ -s "$MAIL" ] then echo "$MAILMSG" fi Para cambiar PS1 también Ps1="[ \u@\h \w]\\$" [root@martin /root]# PS1="$user@$pwd>" @> NO PUEDO MODIFICAR EL FICHERO ETC/PROFILE, solo root pero si pudo modificar el particular bash_profile. \u usuario \h nombre del host \w pwd Si yo quiero ver por pantalla un $, como en UNIX es identificativo de variable le antepongo un carácter para quitarle el valor \$ (asi saca por pantalla el carácter $) @>PS1="[\u@\h \w]\\$" [root@martin ~]# [root@martin ~]#PS1="Hola usuario \u estas en la maquina \h y dir \w >" Hola usuario root estas en la maquina martin y dir ~ > Algunas variables y como se pueden mostrar por pantalla [root@localhost martin8]# echo $HOME /root [root@localhost martin8]# echo $SHELL /bin/bash [root@localhost martin8]# echo $MAIL /var/spool/mail/martin8 [root@localhost martin8]# echo $PS1 [\u@\h \W]\$ Cuando hay mail lo envia a ese directorio. Escribir un mail y comprobar el contenido del fichero martin8.
FICHERO .KSHRC o .BASHRC # .bashrc # User specific aliases and functions alias cp='cp -i' 101
alias mv='mv -i' alias ls='ls -F' alias lls='ls -la -F' alias grep='grep -i' alias df='df -k' alias purge='rm -f *~ .*~ *%'
FICHERO .mailrc alias martin martingv@repsol-ypf.es alias pedro pedro@dmr.es alias goti ffe@open.es alias jose jose.fm@pricewaterhouse.es
Fichero .exrc set number set showmode
ALIAS ls='ls -F' Si es un fichero indica al final * Si es un directorio indica al final \ martin8@NODE:/home/martin8> ls marto/ seg/ treso martin8@NODE:/home/martin8> chmod 777 treso martin8@NODE:/home/martin8> ls marto/ seg/ treso* ALIAS ALIAS es un comando que nos permte abreviar, es decir puedo crear un alias llamado ls que siempre que lo escriba me ejecute realmente ls -a, sin tener que escribir -a. Para poder realizar esto: alias ls='ls -a' Siempre entre comillas simples ya que es un comando. Ejemplo
102
martin8@NODE:/home/martin8> alias ls="ls -a" martin8@NODE:/home/martin8> ls . .bashrc .gnome-help-browser basura lola2 seg .. .cedit .gnome_private err lolo slink .ICEauthority .emacs .mailrc hlink l? smartin1 .Xauthority .enlightenment .mc hmartin1 martin1 smartin2 .bash_history .fichero.swp .netscape index martin2 treso .bash_logout .gnome .profile l martin3 .bash_profile .gnome-desktop .screenrc lola marto martin8@NODE:/home/martin8> unalias ls martin8@NODE:/home/martin8> ls basura hlink index lola lolo martin1 martin3 seg smartin1 treso err hmartin1 l lola2 l? martin2 marto slink smartin2 Para eliminar un alias se escribe UNALIAS ls.
EJERCICIOS GENERALES 1) Crear un directorio ejecutables y colocar este script de nombre martin1 que contenga el siguiente c贸digo. comprobar a cambiar permisos, a ejecutarlo, a que otro usuario intente ejecutarlo, etc. martin8@NODE:/home/martin8> cat martin1 #!/bin/sh if [ $# = 0 ] then echo "Hay que poner al menos un argumento" exit fi echo "Hay : " $# "argumentos" echo "El primero es : "$1 exit martin8@NODE:/home/martin8> martin1 Hay que poner al menos un argumento martin8@NODE:/home/martin8> martin1 p e Hay : 2 argumentos El primero es : p martin8@NODE:/home/martin8> martin1 cari Hay : 1 argumentos El primero es : cari 2) Inspeccionar los ficheros /etc/profile y .profile Cambiar el prompt PS1 por otro a vuestro gusto.
103
3) Quitar un alias del fichero .bashrc y probar como funciona el comando. Por ejemplo cp -i, mv -i, ls. Definir un alias que se llame quien soy y que ejecute el comando whoami 4)Mostrar la variable PATH 5) ejecutar history y uno de los ultimos comandos ejecutados utilizando !nÂş comando. 6) Crear soft link y hard link respecto al fichero martin1. Comprobar que con hmartin1 y smartin1 funciona pero comprobar tambien lo que ocurre si se mueve o modifica el fichero orginal martin1. martin8@NODE:/home/martin8> ln -s martin1 smartin1 martin8@NODE:/home/martin8> smartin1 Hay que poner al menos un argumento martin8@NODE:/home/martin8> ln martin1 hmartin1 martin8@NODE:/home/martin8> hmartin1 Hay que poner al menos un argumento martin8@NODE:/home/martin8> rm martin1 martin8@NODE:/home/martin8> smartin1 sh: smartin1: command not found martin8@NODE:/home/martin8> hmartin1 Hay que poner al menos un argumento 7)Crear un directorio llamado basura y crear con el comando touch varios ficheros. Algunos de ellos llamados core.. utilizar comando find para buscarlos. martin8@NODE:/home/martin8> find /home/martin8/* -name "core*" -type f -print /home/martin8/basura/core /home/martin8/basura/core3 /home/martin8/basura/core4 /home/martin8/basura/core5 8) ÂżCuantos ficheros core hay en ese directorio? martin8@NODE:/home/martin8> find ./basura/* -name "core*" -type f -print|wc -l 4 9) Borrar lo ficheros core utilizando -exec del comando find. martin8@NODE:/home/martin8> find ./basura/* -name "core*" -type f -exec \ > rm -i {} \; 10) Crear d nuevo el directorio basura y dentro ficheros core. utilizando el comando find asignar permisos 777 a todos los ficheros. martin8@NODE:/home/martin8> touch ./basura/core1 martin8@NODE:/home/martin8> touch ./basura/core2 martin8@NODE:/home/martin8> touch ./basura/core3 martin8@NODE:/home/martin8> find ./basura/ -type f -exec chmod 777 {} \; martin8@NODE:/home/martin8> cd basura martin8@NODE:/home/martin8/basura> ls -la 104
total 8 drwxr-xr-x 2 martin8 users 4096 Feb 25 13:26 ./ drwxrwxrwx 12 martin8 users 4096 Feb 25 13:13 ../ -rwxrwxrwx 1 martin8 users 0 Feb 25 13:13 core* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:26 core1* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:26 core2* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:26 core3* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:13 core4* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:13 core5* 11) quitar permiso de escritura a los core a nivel de todos. 12) Buscar los ficheros que tienen permisos SUID o SGID 13) Mostrar los ficheros que se llamen inetd* dentro del directorio /etc/ martin8@NODE:/home/martin8/basura> ls -la /etc/*|grep "inetd" -rw-r--r-- 1 root root 3023 Jan 28 10:40 /etc/inetd.conf ls: /etc/default: Permission denied 14) Comprobar que elproceso de TCP llamado inetd esta arrancado martin8@NODE:/home/martin8/basura> ls -la /etc/*|grep "inetd" -rw-r--r-- 1 root root 3023 Jan 28 10:40 /etc/inetd.conf ls: /etc/default: Permission denied 15) Crear el siguiente fichero y responder a esas preguntas: martin8@NODE:/home/martin8/basura> cat > cuentas 1 ESP 2 ESP 1 POR 3 ING 3 ESP 4 SUI 5 FRA 5 ALE a) 多Cuantas lineas hay en el fichero? b) 多 cual es el mayor de ellos? c) 多Cual es el menor de ellos? d) 多En cuantos paises puede ser utilizado la 1? e) Modificar POR por PTG martin8@NODE:/home/martin8/basura> sed -n s/POR/PTG/p cuentas 1 PTG
105
6) Ejecutar el siguiente script llamado martin2 martin8@NODE:/home/martin8> cat martin2 #!bin/sh while [1 -le 2 ] do if [ 2 -le 1 ] then echo "imposible"; fi done
COMUNICACION CON USUARIOS Realizable mediante ordens WRITE, WALL, TALK, MAIL y mensaje del dia. WRITE write <username> [tty] bash$ whoami martin6 bash$ write martin8 nos vemos en el jamaicano Message from martin6@localhost.localdomain on pts/1 at 13:18 ... nos vemos en el jamaicano EOF Si hubiera un usuario conectado a varios terminales habria que especificar por cual sacar el mensaje. Realizarlo mediante el comando who. el usuario puede estar en un host distinto tty se usa cuando un usuario ha realizado varios logins para identificar una de sus terminales who y finger se puede utilizar para saber quien ha realizado login Al escribir el mensaje pulsar CTRL+D para terminar bash$ finger Login Name Tty Idle Login Time Office Office Phone martin6 Martinv6 pts/1 Feb 26 13:16 (192.168.0.2) martin8 pts/0 4 Feb 26 10:46 (192.168.0.2) root root *tty1 57 Feb 26 11:35 root root pts/2 45 Feb 26 12:37 (:0) bash$ who root tty1
Feb 26 11:35 106
martin8 pts/0 Feb 26 10:46 root pts/2 Feb 26 12:37 martin6 pts/1 Feb 26 13:16 WALL Wall lo que realiza es mandar un mensaje a todo el mundo, por ejemplo para avisar que se va a apagar el servidor y hay que guardar trabajos. bash$ wall vamos a cerrar el sistema, apagen los equipos y salven los trabajos. Lucas. bash$ Broadcast message from martin6 (pts/1) Tue Feb 26 13:24:56 2002... vamos a cerrar el sistema, apagen los equipos y salven los trabajos. Lucas. TALK Versi贸n m谩s sofisticada de write que utiliza dos ventanas para poder hablar entre dos usuarios. El primer usuario establece un talk <nombre de usuario> Tras la recepci贸n el segundo usuario debe escribir un talk <npmbre d usuario que le ha pedido> se establece la comunicaci贸n bidireccional Unusuario puede deshabilitar los write y talk mediante mesg n (incluible en .profile) Si se envian por root se reciben en cualquier caso CRTL+C para salir bash$ whoami martin6 bash$ talk martin8 Message from Talk_Daemon@localhost.localdomain at 13:31 ... talk: connection requested by martin6@localhost.localdomain. talk: respond with: talk martin6@localhost.localdomain talk martin6
107
Deshabilitamos mensajes: bash$ whoami martin6 bash$ mesg n martin8@NODE:/home/martin8> write martin6 write: martin6 has messages disabled MENSAJE DEL DIA En el fichero de /etc/motd se escribe un mensaje que aparece siempre que hace alguien login. [root@localhost /etc]# ls -la motd -rw-r--r-- 1 root root 31 feb 26 13:44 motd [root@localhost /etc]# pwd /etc [root@localhost /etc]# cat motd bienvenido amigos al trabajo! MENSAJE ANTES DE HACER LOGIN La informaci贸n se encuentra en el fichero /etc/issue [root@localhost /etc]# pwd /etc 108
[root@localhost /etc]# cat issue Red Hat Linux release 6.2 (Zoot) Kernel 2.2.14-5.0 on an i586 BIENVENIDOS AL SERVIDOR LINUX MARTIN Habrá que reiniciar el quipo?
FINGER - WHO - CHFN - ID Indica las personas actualmente en el sistema martin8@NODE:/home/martin8> who root tty1 Mar 1 11:02 martin8 pts/0 Mar 1 10:29 martin8@NODE:/home/martin8> finger Login Name Tty Idle Login Time Office Office Ph one martin8 martin garcia valle pts/0 Mar 1 10:29 (192.168.0.2) root root *tty1 Mar 1 11:02 Para ver la información personalizada de un usuario: martin8@NODE:/home/martin8> finger martin8 Login: martin8 Name: Martín GV Directory: /home/martin8 Shell: /bin/bash Office: REPSOL-YPF SITEMAS I, x5404 Home Phone: x5404 On since Fri Mar 1 10:29 (CET) on pts/0 from 192.168.0.2 Mail last read Tue Feb 26 13:11 2002 (CET) Si deseamos cambiar la información de finger, tal como nombre, numero d oficina, etc... CHFN martin8@NODE:/home/martin8> chfn Changing finger information for martin8. Password: Name [Martín GV]: Martín García V Office [REPSOL-YPF SITEMAS I]: REPSOL-YPF SISTEMAS II Office Phone [5404]: Home Phone [5404]: 3312 Finger information changed. martin8@NODE:/home/martin8> finger martin8 Login: martin8 Name: Martín García V Directory: /home/martin8 Shell: /bin/bash Office: REPSOL-YPF SISTEMAS II, x5404 Home Phone: x3312 On since Fri Mar 1 10:29 (CET) on pts/0 from 192.168.0.2 Mail last read Tue Feb 26 13:11 2002 (CET) 109
ID martin8@NODE:/home/martin8> id uid=2003(martin8) gid=100(users) groups=100(users)
FTP El comando ftp (File transfer Protocol) es un programa utilizado para la transferencia de archivos entre dos sistemas. ftp nº IP o nombre de la maquina ala que queremos conectarnos. O tambien podemos ejecutar el comando ftp Nos sale > y abrimos la sesion de ftp con: Open 192.168.0.2 A continuación introducimos nuestro username y contraseña. Comandos principales: comando User usuario Cd directorio bin ascii hash Get archivo Put archivo ls Mget expresion Mput expresion Quit o bye ¡comando (lcd)
Envia el identificador usuario a la mquina remota Cambia de directorio Utiliza el modo de transferencia binario Utiliza el modo de transferencia ascii texto. Imprime la cantidad de bytes que se ha transmitido Transfiere archivo desde la maquina remota a la maquina local Transfiere archivo desde la local a la remota Lista el contenido Transfiere todos los archivos que se ajusten a la expresion desde la remota a la local Desde local a remota Cerrar sesion Ejecuta comando en la maquina local
Carpeta incoming Usuario anonymous PING Ping 192.168.0.2
110
Interrumpir CTRL+C EJEMPLO DE TELNET, WHO, WHO AM I Y WRITE Abrimos dos sesiones telnet, para ello ejeutamos en Windows (Inicio/ejecutar/telnet) Selecionamos Conectar/Sistema remoto/dirección IP de la máquina UNIX Entramos nombre y contraseña (en este ejemplo martin8 y martin6) Cada entrada distinta es realizada desde un pseudo-terminal (pts/0 y pts/1)
Con el otro usuario realizamos el comando who que nos muestra los usuarios conectados al sistema y como aceden a el. Y con el comando whoami sabemos quienes somos nosotros mismos. Este comando es util cuando entramos en UNIX con varios usuarios y no sabemos en que momento que usuario estamos utilizando.
Imaginemos que queremos enviar un mensaje a martin6 y como vemos en el comando se encuentra en el pseudoterminal pts/0. Para ello debemos hacer: Nos situamos en martin8 (fijrse que martin8 tiene abiertas dos sesiones) y que le quiere enviar un mensaje a martin6. Para ello desde martin8 escribimos: [martin8@localhost martin8]$ write martin6 pts/0 y en la pantalla de martin6 le saldrá: Message from martin8@localhost.localdomain on pts/1 at 11:09 ... Y lo que escribiera martin8 saldría en la pantalla de martin6 111
Si martin6 le desea contestar como al principio informaba del usuario y su terminal utilizado le puede contestar utilizando la misma sentencia: write martin8 pts/0
PARA SALIR CTRL+D
112
Si por ejemplo ha entrado el usuario root en la mรกquina central UNIX en lugar de un pseudoterminal emplearรก un terminal y se denomina tty.
INETD.CONF Fichero de servicios de TCP/IP /etc/inetd.conf # These are standard services. # ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd # # Shell, login, exec, comsat and talk are BSD protocols. # shell stream tcp nowait root /usr/sbin/tcpd in.rshd login stream tcp nowait root /usr/sbin/tcpd in.rlogind #exec stream tcp nowait root /usr/sbin/tcpd in.rexecd #comsat dgram udp wait root /usr/sbin/tcpd in.comsat talk dgram udp wait nobody.tty /usr/sbin/tcpd in.talkd Si ponemos # comentario en el servicio no accedemos a el. Y no se puede realizar en dicho servidor. Ejemplo: Entro con ftp por martin8 desde msdos ftp 192.168.0.1 Desde el servidor visualizo que procesos estan funcionando [root@martin /etc]# ps -fe|grep inetd root 493 1 0 10:10 ? 00:00:00 inetd root 960 726 0 11:25 pts/1 00:00:00 grep inetd [root@martin /etc]# ps -fe|grep ftp 113
martin8 953 493 0 11:24 ? root 962 726 0 11:25 pts/1
00:00:00 ftpd: pequeño: martin8: IDLE 00:00:00 grep ftp
MATO EL PROCESO DE FTP PARA QUE NO PUEDA REALIZAR NADA [root@martin /etc]# kill -9 953 [root@martin /etc]# ps -fe|grep ftp root 964 726 0 11:27 pts/1 00:00:00 grep ftp Microsoft(R) Windows 98 (C)Copyright Microsoft Corp 1981-19 C:\WINDOWS>ftp 192.168.0.1 Conectado a 192.168.0.1. 220 martin FTP server (Version wu-2.6. Usuario (192.168.0.1:(none)): martin8 331 Password required for martin8. Contraseña: 230 User martin8 logged in. ftp> ls Conexión cerrada por el host remoto. PARA EVITARLO CIERRO EL PROCESO INETD Y COMENTARIO EN FTP Y REINICIAR SISTEMA. TTY Terminal utilizado [root@martin /root]# tty /dev/pts/0 LOGNAME Nombre del usuario [root@martin /root]# logname martin UNAME Indica información del sistema Úname –a (muestra toda la información) (-m, -n –v –s –x ) muestran solo información parcial [root@martin /root]# uname Linux [root@martin /root]# uname -a Linux martin 2.2.14-5.0 #1 Tue Mar 7 20:53:41 EST 2000 i586 unknown 114
MONTADO DE SISTEMA DE ARCHIVOS El montado de un disco hace que los contenidos de este sean accesibles por los usuarios del sistema, insertandolo dentro del arbol de directorios. Los sistemas de archivos son accedidos a través de los ficheros especiales contenidos en /dev archivos especiales de dispositivos del sistema Los sistemas de archivos montados en un directorio toma el nombre de dicho directorio y todo lo que se escriba en el se escribirá en dicho sistema. Si se desmonta un sistema de archivos la información no se pierde unicamente queda inaccesible lógicamente para acceder a ella. Un sistema de archivo solo puede ser montado una vez sobre un punto de montaje único, no pudiendo existir dos veces. MONTAR Mount –archivo especial –punto de montaje El directorio donde se monta debe existir previamente. Mount – muestra actualmente los sistemas de archivos montados [root@martin /]# mount /dev/hda6 on / type ext2 (rw,usrquota,grpquota) none on /proc type proc (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) Normalmente lo mas usado es : /dev/cdrom /dev/fd0 /dev/hda6 situados en /dev Ejemplo montar la disquetera [root@martin /dev]# ls cdrom cdrom [root@martin /dev]# mount /dev/fd0 /mnt/floppy [root@martin /dev]# cd /mnt/floppy [root@martin floppy]# ls read [root@martin floppy]# mount /dev/hda6 on / type ext2 (rw,usrquota,grpquota) none on /proc type proc (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) 115
/dev/fd0 on /mnt/floppy type vfat (rw) Escribo algo en ella [root@martin floppy]# ls read [root@martin floppy]# cat > martin Hola ...[root@martin floppy]# [root@martin floppy]# ls martin read [root@martin floppy]# cat martin Hola ...[root@martin floppy]# DESMONTAR Umount nombre Para desmontar no debo estar en dicho directorio Hola ...[root@martin floppy]# umount /dev/fd0 umount: /mnt/floppy: device is busy Me voy del directorio [root@martin floppy]# cd .. [root@martin /mnt]# umount /dev/fd0 [root@martin /mnt]# mount /dev/hda6 on / type ext2 (rw,usrquota,grpquota) none on /proc type proc (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) Al desmontar en dicho directorio no hay nada pero luego al volver a montar encuentro lo antes escrito [root@martin floppy]# ls [root@martin floppy]# cd .. [root@martin /mnt]# mount /dev/fd0 /mnt/floppy [root@martin /mnt]# cd floppy [root@martin floppy]# ls martin read MOUNT –r (SOLO LECTURA) [root@martin /mnt]# mount -r /dev/fd0 /mnt/floppy [root@martin /mnt]# ls cdrom floppy [root@martin /mnt]# cd floppy [root@martin floppy]# ls martin read [root@martin floppy]# touch b touch: b: Sistema de ficheros de sólo lectura
116
Por ejemplo el CDROM [root@martin /dev]# mount -r /dev/cdrom /home/cd [root@martin /dev]# mount /dev/hda6 on / type ext2 (rw,usrquota,grpquota) none on /proc type proc (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) /dev/fd0 on /mnt/floppy type vfat (ro) /dev/hdd on /home/cd type iso9660 (ro) [root@martin /dev]# cd /home/cd [root@martin cd]# ls anaya autorun.inf instalar.cfg qt16.exe vb40032.dll autorun.exe demo instalar.exe spanish.txt [root@martin cd]# cd .. [root@martin /home]# umount /dev/cdrom [root@martin /home]# mount /dev/cdrom /home/cd mount: block device /dev/cdrom is write-protected, mounting read-only CUIDADO EL CDROM ES DE SOLO LECTURA TIENE QUE HABER CD DENTRO. No se puede desmontar un sistema si hay alguien en ese directorio. Comando para probar si se está utilizando: fuser –u /dev/cdrom SOLO PUEDE MONTAR Y DESMONTAR ROOT martin8@NODE:/home/martin8> umount /dev/cdrom umount: /dev/hdd is not in the fstab (and you are not root) aunque mount si se puede visualizar. OPCION MOUNT –a MONTA LOS SITEMAS ESPECIFICADOS EN /ETC/FSTAB [root@martin /etc]# mount /dev/hda6 on / type ext2 (rw,usrquota,grpquota) none on /proc type proc (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) [root@martin /etc]# mount -a [root@martin /etc]# mount /dev/hda6 on / type ext2 (rw,usrquota,grpquota) none on /proc type proc (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) /dev/fd0 on /mnt/floppy type vfat (rw) FSTAB [root@martin /etc]# cat /etc/fstab /dev/hda6 / ext2 exec,dev,suid,rw,usrquota,grpquota 1 1 /dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0 117
/dev/fd0 none none /dev/hda7
/mnt/floppy /proc /dev/pts swap
auto auto 00 proc defaults 00 devpts gid=5,mode=620 0 0 swap defaults 00
auto, no auto monta automaticamente con la opcion –a
CERRAR SISTEMA SHUTDOWN CTRL+ALT+SUPR
118
SHELL SCRIPTS TEORIA Lenguaje de programación cuya secuencia de líneas de comandos se almacenan en un archivo de texto y que cuando el interprete de comandos lo ejecuta lo realiza como si lo hubiera escrito en el terminal. Primer script martin8@NODE:/home/martin8> cat ej8 #!/bin/bash clear echo "hola que tal" martin8@NODE:/home/martin8> ls -l ej8 -rw-r--r-- 1 martin8 users 33 Mar 2 00:20 ej8 martin8@NODE:/home/martin8> chmod 744 ej8 (CAMBIAMOS PERMISOS) martin8@NODE:/home/martin8> ej8 (EJECUTAMOS) hola que tal Ejecutarlo: * bash ej8 * permiso de ejecución y ejecutamos. CUIDADO VER EL PATH=.:$PATH:$HOME/bin PODRIAMOS PONER: pico /etc/profile añadir al PATH :. Ejecutarlo como ./ej8 variar la variable PATH PATH=$PATH:. desde la linea de comandos y posteriormente escribir ej8 (sin el punto ni la barra) Otro script martin8@NODE:/home/martin8> cat > f1 este es f1 martin8@NODE:/home/martin8> cat > f2 este es f2 martin8@NODE:/home/martin8> cat > f13 cat f1 f2 martin8@NODE:/home/martin8> f13 este es f1 este es f2 COMENTARIOS #Esto es un comentario CUIDADo LA PRIMERA LINEA DE UN SHELL SCRIPT AVISA DEL INTERPRETE A REALIZARLO #! /bin/bash 119
VARIABLES No hay que declarar variables Asignar valor x=5 NO DEJAR ESPACIO ENTRE IGUAL Y VARIABLE, NI ENTRE IGUAL Y EL VALOR CUANDO QUEREMOS UTILIZAR EL VALOR DE VARIABLE --> $ Creación var=Madrid Verla --> echo $var ASignación directa martin8@NODE:/home/martin8> var="Ciudad Real" martin8@NODE:/home/martin8> echo $var Ciudad Real martin8@NODE:/home/martin8> var="Ciudad Real" martin8@NODE:/home/martin8> echo $var Ciudad Real martin8@NODE:/home/martin8> echo "$var" Ciudad Real RESPETA LOS ESPACIOS EN BLANCO SI HAY MAS DE UNO Asignación interactiva READ Lee del teclado martin8@NODE:/home/martin8> read var Ciudad del Mar martin8@NODE:/home/martin8> echo $var Ciudad del Mar martin8@NODE:/home/martin8> read var2 Ciudad de Mérida martin8@NODE:/home/martin8> echo $var2 Ciudad de Mérida martin8@NODE:/home/martin8> echo "$var2" Ciudad de Mérida martin8@NODE:/home/martin8> read CIUDAD PAIS Madrid España martin8@NODE:/home/martin8> echo $ciudad (CUIDADO ES EN MAYÚSCULAS!) martin8@NODE:/home/martin8> echo $CIUDAD $PAIS Madrid España martin8@NODE:/home/martin8> echo $PAIS España SI SE INTRODUCEN MAS DE LOS VALORES EL PRIMER VALOR TOMARA LA PRIMERA VARIABLE Y LOS SIGUIENTES LA SEGUNDA VARIABLE 120
martin8@NODE:/home/martin8> read CIUDAD PAIS ZONA Madrid Espa単a Hortaleza Ole! martin8@NODE:/home/martin8> echo $CIUDAD Madrid martin8@NODE:/home/martin8> echo $PAIS Espa単a martin8@NODE:/home/martin8> echo $ZONA Hortaleza Ole! VARIABLES DE ENTORNO Variables del sistema man bash Mas importantes: martin8@NODE:/home/martin8> echo $HOME /home/martin8 martin8@NODE:/home/martin8> echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/martin8/bin:/home/martin8/bin: . martin8@NODE:/home/martin8> echo $MAIL /var/spool/mail/martin8 martin8@NODE:/home/martin8> echo $LOGNAME martin8 martin8@NODE:/home/martin8> touch mi$LOGNAME martin8@NODE:/home/martin8> ls mimartin8 mimartin8 martin8@NODE:/home/martin8> echo $PS1 $USER@NODE:$PWD> martin8@NODE:/home/martin8> echo $PS2 > martin8@NODE:/home/martin8> echo $HOSTNAME localhost.localdomain martin8@NODE:/home/martin8> HOSTNAME="SISTEMA1" martin8@NODE:/home/martin8> echo $HOSTNAME SISTEMA1 martin8@NODE:/home/martin8> echo $MAILCHECK 60 (CADA CUANTOS SEG SE CHEQUEA MAIL) martin8@NODE:/home/martin8> echo $SHELL /bin/bash (SHELL POR DEFECTO)
ARGUMENTOS Los comandos y scripts pueden recibir argumentos al ser ejecutados Para utilizar los argumentos utilizamos variables 121
Los 9 primeros argumentos --> $1, $2, $3 ... $0 --> nombre del script VARIABLE # --> numero de argumentos ($#) VARIABLE @ o * --> almacena todos los argumentos empezando por el 1 VARIABLE $ --> almacena el PID del proceso en ejecuci贸n VARIABLE ? --> estado de terminaci贸n del ultimo comando ejecutado. VARIABLE ! --> PID del ultimo proceso en background Ejemplo: #!/bin/bash a=1 x=28 y=x z=$x echo $a echo ${a} echo $x echo $y echo $z echo " el 0 es $0" echo " el 1 es $1" echo " el 2 es $2" echo " el 3 es $3" echo " el numero de argumentos es $#" echo "todos los argumentos desde el 1 $@" echo "todos los argumentos desde el 1 $*" echo "el PID del proceso en ejecucion es $$" echo "el estado de terminacion del ultimo comando $?" echo " 0 para terminaci贸n correcta y 1 para incorrecta!" cat noeta echo "el estado de terminacion del ultimo comando es $?" martin8@NODE:/home/martin8> ej6 martin es el mejor del mundo bash: unexpected EOF while looking for `'' bash: /home/martin8/.bashrc: line 20: syntax error 1 1 28 x 28 el 0 es ./ej6 el 1 es martin el 2 es es el 3 es el el numero de argumentos es 6 todos los argumentos desde el 1 martin es el mejor del mundo todos los argumentos desde el 1 martin es el mejor del mundo 122
el PID del proceso en ejecucion es 788 el estado de terminacion del ultimo comando 0 0 para terminación correcta y 1 para incorrecta! cat: noeta: No such file or directory el estado de terminacion del ultimo comando es 1 martin8@NODE:/home/martin8> cat poliedros cat: poliedros: No such file or directory martin8@NODE:/home/martin8> echo $? 1 [martin8@localhost martin8]$ ls& [1] 961 [martin8@localhost martin8]$ dicho dicho2 ej6* hmartin1* lolo tin3* saludo2* treso* basura/ ej1* ej7* index lpr marto/ saludo2.save comp ej2* ej8* k lpt1 mimartin8 seg/ comp1 ej3* err l lç pr/ slink@ core ej4 f lola martin1* prueba2 smartin1@ dicho ej5 hlink lola2 martin2* saludo* smartin2@ echo $! 961 [1]+ Done ls -F
mar
En el caso de que haya un proceso en background qu lleve mucho tiempo hacer que lo aniquile. ultimo=$! kill $ultimo (HAY QUE ESCRIBIR $ para que aparezca el valor de la variable) PARAMETROS POSICIONALES El interprete de comandos solo nos permite acceder hasta los 9 primeros argumentos. SOLUCION --> comando shift. Shift desliza los parámetros de la línea de comandos. Hace desaparecer el argumento 1, que toma el argumento 2, el 2 el 3 y asi sucesivamente apareciendo el 10 como el argumento 9 y ahora poder acceder a el. Ejemplo: martin8@NODE:/home/martin8> cat saludo #/bin/bash echo "Hola $*" echo "Hola $1 $2" shift echo "Hola $1 $2" shift echo "Hola $1 $2" shift 123
echo "Hola $1 $2" martin8@NODE:/home/martin8> saludo Dolores María Rosa Jose bash: unexpected EOF while looking for `'' bash: /home/martin8/.bashrc: line 20: syntax error Hola Dolores María Rosa Jose Hola Dolores María Hola María Rosa Hola Rosa Jose Hola Jose Comando set cambia los parámetros [martin8@localhost martin8]$ cat saludo2 #/bin/bash echo "Hola $*" (MUESTRA TODOS LOS ARGUMENTOS) echo "Hola $1 $2" shift echo "Hola $1 $2" shift echo "Hola $1 $2" shift set Martin Pedro Lolo (Asigna a los argumentos dichos valores y quita los anteriores) echo "Hola $1 $2" echo "Hola $1 $2 $3" [martin8@localhost martin8]$ saludo2 Dolores María Rosa Jose Raul Hola Dolores María Rosa Jose Raul Hola Dolores María Hola María Rosa Hola Rosa Jose Hola Martin Pedro Hola Martin Pedro Lolo Otro ejemplo: Vemos que no damos argumentos y aplicamos shift después de SET. Hace lo mismo que aplicando el valor de los argumentos por comando. #/bin/bash echo "Hola $*" echo "Hola $1 $2" shift echo "Hola $1 $2" shift echo "Hola $1 $2" shift set Martin Pedro Lolo echo "Hola $1 $2" 124
echo "Hola $1 $2 $3" shift echo "Hola $1 $2 $3" shift echo "hola $1 $2 $3" Ejecutamos como: [martin@martin martin]$ ej3.sh Hola Hola shift: shift count must be <= $# Hola shift: shift count must be <= $# Hola shift: shift count must be <= $# (DEBE SER MENOR QUE EL NUMERO DE ARGUMENTOS $2… es mas que 0) Hola Martin Pedro Hola Martin Pedro Lolo Hola Pedro Lolo hola Lolo COMILLAS 1. Comilla de tecla de interrogación(números) IMPRIMIRA LA CADENA DE TEXTO TAL CUAL 2. Comilla doble (tecla numerica 2) SUSTITUYE VARIABLES 3. Comilla invertida (tecla abrir corchete y pulsar espacio) Ejecuta comando #!/bin/bash echo 'Nº de argumentos $#' echo "Nº de argumentos $#" echo `ls|wc -w` martin8@NODE:/home/martin8> ej7 bash: ./ej7: Permission denied martin8@NODE:/home/martin8> chmod 766 ej7 martin8@NODE:/home/martin8> ej7 Nº de argumentos $# Nº de argumentos 0 38 VARIABLES GLOBALES
125
Nosotros ejecutamos sobre una shell pero las variables creadas si deseamos que se ejecuten en cualquier otra shell o terminal abierto necesitamos exportarlas mediante EXPORT. Por ejemplo: [martin8@localhost martin8]$ echo $NODE MARTIN export NODE Demostraci贸n: [martin@martin martin]$ MARTIN="Martin" [martin@martin martin]$ sh bash$ echo $MARTIN (LA VARIABLE NO TIENE SIGNIFICADO EN OTRA SHELL) bash$ exit exit [martin@martin martin]$ echo $MARTIN Martin
EJERCICIOS SHELL SCRIPT EJERCICIO Programa que almacena en el archivo oculto .recuerda de mi directorio $HOME una frase determinada que tiene que escribir el usuario (read) martin8@NODE:/home/martin8> cat .recuerda gfg fdg df fd sd ggfdsg gh fgh martin8@NODE:/home/martin8> cat recordar.sh #!/bin/bash echo "Escriba algo para recordar en un fichero .recuerda" read FRASE echo "$FRASE" >> $HOME/.recuerda martin8@NODE:/home/martin8> recordar.sh Escriba algo para recordar en un fichero .recuerda Reunion a las 8 martin8@NODE:/home/martin8> cat .recuerda Reunion a las 8 OTRA FORMA martin8@NODE:/home/martin8> cat recordar2.sh #!/bin/bash clear echo "Escriba algo para recordar en un fichero .recuerda" cat >> $HOME/.recuerda Escriba algo para recordar en un fichero .recuerda 126
hasta luego lucas martin8@NODE:/home/martin8> cat .recuerda gfg fdg df fd sd ggfdsg gh fgh Reunion a las 8 hasta luego lucas EJERCICIO Programa que te lee el fichero creado anteriormente llamando al shell script recordar martin8@NODE:/home/martin8> cat recordar #!/bin/bash clear echo "LAS TAREAS A RECORDAR SON" more $HOME/.recuerda #less $HOME/.recuerda #cat $HOME/.recuerda|more LAS TAREAS A RECORDAR SON Reunion a las 8 hasta luego lucas martin8@NODE:/home/martin8> EJERCICIO Suponiendo que cada linea es una tarea nueva, crer un shell script que diga cuales son las ultimas dos tareas programadas. martin8@NODE:/home/martin8> cat ultima #!/bin/bash echo "LAS ULTIMAS 2 TAREAS PROGRAMADAS SON" cat $HOME/.recuerda|tail -2 martin8@NODE:/home/martin8> ultima LAS ULTIMAS 2 TAREAS PROGRAMADAS SON Reunion a las 8 hasta luego lucas EJERCICIO Igual que el caso anterior pero que admita como parametro el nĂşmero de ultimas tareas programadas (3,4...) martin8@NODE:/home/martin8> cat ultima2 #!/bin/bash echo "LAS ULTIMAS $1 TAREAS PROGRAMADAS SON" cat $HOME/.recuerda|tail -$1
127
martin8@NODE:/home/martin8> ultima2 1 LAS ULTIMAS 1 TAREAS PROGRAMADAS SON hasta luego lucas
COMANDO TEST Nos devuelve 0 si la expresi贸n es verdadera y 1 si es falsa test expresion martin8@NODE:/home/martin8> test "uno" = "dos" martin8@NODE:/home/martin8> echo $? (estado de terminaci贸n del ultimo comando ejecutado) 1 (FALSO) martin8@NODE:/home/martin8> uno=a martin8@NODE:/home/martin8> dos=a martin8@NODE:/home/martin8> test $uno=$dos martin8@NODE:/home/martin8> echo $? 0 (VERDADERO) OPCIONES (exp) ! -- NOT -a --- AND (exp1-a exp2) -o --- OR COMPARACION DE CADENAS C1=C2 -- 0 si son iguales C1!=C2 -- 0 si son diferentes -z C1 -- 0 si la longitud de la cadena es 0 -n C1 --- 0 si la longitud de la cadena es de longitud >0 -l cadena -- evalua la longitud de la cadena de caracteres COMPARACION DE NUMEROS n1 -eq n2 (igual) n1 -ne n2 (no igual) n1 -gt n2 (mayor) n1 -ge n2 (mayor o igual) n1 -lt n2 (menor) n1 -le n2 (menor o igual) COMPARACION DE FICHEROS -e fichero -- verdadero si archivo existe -r fichero --- si el fichero existe y es legible (r) 128
-w fichero -- si el fichero existe y es escribible -x fichero -- si el fichero existe y se puede ejecutar -f si el fichero existe y es normal (no especial) -L fichero -- verdadero si existe y es un enlace link -d fichero -- si el fichero existe y es directorio -s fichero - si el fichero existe y tiene algo archivo1 -nt archivo2 -- verdadero si arch1 ha sido modificado mas recientemente que el archivo2 archivo1 -ot archivo2 -- verdadero si no ha sido modificado mas recientemente test _______ es lo mismo que [b ____b] Ejemplos martin8@NODE:/home/martin8> test "uno" = "dos" martin8@NODE:/home/martin8> echo $? 1 martin8@NODE:/home/martin8> uno=a martin8@NODE:/home/martin8> dos=a martin8@NODE:/home/martin8> test $uno=$dos martin8@NODE:/home/martin8> echo $? 0 martin8@NODE:/home/martin8> test -z uno (la longitud de la variable es 0) martin8@NODE:/home/martin8> echo $? 1 (FALSO) martin8@NODE:/home/martin8> test -n uno (la longitud es >0, si es â&#x20AC;&#x153;aâ&#x20AC;?) martin8@NODE:/home/martin8> echo $? 0 (VERDADERO) martin8@NODE:/home/martin8> test -r ultima2 (si fich existe y es legible r) martin8@NODE:/home/martin8> echo $? 0 martin8@NODE:/home/martin8> test -x ultima2 (si el fich existe y es ejecut) martin8@NODE:/home/martin8> echo $? 0 martin8@NODE:/home/martin8> test -d ultima2 (si es directorio) martin8@NODE:/home/martin8> echo $? 1 martin8@NODE:/home/martin8> test -s ultima2 (si fich existe y tiene contenido) martin8@NODE:/home/martin8> echo $? 0 martin8@NODE:/home/martin8> touch p martin8@NODE:/home/martin8> test -s p (fich esta vacio ď&#x192; creado con touch) martin8@NODE:/home/martin8> echo $? 1 (VACIO) martin8@NODE:/home/martin8> test 3 -eq 4 martin8@NODE:/home/martin8> echo $? 129
1 martin8@NODE:/home/martin8> test 3 -eq 3 martin8@NODE:/home/martin8> echo $? 0 COMANDOS DE CONTROL if condicion then --fi if condicion then ---else ---fi if condicion then --elif condicion then --else ---fi EJERCICIO Realizar un shell script tal que si se introduce algún parametro se cojan las ultimas lineas del fichero .recuerda dado en el parámetro. Si no se introduce parámetro se muestra el fichero completo. martin8@NODE:/home/martin8> cat ej10 #!/bin/bash if [ $# -ne 0 ] then tail -$1 $HOME/.recuerda else cat $HOME/.recuerda fi martin8@NODE:/home/martin8> ej10 gfg fdg df fd sd ggfdsg gh fgh Reunion a las 8 hasta luego lucas martin8@NODE:/home/martin8> ej10 2 130
Reunion a las 8 hasta luego lucas EJERCICIO Realizar un shell script que copie un fichero a un directorio, por tanto el script debera admitir dos argumentos. Comprobar el numero de estos y si corresponden a fichero y directorio. martin8@NODE:/home/martin8> cat copiar|more #!/bin/bash if [ $# -lt 2 ] then echo "ERROR FALTAN ARGUMENTOS" exit 1 else if [ $# -gt 2 ] then echo "HAS INTRODUCIDO MAS PARAMETROS" else if [ -f "$1" ] then if [ -d "$2" ] then cp "$1" "$2" echo "COPIA EFECTUADA!" else echo "error el 2ยบ no es directorio" exit 1 else echo "ERROR el 1ยบ no es fichero" exit 1 fi fi fi martin8@NODE:/home/martin8> copiar ej5 pr COPIA EFECTUADA! Tb se podria hacer: martin8@NODE:/home/martin8> cat copiar2|more #!/bin/bash if [ $# -lt 2 ] then echo "ERROR FALTAN ARGUMENTOS" exit 1 else if [ $# -gt 2 ] then echo "HAS INTRODUCIDO MAS PARAMETROS" 131
else if [ -f "$1" -a -d "$2" ] then cp "$1" "$2" echo "COPIA EFECTUADA!" else echo "error el 2Âş no es directorio" exit 1 fi fi fi EJERCICIO Comprobar si existe correo nuevo. Para comprobarlo basta con comprobar si el fichero donde se deja el mail se encuentra vacio. martin8@NODE:/home/martin8> echo $MAIL /var/spool/mail/martin8 martin8@NODE:/home/martin8> test -s $MAIL (Si el fich tiene contenido) martin8@NODE:/home/martin8> echo $? 1 VACIO martin8@NODE:/home/martin8> cat vermail #!/bin/bash if [ -s $MAIL ] then mail else echo "No hay mensajes $LOGNAME" fi martin8@NODE:/home/martin8> vermail No hay mensajes martin8 martin8@NODE:/home/martin8> mail martin8 Subject: hola hola Cc: martin8@NODE:/home/martin8> vermail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/martin8": 1 message 1 new >N 1 martin8@localhost.lo Sat Mar 2 03:13 13/398 "hola" EJEMPLO IF Realizar un script que lea dos o tres argumentos. Si lee dos el primero es el nombre del articulo y el segundo el precio de dicho artĂculo. El envio para estos casos es de 200 pts fijas.
132
Si recibe 3 argumentos el primer argumento hace rferencia al articulo, el segundo a su precio y el tercero al coste del envio. Hacer un script que muestre articulo, precio y precio de envio. martin8@NODE:/home/martin8> cat > ejif uso="ejif articulo precio coste de envio" if [ $# -eq 2 ] then echo art: $1 precio: $2 envío: 200 pts else if [ $# -eq 3 ] then echo art: $1 precio: $2 envío: $3 else echo "ERROR, el uso es $uso" echo este programa solo permite 2 o 3 argumentos echo "usted ha introducido $# arg.” exit 2 fi fi
martin8@NODE:/home/martin8> ejif ERROR, el uso es ejif articulo precio coste de envio este programa solo permite 2 o 3 argumentos usted ha introducido 0 arg. martin8@NODE:/home/martin8> ejif coche 2000 art: coche precio: 2000 envío: 200 pts martin8@NODE:/home/martin8> ejif vestido 3000 123 art: vestido precio: 3000 envío: 123
CASE case valor in expresion) lineas de comandos;; (detras de la última linea de comandos) expresion) lineas de comandos;; *) lineas e comandos;; (default) esac En expresión podemos incluir: pac? -- un caracter cualquiera pac[ao] - uno de los dos paco|paca palom[a-u] rango 133
EJEMPLO martin8@NODE:/home/martin8> cat cnombre #!/bin/bash echo introduce nombre read nombre case $nombre in pac?) echo "has escrito $nombre";; martin|MARTIN) echo "has escrito el mejor que podias escribir" echo "HAS ESCRITO $nombre";; palo[ao]) echo "Bonito nombre $nombre";; *) echo "Los he visto mejores $nombre";; esac martin8@NODE:/home/martin8> cnombre introduce nombre martin has escrito el mejor que podias escribir HAS ESCRITO martin
EJERCICIO Realizar un script que se llame meayudas seguido de un argumento. Si el argumento es ls se escribirรก "Muestra el contenido del directorio". Si es cd se mostrarรก "Cambia de directorio". y si es cualquier otro comando se llamarรก a man con el comando como parรกmetro. Comprobar que solo se esribe un argumento. martin8@NODE:/home/martin8> cat meayudas #!/bin/bash clear if [ $# -ne 1 ] then echo "NO ES CORRECTO EL NUMERO DE ARGUMENTOS" else case $1 in cd|CD) echo "CD sirve para cambiar de directorio";; ls|Ls|LS|lS) echo "ls sirve para mostrar el cont. dir.";; *) man $1;; esac fi
134
FOR
2 sintaxis: for variable in lista (expr1 expr2) do <linea de comandos> done Cada vez la variable va tomando cada una de la expresiones de la lista uno a uno. for variable do <linea de comandos> done Cada vez la variable va tomando cada uno de los argumentos del script, los valores que se han introducido, como si hubiera puesto $* Caso especial For FICH In * Do <linea de comandos> done ď&#x201A;ˇ
El * ď&#x192; vienen del directorio actual, antes venian de la linea de comandos, de los argumentos.
EJEMPLO Cambiar la propiedad para others con permiso de ejecucion a todos los ficheros del directorio propio. martin8@NODE:/home/martin8> cat sfor #!/bin/bash for fichero in `ls $HOME` do chmod o+x $fichero done Tambien podriamos haber escrito * (directorio actual en lugar de ls...) Pero cuidado, puede que algunos sean directorios o ficheros especiales o no tengan permiso de escritura, por ejemplo por que son de otro usuario, entonces: martin8@NODE:/home/martin8> cat sfor #!/bin/bash for fichero in `ls $HOME` 135
do if [ -f $fichero -a -w $fichero ] then chmod o+x $fichero fi done EJEMPLO Realizar un script que escriba nombres como argumentos hasta un mรกximo de 9 y que diga, Hola amigo (y el nombre), como estas? para cada uno de los nombres martin8@NODE:/home/martin8> cat sfor2 #!/bin/bash if [ $# -gt 9 ] then echo "Maximo escribir nueve nombres" else for nombre do echo "Hola amigo $nombre, como estas?" done fi EJERCICIO Script que repita 5 veces hola martin8@NODE:/home/martin8> cat sfor3 #!/bin/bash for var in 1 2 3 4 5 do echo "Hola amigo como estas?" done O tambien se podria haber hecho: martin8@NODE:/home/martin8> cat sfor3 #!/bin/bash for var in Pedro Juan Lucas Miguel Paco do echo "Hola amigo como estas?" done martin8@NODE:/home/martin8> sfor3 136
Hola amigo como estas? Hola amigo como estas? Hola amigo como estas? Hola amigo como estas? Hola amigo como estas? martin8@NODE:/home/martin8> sfor2 martin cari loli rosa jose Hola amigo martin, como estas? Hola amigo cari, como estas? Hola amigo loli, como estas? Hola amigo rosa, como estas? Hola amigo jose, como estas? EJEMPLO sfor5 Copiar un fichero especificado como segundo argumento (o mas ficheros) a un directorio especificado en el primer argumento. -z verdadero si la longitud de la cadena es 0. #!/bin/bash clear if [ -z $2 ] (si la longitud de la cadena es =0) then echo "ERROR DE SINTAXIS FALTA FICHERO/S" exit 1 else DIR=$1 shift for FILE do echo $FILE cp $FILE $DIR/$FILE done fi [martin@martin martin]$ for1 ERROR DE SINTAXIS FALTA FICHERO/S [martin@martin martin]$ for1 dir1 f1 f2 f3 f1 f2 f3 [martin@martin martin]$ cd dir1 [martin@martin dir1]$ ls f1 f2 f3 martin8@NODE:/home/martin8> sfor4 pr ma k pr debe ser directorio ma y k deben ser ficheros
137
SI NO PONEMOS SHIFT El for empieza dese el primer argumento y entonces intenta copiar el directorio. [martin@martin martin]$ for1 dir1 f1 f2 f3 dir1 cp: dir1: se omite el directorio f1 f2 f3 Mejoras: COMPROBACIÓN DE DIRECTORIO Y FICHERO martin8@NODE:/home/martin8> cat sfor6|more #!/bin/bash #clear if [ $# -lt 2 ] then echo "ERROR DE SINTAXIS" exit 1 else if [ ! -d $1 ] then echo "ERROR el primer argumento no es un directorio" exit 2 else DIR=$1 shift for FILE do if [ ! -f $FILE ] then echo "ERROR un parametro no es un fichero" exit 3 else cp $FILE $DIR echo "$FILE copiado en $DIR" fi done fi fi Otra opcion seria poner donde dice for FILE for $1 Pero despues del cp habria que poner un shift CUIDADO.. para hacerlo perfecto comparar propiedades de los ficheros y directorio. EJEMPLO FOR Partiendo de un listado con articulo y precio hayar lo que vale 138
martin8@NODE:/home/martin8> cat > lista ordenador 200000 bicicleta 60000 vestido 15000 martin8@NODE:/home/martin8> cat > precio.sh for art in $* do grep $art lista done martin8@NODE:/home/martin8> chmod +x precio.sh martin8@NODE:/home/martin8> precio.sh vestido bash: unexpected EOF while looking for `'' bash: /home/martin8/.bashrc: line 20: syntax error vestido 15000
WHILE While condicion Do <linea de comandos> done EJEMPLO WHILE Realizar un script que lea en sus argumentos: si es un fichero y se puede escribir (borrar) borrarlo, en caso contrari especificar que no es posible eliminarlo. Si no es un fichero especificar que es un directorio o en caso contrario un fichero especial. Con todos y cada uno de los argumentos. martin8@NODE:/home/martin8> cat > ejwhile #ejemplo while while [ $# -gt 0 ] do if [ -f $1 ] then if [ -w $1 ] then echo $1 se puede borrar else echo No se puede borrar el fichero $1 fi else if [ -d $1 ] then echo $1 es un directorio else echo $1 es un fichero especial o no existe fi fi shift done 139
martin8@NODE:/home/martin8> ejwhile ej3 marto ert ej3 se puede borrar marto es un directorio ert es un fichero especial Realizar un blucle infinito utilizando la instrucción sleep 15 cuenta 15 segundos. Hasta pulsar CTRL+C martin8@NODE:/home/martin8> cat > sinfin #esto es un bucle infinito while true do echo Esto es un bucle infinito sleep 15 done martin8@NODE:/home/martin8> chmod +x sinfín UNTIL Until condicion (condicion hasta, por tanto debe ser falsa para que entre en el bucle) Do <linea de comandos> done EJERCICIO Realizar un script que escriba 5 veces hola con while y con until martin8@NODE:/home/martin8> cat swhile1 #!/bin/bash echo "Introduce el numero de veces que quieres saludar y decir hola" read NUM I=1 while [ $I -le $NUM ] do I=`expr $I + 1` echo "HOLA" done Introduce el numero de veces que quieres saludar y decir hola 5 HOLA HOLA HOLA HOLA HOLA
140
#!/bin/bash echo "Introduce el numero de veces que quieres saludar y decir hola" read NUM I=1 until [ $I -gt $NUM ] do I=`expr $I + 1` echo "HOLA" done EJERCICIO Realizar un programa que vaya preguntando al usuario por lineas y cada linea la introduzca aĂąadiendola en un fichero que ha recibido como argumento hasta que la linea estĂŠ vacia. Introduce una linea martin Introduce otra lineas es Introduce otra lineas el Introduce otra lineas mejor Introduce otra lineas martin8@NODE:/home/martin8> cat re martin es el mejor martin8@NODE:/home/martin8> cat swhile3 #!/bin/bash #clear if [ $# -eq 0 -o $# -gt 1 ]; then echo "ERROR EN EL NUMERO DE PARAMETROS" exit else echo "Introduce una linea" read LINEA while [ ! -z "$LINEA" ] do echo "$LINEA" >> "$1" echo "Introduce otra lineas" read LINEA done fi
141
EJERCICIO Realizar un script tal que estando en el diretorio que estemos nos diga los directorios que tenemos desde donde nos encontramos hasta l directorio raiz. Es decir hasta que donde estemos situados se \ martin8@NODE:/home/martin8> cat suntil2 #!/bin/bash ls -l|grep "^d" until [ `pwd` = "/" ] do cd .. ls -l|grep "^d" done BREAK Y CONTINUE BREAK permite salir de los bucles CONTINUE permite no ejecutar ese paso por el bucle y seguir con la siguiente uteración. Permite continuar el bucle. EJERCICIO Realizar un script que escriba por pantalla las variables del 1 al 5 pero que cuando sea el 3 no salga nada por pantalla.
#!/bin/bash for variable in 1 2 3 4 5 do #echo $variable if [ $variable -eq 3 ] then continue fi echo -n " LA variable es $variable" done echo –n no salta linea echo salta linea LA variable es 1 LA variable es 2 LA variable es 4 LA variable es 5martin8@NODE :/home/martin8> EJERCICIO Realizar un script que multiplique un numero dado como argumento con 10 100 y 1000 martin8@NODE:/home/martin8> cat sfor7 #!/bin/bash 142
for var in 10 100 1000 do r=`expr $var \* $1` echo $r done martin8@NODE:/home/martin8> sfor7 5 50 500 5000 EJERCICIO Realizar un script que borre todos los ficheros del directorio propio. martin8@NODE:/home/martin8> cat sfor8 #!/bin/bash #clear for var in $HOME/* do if [ ! -d "$var" -a -w "$var" ];then ls -l $var echo "Borrado" fi done rm $var
EJERCICIO Realizar un script que vaya grabando en un fichero el numero de usuarios conectados en el sistema cada 30 segundos. sleep ď&#x192; tiempo en el que espera en segundos martin8@NODE:/home/martin8> cat swhile7 #!/bin/bash while true do DATO=`date +"%d%m%y %T "` DATO="$DATO `who|wc -l` usuarios" echo $DATO >> referencias sleep 30 done Dia mes aĂąo hora
143
martin8@NODE:/home/martin8> swhile7 queda esperando... pasamos a bg CTRL+Z ď&#x192; stop martin8@NODE:/home/martin8> swhile7 [1]+ Stopped swhile7 martin8@NODE:/home/martin8> bg 1 [1]+ swhile7 & martin8@NODE:/home/martin8> cat referencias 030302 16:02:14 2 usuarios 030302 16:02:24 2 usuarios 030302 16:02:34 2 usuarios 030302 16:02:44 2 usuarios 030302 16:02:54 2 usuarios martin8@NODE:/home/martin8> ps -f UID PID PPID C STIME TTY TIME CMD martin8 679 678 0 15:18 pts/0 00:00:00 -bash martin8 6210 679 0 16:01 pts/0 00:00:00 bash ./swhile7 martin8 6302 6210 0 16:03 pts/0 00:00:00 sleep 10 martin8 6303 679 0 16:03 pts/0 00:00:00 ps -f martin8@NODE:/home/martin8> kill -9 6210
EJERCICIO Realizar un script que reciba como argumentos el numero de ficheros que se quieren crear llamandose exam1, exam2... dentro del directorio EXAM Si es cero unicamnete cra la carpeta EXAM martin8@NODE:/home/martin8> cd examen martin8@NODE:/home/martin8/examen> ls ex1/ ex2/ ex3/ martin8@NODE:/home/martin8> cat sif8 #!/bin/bash if [ $# -eq 0 ];then mkdir $HOME/EXAM else CONT=1 while [ $CONT -le $1 ] do mkdir -p $HOME/examen/ex$CONT CONT=`expr $CONT + 1` done fi
144
EJERCICIO Realizar un script que pide la base y el exponente por teclado y nos devuelve el resultado. Introduzca la base 2 introduzca el exponente -3 Exponente negativo no valido martin8@NODE:/home/martin8/examen> exp Introduzca la base 3 introduzca el exponente 0 1 martin8@NODE:/home/martin8/examen> exp Introduzca la base 2 introduzca el exponente 3 8
#!/bin/bash echo "Introduzca la base" read BASE echo "introduzca el exponente" read EXP I=1 RESUL=1 if [ $EXP -lt 0 ] then echo "Exponente negativo no valido" exit else if [ $EXP -eq 0 ]; then echo "1" exit else while [ $I -le $EXP ] do RESUL=`expr $RESUL \* $BASE` I=`expr $I + 1` done fi fi echo $RESUL
145
EJERCICIO Realizar un script que cuente los ficheros core de los directorios /home/martin8 y /home/martin7 utilizando un for martin8@NODE:/home/martin8/examen> cat sfor10 for var in '/home/martin8' '/home/martin7' do echo "del directorio $var" find $var -type f -name core|wc -l done EJERCICIO Realizar script que rciba como parametro un numero y saque por pantalla escrito prueba seguido de numeros desde el 1 hasta el numero introducido como argumento. martin8@NODE:/home/martin8/examen> swhile10 3 1 prueba_1 2 prueba_2 3 prueba_3 martin8@NODE:/home/martin8/examen> cat swhile10 A=1 while [ $A -le $1 ]; do echo $A echo "prueba_$A" A=`expr $A + 1` done EJERCICIOS SHELL SCRIPTS Ejercicio 1 martin8@NODE:/home/martin8> cat ej1 #! /bin/bash #Este script muestra el numero de argumentos recibidos y cuales son num_args=1 until [ $# -eq 0 ] do echo "El argumento $num_args es: $1" shift num_args=`expr $num_args + 1` echo "el valor de num_args es ahora $num_args" done
146
Resultado: martin8@NODE:/home/martin8> . ej1 martin goti roberto raul jose El argumento 1 es: martin el valor de num_args es ahora 2 El argumento 2 es: goti el valor de num_args es ahora 3 El argumento 3 es: roberto el valor de num_args es ahora 4 El argumento 4 es: raul el valor de num_args es ahora 5 El argumento 5 es: jose el valor de num_args es ahora 6 Ejercicio 2 Uso de comillas #! /bin/bash echo 'Nยบ de argumentos : $#' echo "Nยบ de argumentos : $#" echo `cat ej1|wc -l` Resultado: martin8@NODE:/home/martin8> . ej2 laura sofia marta silvia jose jorge Nยบ de argumentos : $# Nยบ de argumentos : 6 12 Ejercicio 3 martin8@NODE:/home/martin8> cat ej3 #! /bin/bash num_args=1 for argumento do echo "El argumento $num_args es : $argumento" num_args=`expr $num_args + 1` #con la comilla invertida pulsarla y dar espacio done Resultado martin8@NODE:/home/martin8> . ej3 rebeca roberto joser jorge adrian El argumento 1 es : rebeca El argumento 2 es : roberto El argumento 3 es : joser El argumento 4 es : jorge El argumento 5 es : adrian
147
Ejercicio 4 CALCULADORA martin8@NODE:/home/martin8> cat ej4|more #!/bin/bash echo CALCULADORA echo salir=y while [ $salir = y ] do echo "Escriba el primer operando" read num1 echo "Escriba la operación + - * /" read operador echo "Escriba el segundo operando" read num2 case $operador in +) sol=`expr $num1 + $num2` echo "La solución es $sol ";; -) expr $num1 - $num2;; #echo "La solución es $sol";; "*") expr $num1 \* $num2;; /) expr $num1 / $num2;; *) echo NO ES UNA OPERACION CORRECTA, SOLO + - \* / esac echo "Desea realizar otra operación (y/n) :" read salir done echo FIN MARTIN Resultado: martin8@NODE:/home/martin8> . ej4 CALCULADORA Escriba el primer operando 4 Escriba la operación + - * / + Escriba el segundo operando 3 La solución es 7 Desea realizar otra operación (y/n) : y Escriba el primer operando 4 148
Escriba la operación + - * / Escriba el segundo operando 8 -4 Desea realizar otra operación (y/n) : y Escriba el primer operando 3 Escriba la operación + - * / * Escriba el segundo operando 4 12 Desea realizar otra operación (y/n) : y Escriba el primer operando 5 Escriba la operación + - * / / Escriba el segundo operando 2 2 Desea realizar otra operación (y/n) : y Escriba el primer operando y Escriba el primer operando 4 Escriba la operación + - * / t Escriba el segundo operando 2 NO ES UNA OPERACION CORRECTA, SOLO + - * / Desea realizar otra operación (y/n) : n FIN MARTIN
149
SHELL SCRIPTS INVOCAR SCRIPT FORMAS DE INVOCAR UN SCRIPT 3 formas de invocar un script 1) CAMBIAR PERMISO Sh – sh – cat f13 martin8@NODE:/home/martin8> chmod +x f13 martin8@NODE:/home/martin8> f13 este es f1 este es f2 2) invocar nuevo shell sh Sh – sh – cat f13 (igual que el anterior) martin8@NODE:/home/martin8> sh f13 este es f1 este es f2 martin8@NODE:/home/martin8> ps PID TTY TIME CMD 6465 pts/2 00:00:00 bash 6526 pts/2 00:00:00 sh 6565 pts/2 00:00:00 ps martin8@NODE:/home/martin8> exit exit martin8@NODE:/home/martin8> ps PID TTY TIME CMD 6465 pts/2 00:00:00 bash 6566 pts/2 00:00:00 ps 3) EJECUTARLO EN EL PROPIO SHELL Sh – f13 martin8@NODE:/home/martin8> . (espacio) f13 este es f1 este es f2 martin8@NODE:/home/martin8> ps PID TTY TIME CMD 6465 pts/2 00:00:00 bash 6568 pts/2 00:00:00 ps DETALLE DE UNO U OTRO martin8@NODE:/home/martin8> ps PID TTY TIME CMD 150
6465 pts/2 00:00:00 bash 6569 pts/2 00:00:00 ps martin8@NODE:/home/martin8> pwd /home/martin8 martin8@NODE:/home/martin8> cat > prog cd .. martin8@NODE:/home/martin8> ls -l prog -rw-r--r-- 1 martin8 users 6 Mar 12 01:53 prog martin8@NODE:/home/martin8> prog bash: ./prog: Permission denied martin8@NODE:/home/martin8> chmod +x prog -----PRIMER CASO martin8@NODE:/home/martin8> prog martin8@NODE:/home/martin8> pwd /home/martin8 ¿QUÉ SALE? martin8@NODE:/home/martin8> sh prog – segundo caso martin8@NODE:/home/martin8> pwd /home/martin8 ¿QUÉ SALE? martin8@NODE:/home/martin8> . prog – TERCER CASO martin8@NODE:/home> pwd /home ¿QUÉ SALE? UN PROCESO HIJO NUNCA PUEDE VARIAR EL ENTORNO DEL PROCESO PADRE. EXIT Desde un shell script sirve para modificar el valor de $? como ha terminado el proceso, el código de retorno. Suele ser: 0 BIEN 1 Algo ha fallado 2 Error grave Ejemplo martin8@NODE:/home/martin8> cat ej3 ( fichero encontrado) #! /bin/bash num_args=1 for argumento do echo "El argumento $num_args es : $argumento" num_args=`expr $num_args + 1` #con la comilla invertida pulsarla y dar espacio done martin8@NODE:/home/martin8> echo $? CORRECTO (0) 0 martin8@NODE:/home/martin8> cat roma (fichero no existe) 151
cat: roma: No such file or directory martin8@NODE:/home/martin8> echo $? (NO CORRECTO 1) 1 martin8@NODE:/home/martin8> cat > pruexit #Probar a mandar exit 3 exit 3 martin8@NODE:/home/martin8> chmod u+x pruexit martin8@NODE:/home/martin8> pruexit martin8@NODE:/home/martin8> echo $? 3 EXPORTACION DE VARIABLES Una variable en un proceso hijo NUNCA es conocida por el proceso padre. Una variable en un proceso padre puede ser conocida por el hijo utilizando EXPORT martin8@NODE:/home/martin8> xy="hola que tal";echo $xy hola que tal martin8@NODE:/home/martin8> sh martin8@NODE:/home/martin8> echo $xy martin8@NODE:/home/martin8> exit exit martin8@NODE:/home/martin8> echo $xy hola que tal Con SET averiguamos las variables que se tienen en dicho proceso martin8@NODE:/home/martin8> set USER=martin8 USERNAME= VISUAL=vi _=xy xy=hola que tal Exportamos a procesos hijo martin8@NODE:/home/martin8> export xy martin8@NODE:/home/martin8> sh martin8@NODE:/home/martin8> echo $xy hola que tal martin8@NODE:/home/martin8> exit exit
152
EJERCICIOS GENERALES 1) Crear un directorio ejecutables y colocar este script de nombre martin1 que contenga el siguiente c贸digo. comprobar a cambiar permisos, a ejecutarlo, a que otro usuario intente ejecutarlo, etc. martin8@NODE:/home/martin8> cat martin1 #!/bin/sh if [ $# = 0 ] then echo "Hay que poner al menos un argumento" exit fi echo "Hay : " $# "argumentos" echo "El primero es : "$1 exit martin8@NODE:/home/martin8> martin1 Hay que poner al menos un argumento martin8@NODE:/home/martin8> martin1 p e Hay : 2 argumentos El primero es : p martin8@NODE:/home/martin8> martin1 cari Hay : 1 argumentos El primero es : cari 2) Inspeccionar los ficheros /etc/profile y .profile Cambiar el prompt PS1 por otro a vuestro gusto. 3) Quitar un alias del fichero .bashrc y probar como funciona el comando. Por ejemplo cp -i, mv -i, ls. Definir un alias que se llame quien soy y que ejecute el comando whoami 4)Mostrar la variable PATH 5) ejecutar history y uno de los ultimos comandos ejecutados utilizando !n潞 comando. 6) Crear soft link y hard link respecto al fichero martin1. Comprobar que con hmartin1 y smartin1 funciona pero comprobar tambien lo que ocurre si se mueve o modifica el fichero orginal martin1. martin8@NODE:/home/martin8> ln -s martin1 smartin1 martin8@NODE:/home/martin8> smartin1 Hay que poner al menos un argumento martin8@NODE:/home/martin8> ln martin1 hmartin1 martin8@NODE:/home/martin8> hmartin1 Hay que poner al menos un argumento martin8@NODE:/home/martin8> rm martin1 153
martin8@NODE:/home/martin8> smartin1 sh: smartin1: command not found martin8@NODE:/home/martin8> hmartin1 Hay que poner al menos un argumento 7)Crear un directorio l単lamado basura y crear con el comando touch varios ficheros. Algunos de ellos llamados core.. utilizar comando find para buscarlos. martin8@NODE:/home/martin8> find /home/martin8/* -name "core*" -type f -print /home/martin8/basura/core /home/martin8/basura/core3 /home/martin8/basura/core4 /home/martin8/basura/core5 8) 多Cuantos ficheros core hay en ese directorio? martin8@NODE:/home/martin8> find ./basura/* -name "core*" -type f -print|wc -l 4 9) Borrar lo ficheros core utilizando -exec del comando find. martin8@NODE:/home/martin8> find ./basura/* -name "core*" -type f -exec \ > rm -i {} \; 10) Crear d nuevo el directorio basura y dentro ficheros core. utilizando el comando find asignar permisos 777 a todos los ficheros. martin8@NODE:/home/martin8> touch ./basura/core1 martin8@NODE:/home/martin8> touch ./basura/core2 martin8@NODE:/home/martin8> touch ./basura/core3 martin8@NODE:/home/martin8> find ./basura/ -type f -exec chmod 777 {} \; martin8@NODE:/home/martin8> cd basura martin8@NODE:/home/martin8/basura> ls -la total 8 drwxr-xr-x 2 martin8 users 4096 Feb 25 13:26 ./ drwxrwxrwx 12 martin8 users 4096 Feb 25 13:13 ../ -rwxrwxrwx 1 martin8 users 0 Feb 25 13:13 core* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:26 core1* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:26 core2* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:26 core3* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:13 core4* -rwxrwxrwx 1 martin8 users 0 Feb 25 13:13 core5* 11) quitar permiso de escritura a los core a nivel de todos. 12) Buscar los ficheros que tienen permisos SUID o SGID 13) Mostrar los ficheros que se llamen inetd* dentro del directorio /etc/ martin8@NODE:/home/martin8/basura> ls -la /etc/*|grep "inetd" -rw-r--r-- 1 root root 3023 Jan 28 10:40 /etc/inetd.conf ls: /etc/default: Permission denied 154
14) Comprobar que elproceso de TCP llamado inetd esta arrancado martin8@NODE:/home/martin8/basura> ls -la /etc/*|grep "inetd" -rw-r--r-- 1 root root 3023 Jan 28 10:40 /etc/inetd.conf ls: /etc/default: Permission denied 15) Crear el siguiente fichero y responder a esas preguntas: martin8@NODE:/home/martin8/basura> cat > cuentas 1 ESP 2 ESP 1 POR 3 ING 3 ESP 4 SUI 5 FRA 5 ALE a) 多Cuantas lineas hay en el fichero? b) 多 cual es el mayor de ellos? c) 多Cual es el menor de ellos? d) 多En cuantos paises puede ser utilizado la 1? e) Modificar POR por PTG martin8@NODE:/home/martin8/basura> sed -n s/POR/PTG/p cuentas 1 PTG
6) Ejecutar el siguiente script llamado martin2 martin8@NODE:/home/martin8> cat martin2 #!bin/sh while [1 -le 2 ] do if [ 2 -le 1 ] then echo "imposible"; fi done
155
156