miércoles, 27 de mayo de 2015

Guía para Maestría Avanzada de Comandos Linux



Guía para Maestría Avanzada de Comandos Linux

 
En el excelente artículo de Sheryl Calish, denominado “Guía para Maestría en Comandos de Archivos Linux", usted conoció algunos comandos Linux de rutina, que son especialmente valiosos para principiantes Linux. Pero ahora que conoce los puntos básicos, prosigamos con algunos comandos más sofisticados que encontrará extremadamente útiles.
En esta serie de cuatro partes, conocerá algunos trucos no tan conocidos sobre varios comandos de rutina, así como las variaciones en uso que los hacen más útiles. A medida que la serie avanza, conocerá comandos cada vez más difíciles de dominar.
Tenga en cuenta que estos comandos pueden diferir de acuerdo con la versión específica de Linux que utilice o qué kernel específica se compila, pero en ese caso, probablemente solo sea una diferencia mínima.

Cambios Sencillos a Propietarios, Grupos y Permisos

En el artículo de Sheryl, usted aprendió cómo utilizar los comandos chown y chgrp para cambiar la propiedad y el grupo de los archivos. Supongamos que tiene varios archivos como este:
# ls -l
total 8
-rw-r--r--    1 ananda   users          70 Aug  4 04:02 file1
-rwxr-xr-x    1 oracle   dba           132 Aug  4 04:02 file2
-rwxr-xr-x    1 oracle   dba           132 Aug  4 04:02 file3
-rwxr-xr-x    1 oracle   dba           132 Aug  4 04:02 file4
-rwxr-xr-x    1 oracle   dba           132 Aug  4 04:02 file5
-rwxr-xr-x    1 oracle   dba           132 Aug  4 04:02 file6

y necesita cambiar los permisos de todos los archivos para asociar aquellos del archivo 1. Seguramente podría utilizar chmod 644 * para realizar ese cambio— ¿pero qué sucede si está escribiendo un script para hacerlo y no sabe cuáles son los permisos de antemano? O, tal vez esté hacienda varios cambios de permiso basados en muchos archivos diferentes y cree que no es factible examinar los permisos de cada uno y modificarlos en consecuencia.
Un mejor enfoque es hacer que los permisos sean similares a aquellos de otro archivo. Este comando hace que los permisos del archivo 2 sean los mismos que el archivo 1:
chmod --reference file1 file2
Ahora, si verifica:
# ls -l file[12]
total 8
-rw-r--r--    1 ananda   users          70 Aug  4 04:02 file1
-rw-r--r--    1 oracle   dba           132 Aug  4 04:02 file2

Los permisos del archivo 2 fueron cambiados exactamente como el archivo 1. No necesitó obtener primero los permisos del archivo 1.
Usted también puede utilizar el mismo truco para la membresía de grupos en los archivos. Para que el grupo del archivo 2 sea el mismo que el archivo 1, usted manifestaría:
# chgrp --reference file1 file2
# ls -l file[12]
-rw-r--r--    1 ananda   users          70 Aug  4 04:02 file1
-rw-r--r--    1 oracle   users         132 Aug  4 04:02 file2

Desde luego, lo que funciona para el cambio de grupos funcionará para el propietario también. A continuación, mostramos cómo puede utilizar el mismo truco para un cambio de propiedad. Si los permisos son así:
# ls -l file[12] 
-rw-r--r--    1 ananda   users          70 Aug  4 04:02 file1
-rw-r--r--    1 oracle   dba           132 Aug  4 04:02 file2

Usted puede cambiar la propiedad así:
# chown --reference file1 file2
# ls -l file[12] 
-rw-r--r--    1 ananda   users          70 Aug  4 04:02 file1
-rw-r--r--    1 ananda   users         132 Aug  4 04:02 file2

Fíjese que el grupo, y el propietario, han cambiado.

Consejo para Usuarios Oracle


Este es un truco que puede utilizar para cambiar la propiedad y los permisos de los ejecutables de Oracle en un directorio basado en un ejecutable de referencia. Esto es especialmente útil en migraciones donde puede (y probablemente deba) instalar un usuario diferente y luego trasladarlo a su propietario de software Oracle usual.

