Mostrando entradas con la etiqueta unix. Mostrar todas las entradas
Mostrando entradas con la etiqueta unix. Mostrar todas las entradas

jueves, 17 de julio de 2008

Tratamiento de líneas con awk

A veces resulta muy útil generar un texto a partir de una consulta u otro texto. Para esto es interesante poder recorrer las diferentes líneas. En awk utilizamos una variable propia que es un puntero que apunta a la línea actual. Esta variable es NR.

Es decir, imaginemos que queremos generar unos índices de Oracle, a partir de una consulta generamos un fichero spool en el que obtenemos los CREATE y ANALYZE.

Pero claro, los tenemos todos en un mismo spool. Si queremos separarlos en diferentes ficheros para podemos lanzar las creaciones de índice en paralelo podemos hacer lo siguiente:

#Quitamos las líneas vacías

sed '/^ *$/d'/tmp/genera_indices_renombrado.txt>/tmp/genera_indices_renombrado.txt.new
#Quitamos las líneas vacías. Este punto es muy incesante ya que Oracle es muy
#propenso a colocarnos líneas vacías. Más si vamos a trabar con NR de awk

#Primero cargamos el spool con los datos
cat /tmp/genera_indices_renombrado.txt.new|awk '

#Ahora nos situamos en la primera línea con NR y comenzamos un bucle

{q=0}{linea[NR]=$0}

END {

for(i=1;i<=NR;i=i+1)

#Si la línea comienza con CREATE entramos en la condición

{if (linea[i] ~ /CREATE/)
#Abrimos el fichero con un spool hacia el log
print "spool /tmp/spooltemp"q".log;">>"/tmp/sqltemp"q".sql";
# Y escribimos la línea del CREATE
print linea[i]>>"/tmp/sqltemp"q".sql"}

else
#Si no entramos en la condición escribimos la línea del ANALYZE
{print linea[i]>>"/tmp/sqltemp"q".sql"
#Y cerramos el fichero actual (con un spool off y con un exit).
print "spool off">>"/tmp/sqltemp"q".sql";
print "exit;">>"/tmp/sqltemp"q".sql";
#pasamos al siguinte fichero

q=q+1; }

}
#Escribimos el último exit
{print "exit;">>"/tmp/sqltemp"q".sql"}}'

Y con esto hemos separado las líneas que nos interesaban en diferentes ficheros.

Cositas sobre ssh

El ssh o Secure Shell es un protocolo y un aplicativo que nos otorga un control total sobre un sistema remoto. Además nos sirve para copiar ficheros de forma cifrada, gestionar claves publicas RSA, permitiéndonos no escribir claves al conectar a las máquinas. Finalmente también nos permite pasar los datos de cualquier otra aplicación por un canal seguro tunelizadomediante SSH.
En principio es muy similar a telnet, pero la información viaja cifrada, lo que impide que cualquier persona con un sniffer pueda captar el usuario y contraseña y comprometa la seguridad del sistema.
Un dato interesante es que SSH es propietario http://www.ssh.com/ (permiten el uso domestico y académico de forma gratuita pero las empresas deben pagar la licencia) , aunque existe una versión libre que es OpenSSH (http://www.openssh.com/). Por otro lado, es muy recomendable utilizar la versión SSH2 y no la SSH1 que esta obsoleta.
Este sistema utiliza una conexión por medio de "llaves", que consisten en un numero cifrado. En realidad es como una llave y una cerradura. En el servidor existe una llave pública ( esta sería la cerradura) y en el cliente una llave privada (esta sería nuestra llave, propiamente dicha)
La generación de llaves puede hacerse con:ssh-keygen -t dsa
esto generará una llave pública, normalmente en ~/.ssh/id_dsa.pub y una llave privada en ~/.ssh/id_dsa (protegida por una palabra clave que nosotros definimos). La llave privada, como su nombre indica, es privada ( secreta) y cumple la función de password, por el contrario la llave pública vista por cualquiera y no hace falta protegerla ya que es completamente inútil sin la llave privada.Para la conexión automática se debe volcar la llave pública en el fichero ~/.ssh/authorized_keys en la máquina que queremos conectarnos.Cuando nos intentemos conectar desde nuestra máquina local a la remota ya no se tendrá que dar la clave de autentificación sino la palabra clave con la que protegió su llave privada. Es más la palabra clave se puede dar una sola vez y las siguientes veces que nos conectemos desde nuestra máquina local ya no nos la pedirá.
Para iniciar una sesión en un sistema remoto: ssh remote_ip
shh username@remote_ip
Como copiar archivos:
scp local_file user_name@remote_ip:remote_file
scp user_name@remote_ip:remote_file local_fie