Más sobre Archivos


El comando ls, con su gran cantidad de argumentos, brinda información muy útil sobre los archivos. Un comando diferente y menos conocido – stat – ofrece información incluso más útil. .
Aquí le mostramos cómo puede utilizarlo en el ejecutable “oracle”, que puede encontrarse en $ORACLE_HOME/bin.
# cd $ORACLE_HOME/bin
# stat oracle
  File: `oracle'
  Size: 93300148        Blocks: 182424     IO Block: 4096   Regular File
Device: 343h/835d       Inode: 12009652    Links: 1    
Access: (6751/-rwsr-s--x)  Uid: (  500/  oracle)   Gid: (  500/     dba)
Access: 2006-08-04 04:30:52.000000000 -0400
Modify: 2005-11-02 11:49:47.000000000 -0500
Change: 2005-11-02 11:55:24.000000000 -0500

Fíjese la información que obtuvo con este comando: Además del tamaño de archivo usual (que puede obtener de ls -l), usted obtuvo la cantidad de bloques que ocupa este archivo. El tamaño de bloque Linux típico es de 512 bytes, entonces un archivo de 93.300.148 bytes ocuparía (93300148/512=) 182226.85 bloques. Como los bloques se utilizan en su totalidad, este archivo utiliza un número entero de bloques. En lugar de hacer conjeturas, usted puede saber cuáles son los bloques exactos.
Del output de arriba, usted también puede conocer el GID y UID de la propiedad del archivo y la representación octal de los permisos (6751). Si desea readmitir los mismos permisos que tiene ahora, puede utilizar chmod 6751 oracle en lugar de detallar explícitamente los permisos.
La parte más útil del output de arriba es la información de la fecha de registro del acceso al archivo. Muestra que se accedió al archivo el 04-08-2006 a las 04:30:52 (como se muestra al lado de “Acceso:”), o el 4 de agosto de 2006 a las 4:30:52 AM. Este es el momento en el cual se empezó a utilizar la base de datos. El archivo fue modificado el 02-11-2005 a las 11:49:47 (como se muestra al lado de Modificar:). Finalmente, la fecha de registro al lado de “Cambiar:” muestra cuándo fue cambiado el estado del archivo.
-f, un modificador del comando stat, muestra la información del sistema de archivo en lugar del archivo:
# stat -f oracle
  File: "oracle"
    ID: 0        Namelen: 255     Type: ext2/ext3
Blocks: Total: 24033242   Free: 15419301   Available: 14198462   Size: 4096
Inodes: Total: 12222464   Free: 12093976  

Otra opción, -t, brinda exactamente la misma información pero en una sola línea:
# stat -t oracle 
oracle 93300148 182424 8de9 500 500 343 12009652 1 0 0 1154682061 
1130950187 1130950524 4096

Esto es muy útil en shell scripts donde un simple comando de corte puede utilizarse para extraer los valores para el posterior procesamiento.

Consejo para Usuarios Oracle


Cuando usted se vuelve a conectar con Oracle (a menudo se realiza durante la instalación de parches), los ejecutables existentes pasan a un nombre diferente antes de crear el nuevo. Por ejemplo, puede reconectar todos los servicios por
relink utilities
Recopila, entre otras cosas, el ejecutable sqlplus. Mueve el ejecutable existente sqlplus a sqlplus. O Si la recopilación falla por algún motivo, el proceso de reconexión vuelve a nombrar sqlplusO con sqlplus, y los cambios quedan anulados. De manera similar, si descubre un problema de funcionalidad después de aplicar un parche, puede rápidamente anular el parche al renombrar el archivo por su propia cuenta.
A continuación, mostramos cómo puede utilizar stat en estos archivos:
# stat sqlplus*
  File: 'sqlplus'
  Size: 9865            Blocks: 26         IO Block: 4096   Regular File
Device: 343h/835d       Inode: 9126079     Links: 1    
Access: (0751/-rwxr-x--x)  Uid: (  500/  oracle)   Gid: (  500/     dba)
Access: 2006-08-04 05:15:18.000000000 -0400
Modify: 2006-08-04 05:15:18.000000000 -0400
Change: 2006-08-04 05:15:18.000000000 -0400
 
  File: 'sqlplusO'
  Size: 8851            Blocks: 24         IO Block: 4096   Regular File
Device: 343h/835d       Inode: 9125991     Links: 1    
Access: (0751/-rwxr-x--x)  Uid: (  500/  oracle)   Gid: (  500/     dba)
Access: 2006-08-04 05:13:57.000000000 -0400
Modify: 2005-11-02 11:50:46.000000000 -0500
Change: 2005-11-02 11:55:24.000000000 -0500

Muestra que sqlplusO fue modificado el 11 de noviembre d e2005, cuando sqlplus fue modificado el 4 de agosto de 2006, que también corresponde al tiempo de cambio de estado de sqlplusO. Indica que la versión original de sqlplus estuvo vigente desde el 11 de noviembre de 2005 hasta el 4 de agosto de 2006. Si quiere diagnosticar algunos problemas de funcionalidad, este es un buen lugar para empezar. Además de los cambios de archivo, como usted conoce el horario de cambio de los permisos, usted puede correlacionarlo con cualquier problema de funcionalidad percibido.
Otro output importante es el tamaño del archivo, que es diferente—9865 bytes para sqlplus y 8851 para sqlplusO—e indica que las versiones no son meras compilaciones; en realidad cambiaron con bibliotecas adicionales (tal vez). Esto también indica la causa potencial de algunos problemas.

Tipos de Archivo


Cuando ve un archivo, ¿cómo sabe qué tipo de archivo es? El comando file le da esa información. Por ejemplo:
# file alert_DBA102.log
alert_DBA102.log: ASCII text
El archivo alert_DBA102.log es un archivo de texto ASCII. Veamos algunos ejemplos más:
# file initTESTAUX.ora.Z
initTESTAUX.ora.Z: compress'd data 16 bits

Esto demuestra que el archivo es un archivo comprimido, ¿pero cómo sabe qué tipo de archivo fue comprimido? Una opción es descomprimirlo y ejecutar el archivo; pero eso haría que sea virtualmente imposible. Una mejor opción es utilizar el parámetro -z:
# file -z initTESTAUX.ora.Z
initTESTAUX.ora.Z: ASCII text (compress'd data 16 bits)

Otra peculiaridad es la presencia de enlaces simbólicos:
# file spfile+ASM.ora.ORIGINAL   
spfile+ASM.ora.ORIGINAL: symbolic link to 
/u02/app/oracle/admin/DBA102/pfile/spfile+ASM.ora.ORIGINAL

Esto es útil; ¿pero qué tipo de archivo es al que se apunta? En lugar de ejecutar el archivo otra vez, puede utilizar la opción -l:
# file -L spfile+ASM.ora.ORIGINAL
spfile+ASM.ora.ORIGINAL: data

Esto demuestra claramente que el archivo es un archivo de datos. Tenga en cuenta que spfile es binario, a diferencia de init.ora; por lo tanto el archivo se muestra como archivo de datos.

Consejo para Usuarios Oracle


Supongamos que está buscando un archivo de localización en el directorio de destino de descargas del usuario pero no está seguro de que el archivo esté ubicado allí o en otro directorio, y meramente está allí como enlace simbólico, o si alguien ha comprimido el archivo (o incluso lo ha renombrado). Hay algo que sí sabe: es definitivamente un archivo ascii. ¿Qué puede hacer?
file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr

Este comando verifica los archivos ASCII, incluso si están comprimidos, y los enumera en orden cronológico.

Comparar Archivos


¿Cómo descubre si dos archivos—archivo1 y archivo2—son idénticos? Hay varias formas, y cada enfoque tiene su propio atractivo.
diff. El comando más simple es diff, que muestra la diferencia entre dos archivos. Vea los contenidos de dos archivos
# cat file1
In file1 only
In file1 and file2
# cat file2
In file1 and file2
In file2 only

Si utiliza el comando diff, podrá ver la diferencia entre los archivos, como se muestra abajo:
# diff file1 file2
1d0
< In file1 only
2a2
> In file2 only
#

En el output, un "<" en la primera columna indica que la línea existe en el archivo mencionado primero, —es decir, archivo1. Un ">" en ese lugar indica que la línea existe en el segundo archivo (archivo2). Los caracteres 1d0 de la primera línea del output muestra lo que debe hacerse en sed para operar en el archivo 1 para hacerlo idéntico al archivo 2.
Otra opción, -y, muestra el mismo output, pero uno al lado del otro:
# diff -y file1 file2 -W 120
In file1 only                             <
In file1 and file2                             In file1 and file2
                                          >    In file2 only

La opción -W es opcional; simplemente ordena al comando utilizar una pantalla que permita 120 caracteres, útil para archivos con líneas largas.
Si solo desea saber si los archivos son diferentes, no necesariamente en qué difieren, puede utilizar la opción -q.
# diff -q file3 file4
# diff -q file3 file2
Files file3 and file2 differ

Los archivos 3 y 4 son los mismos, con lo cual no hay output; caso contrario, se informa si los archivos difieran.
Si está escribiendo un shell script, puede resultar útil generar el output de tal manera que pueda analizarse. La opción -u hace eso:
# diff -u file1 file2        
--- file1       2006-08-04 08:29:37.000000000 -0400
+++ file2       2006-08-04 08:29:42.000000000 -0400
@@ -1,2 +1,2 @@
-In file1 only
 In file1 and file2
+In file2 only

El output muestra contenidos de ambos archivos pero suprime los duplicados, los signos + y de la primera columna indican las líneas de los archivos. Ningún carácter en la primera columna indica su presencia en ambos archivos.
El comando tiene en cuenta el espacio en blanco. Si quiere ignorar el espacio en blanco, use la opción -b. Use la opción -B para ignorar las líneas en blanco. Finalmente, use -i para ignorar el caso.
El comando diff también puede aplicarse a los directorios. El comando
diff dir1 dir2

muestra los archivos presentes en cualquiera de los dos directorios; ya sea que los archivos estén presentes en uno de los directorios o en ambos. Si se encuentra un subdirectorio con el mismo nombre, no se detiene a ver si algún archivo individual difiere. Un ejemplo:
# diff DBA102 PROPRD     
Common subdirectories: DBA102/adump and PROPRD/adump
Only in DBA102: afiedt.buf
Only in PROPRD: archive
Only in PROPRD: BACKUP
Only in PROPRD: BACKUP1
Only in PROPRD: BACKUP2
Only in PROPRD: BACKUP3
Only in PROPRD: BACKUP4
Only in PROPRD: BACKUP5
Only in PROPRD: BACKUP6
Only in PROPRD: BACKUP7
Only in PROPRD: BACKUP8
Only in PROPRD: BACKUP9
Common subdirectories: DBA102/bdump and PROPRD/bdump
Common subdirectories: DBA102/cdump and PROPRD/cdump
Only in PROPRD: CreateDBCatalog.log
Only in PROPRD: CreateDBCatalog.sql
Only in PROPRD: CreateDBFiles.log
Only in PROPRD: CreateDBFiles.sql
Only in PROPRD: CreateDB.log
Only in PROPRD: CreateDB.sql
Only in DBA102: dpdump
Only in PROPRD: emRepository.sql
Only in PROPRD: init.ora
Only in PROPRD: JServer.sql
Only in PROPRD: log
Only in DBA102: oradata
Only in DBA102: pfile
Only in PROPRD: postDBCreation.sql
Only in PROPRD: RMANTEST.sh
Only in PROPRD: RMANTEST.sql
Common subdirectories: DBA102/scripts and PROPRD/scripts
Only in PROPRD: sqlPlusHelp.log
Common subdirectories: DBA102/udump and PROPRD/udump

Vea que los subdirectorios comunes simplemente se muestran como tal pero no se realiza ninguna comparación. Si desea hacer más desgloses y comparar los archivos de esos subdirectorios, debería utilizar el siguiente comando:
diff -r dir1 dir2

Este comando ingresa repetitivamente en cada subdirectorio para comparar los archivos e informa la diferencia entre los archivos con el mismo nombre.

Consejo para Usuarios Oracle


Un uso común de diff es diferenciar entre distintos archivos init.ora. Como ejemplo modelo, siempre copio el archivo con un nuevo nombre—por ej., initDBA102.ora con initDBA102.080306.ora (para indicar 3 de agosto de 2006) —antes de realizar un cambio. Un simple diff entre todas las versiones del archivo muestra rápidamente qué cambió y cuándo.
Este es un comando bastante poderoso para administrar su página de inicio Oracle. Como ejemplo modelo, nunca actualizo una Página de Inicio de Oracle cuando aplico parches. Por ejemplo, supongamos que las versiones Oracle actuales sean 10.2.0.1. ORACLE_HOME podría ser /u01/app/oracle/product/10.2/db1. Cuando llega el momento de realizar un parche hacia 10.2.0.2, no realizo el parche de esta Página de Inicio Oracle. En cambio, inicio una instalación nueva en /u01/app/oracle/product/10.2/db2 y luego realizo un parche de esa página de inicio. Una vez listo, uso lo siguiente:
# sqlplus / as sysdba
SQL> shutdown immediate
SQL> exit
# export ORACLE_HOME=/u01/app/oracle/product/10.2/db2
# export PATH=$ORACLE_HOME/bin:$PATH
# sqlplus / as sysdba
SQL> @$ORACLE_HOME/rdbms/admin/catalog
...

y así sucesivamente.

El propósito de este enfoque es que la Página de Inicio Oracle original no se interrumpa y que pueda fácilmente volver atrás en caso de haber problemas. Esto también implica que la base de datos deja de funcionar y vuelve a hacerlo, con bastante rapidez. Si hubiese instalado un parche directamente en la Página de Inicio Oracle, hubiese tenido que interrumpir la base de datos durante mucho tiempo—mientras dure la aplicación del parche. Asimismo, si la aplicación del parche hubiese fallado por algún motivo, no hubiese obtenido una Página de Inicio Oracle “limpia”.
Ahora que tengo varias Páginas de Inicio Oracle, ¿cómo puedo ver qué cambió? Es realmente simple; puedo utilizar:
diff -r /u01/app/oracle/product/10.2/db1 /u01/app/oracle/product/10.2/db2 | 
grep -v Common

Esto me muestra las diferencias entre ambas Páginas de Inicio Oracle y las diferencias entre los archivos con el mismo nombre. Algunos archivos importantes como tnsnames.ora, listener.ora y sqlnet.ora no deberían mostrar grandes diferencias, pero si lo hacen, debo entender por qué.
cmp. El comando cmp es similar a diff:
# cmp file1 file2   
file1 file2 differ: byte 10, line 1

El output vuelve a aparecer como la primera señal de diferencia. Usted puede utilizar esto para identificar en qué pueden diferir los archivos. diff, cmp tiene muchas opciones, la más importante es la opción -s, lo cual sencillamente genera un código
  • 0, si los archivos son idénticos
  • 1, si difieren
  • Algún otro número que no sea cero, si la comparación no pudo realizarse
Un ejemplo:
# cmp -s file3 file4
# echo $?
0

La variable especial $? indica el código del último comando ejecutado. En este caso, 0, lo cual implica que los archivos 1 y 2 son idénticos.
# cmp -s file1 file2
# echo $?
1

implica que los archivos 1 y 2 no son iguales.
Esta propiedad de cmp puede resultar muy útil en shell scripting donde simplemente quiera verificar si dos archivos difieren de alguna manera, pero no necesariamente verificar cuál es la diferencia. Otro uso importante de este comando es comparar los archivos binarios, donde diff puede no ser confiable.

Consejo para Usuarios Oracle


Recuerde de un consejo anterior, cuando vuelve a conectar los ejecutables Oracle, la versión más antigua se guarda antes de sobrescribirla. Por lo tanto, cuando se vuelve a conectar, el ejecutable sqlplus es renombrado como “sqlplusO”, y el recientemente compilado sqlplus es colocado en $ORACLE_HOME/bin. ¿Entonces cómo se asegura de que el sqlplus que se creó recientemente es diferente? Simplemente utilice:
# cmp sqlplus sqlplusO
sqlplus sqlplusO differ: byte 657, line 7
Si verifica el tamaño:
# ls -l sqlplus*
-rwxr-x--x    1 oracle   dba          8851 Aug  4 05:15 sqlplus
-rwxr-x--x    1 oracle   dba          8851 Nov  2  2005 sqlplusO

A pesar de que el tamaño es el mismo en ambos casos, cmp demostró que los dos programas son diferentes.
comm. El comando comm es similar a los otros pero el output se genera en tres columnas, separadas por etiquetas. Ejemplo:
# comm file1 file2
        In file1 and file2
In file1 only
In file1 and file2
        In file2 only
Resumen de Comandos de este Documento
CommandoUso
chmodPara cambiar permisos de un archivo, usando el parámetro de referencia - -
chownPara cambiar el propietario de un archivo, usando el parámetro de referencia - -
chgrpPara cambiar el grupo de un archivo, usando el parámetro de referencia - -
statPara conocer los atributos extendidos de un archivo, como fecha de último acceso
filePara conocer el tipo de archivo, como ASCII, datos, etc.
diffPara ver la diferencia entre dos archivos
cmpPara comparar dos archivos
commPara ver qué tienen en común dos archivos, con el output en tres columnas
md5sumPara calcular el valor arbitrario MD5 de los archivos, usado para determinar si un archivo ha cambiado

Este comando es útil para ver los contenidos de un archivo y no del otro, no solo una diferencia—una clase de herramienta MINUS en el lenguaje SQL. La opción -1 suprime los contenidos del primer archivo:
# comm -1 file1 file2
In file1 and file2
In file2 only

md5sum. Este comando genera un valor arbitrario MD5 de 32 bits de los archivos:
# md5sum file1
ef929460b3731851259137194fe5ac47  file1

Dos archivos con la misma suma de control (checksum) pueden considerarse idénticos. No obstante, la utilidad de este comando va más allá de simplemente comparar los archivos. También puede ofrecer un mecanismo para garantizar la integridad de los archivos.
Supongamos que tiene dos archivos importantes—archivo1 y 2—que necesita proteger. Puede utilizar el control de opción --check para confirmar que los archivos no han cambiado. Primero, cree un archivo de suma de control para ambos archivos importantes y manténgalos protegidos:
# md5sum file1 file2 > f1f2

Luego, cuando quiere verificar que los archivos siguen intactos:
# md5sum --check f1f2      
file1: OK
file2: OK

Esto muestra claramente que los archivos no han sido modificados. Ahora cambia un archivo y verifique el MD5:
# cp file2 file1
# md5sum --check f1f2
file1: FAILED
file2: OK
md5sum: WARNING: 1 of 2 computed checksums
did NOT match

El output claramente muestra que el archivo 1 ha sido modificado.
Consejo para Usuarios Oracle
md5sum es un comando extremadamente poderoso para implementaciones de seguridad. Algunos archivos de configuración que administra, como listener.ora, tnsnames.ora e init.ora, son demasiado críticos para una infraestructura Oracle exitosa, y cualquier modificación puede dar como resultado momentos de inactividad. Esto en general forma parte de su proceso de control de cambios. En lugar de confiar en la palabra de alguien respecto de que estos archivos no han cambiado, asegúrese utilizando la suma de control MD5. Cree un archivo de suma de control y, cuando realice un cambio planificado, vuelva a crear este archivo. Como parte del cumplimiento, verifique este archivo utilizando el comando md5sum . Si alguien actualizara involuntariamente alguno de estos archivos clave, inmediatamente se daría cuenta del cambio.
En la misma línea, también puede crear sumas de control MD5 para todos los ejecutables de $ORACLE_HOME/bin y compararlas de vez en cuando para realizar modificaciones no autorizadas.
Conclusión
Hasta ahora, ha aprendido solo algunos de los comandos Linux que encontrará útiles para realizar una tarea con eficiencia. En el próximo documento, describiré algunos comandos más sofisticados pero útiles, como strace, whereis, renice, skill, y mucho más.

Lectura Adicional