Thursday, December 20, 2012

Script: Como borrar archivos de diferentes directorios mas viejos de cierta fecha.

Este script es sencillo pero muy útil. Para ahorrar espacio en el servidor necesito borrar todos los archivos de hace más de 3 dias en diferentes directorios, diariamente.

Este script me permite hacer esto automáticamente.


#!/bin/bash
PATHS="/path/to/dir1 /path/to/dir2 /path/to/dir3" 
find $PATHS -mtime +3 -ls -exec rm {} \; 

En la variable $PATH ponemos todos los directorios que deseamos limpiar separados por un espacio. Luego el comando find se encargara de ir directorio por directorio listando (-ls) todos los archivos mayores de tres dias (-mtime +3). El resultado de ese ls (los nombres de nuestros archivos) serán eliminados por -exec rm{}.

Puedes modificar el tiempo de acuerdo a tu necesidad, por ejemplo -mtime +0 eliminaria todos los archivos que no sean del dia corriente.

Wednesday, December 12, 2012

Script: Automatizar envio de archivos por FTP

"Si tienes que hacer una tarea más de una vez, haz un script".  

Aqui verás un ejemplo de Shell Script que envía por FTP todos los archivos del día de hoy  encontrados en una carpeta en específico.

#!/bin/sh

#IP donde te quieres conectar
HOST='192.168.0.10'

#Usuario de conexion
USER='ftpuser'

#Contrasena del usuario
PASSWD='ftppass'

#Path donde quieres buscar los archivos
PATH='/home/ftpuser/reports'

#Path donde los depositaras
DESTINATION='/destinationserver/destinationfolder'


#Busca todos los archivos en $PATH donde la fecha de modificacion (-ctime) sea# 0 = hoy. Por cada archivo que encuentres (while read LINE).
#Conectate al host y deposita el archivo (put $LINE)

find $PATH -type f -ctime 0 | while read LINE  
do
        ftp -n $HOST <<END_SCRIPT
        quote USER $USER
        quote PASS $PASSWD
        cd $DESTINATION
        put $LINE
        quit
END_SCRIPT
done
Recuerda ajustar los niveles de seguridad del script de acuerdo a tu necesidad y ponerlo en tu crontab.



Friday, November 30, 2012

SunOS: Como crear un usuario con acceso a FTP solamente y limitado a su home folder.

Quizás en algún momento necesites que algún extraño entre a tu servidor a recoger unos archivos. Por razones de seguridad no quieres que ese extraño ejecute comandos ni que acceda archivos que no le competen. Por eso hoy te voy a mostrar como crear un usuario que tenga acceso a FTP *solamente* en SunOS . 

1. Creamos el usuario.
useradd -m ftpuser
2. Le asignamos un password
passwd ftppassword
3. Necesitamos asignarle un shell al usuario que no le permita ejecutar comandos pero si que le permita hacer login. Por lo que le vamos a asignar /bin/false
usermod -s /bin/false ftpuser
4. Hay que asegurarnos que el shell que le asignamos se encuentre en el grupo de los shells autorizados a hacer login. Así que corremos el próximo comando, editamos el archivo /etc/shells  y añadimos /bin/false (si es que no se encuentra).

vi /etc/shells
/bin/bash
/bin/csh
/bin/hash
/bin/jsh
/bin/ksh
/bin/pfcsh
/bin/pfksh
/bin/pfsh
/bin/remsh
/bin/rksh
/bin/rsh
/bin/sh
/bin/ssh
/bin/tcsh
/bin/zsh
/bin/ftpaccess
/sbin/sh
# add this line
/bin/false
*Nota: Si el archivo de /etc/shells no existe puedes crearlo pero tienes que asegurarte que incluyas todos los shells en tu sistema pues los shells que no estén aquí no podrán hacer login al sistema.

5. Vamos a restringir el usuario a su home folder mediante este comando:

ftpconfig -d /home/ftpuser
6. Tenemos que editar el archivo de ftpaccess  para decirle que usuario vamos a estar limitando.

vi /etc/ftpd/ftpaccess
Obtendrás esto:

# ident "@(#)ftpaccess  1.1     01/06/26 SMI"
#
# FTP server configuration file, see ftpaccess(4).
#

class           realusers       real            *
class           guestusers      guest           *
class           anonusers       anonymous       *

loginfails      3
passwd-check    trivial         warn
private         no
keepalive       yes
shutdown        /etc/ftpd/shutdown.msg

# email         user@hostname
guestuser       ftpuser
# timeout       idle            300

banner          /etc/ftpd/banner.msg
greeting        brief
message         /etc/ftpd/welcome.msg   login
message         .message                cwd=*
readme          README*                 login
readme          README*                 cwd=*

chmod           no              anonymous
delete          no              anonymous
overwrite       no              anonymous
rename          no              anonymous
umask           no              anonymous

compress        yes             realusers guestusers anonusers
tar             yes             realusers guestusers anonusers
...
Hay que asegurarnos que la línea  de "class guestusers guest *" se encuentre en el archivo, que la línea de "guestuser username" no este comentada y que en vez de username diga el nombre del usuario que queremos limitar "guestuser ftpuser". Salvamos el archivo.



7. Ahora corremos este comando para permitir el uso del file ftpaccess.

in.ftpd -a
Ya terminamos. Ahora solo resta hacer dos pruebas.

Prueba 1: Conexión mediante FTP para asegurarnos que no pueda acceder nada mas que su Home Folder.

ftp 1.1.1.1.1
Connected to 1.1.1.1.1
Name (1.1.1.1.1:root): ftpuser
331 Password required for ftpuser.
Password:
230 User ftpuser logged in.  Access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is current directory.
ftp> cd ..
250 CWD command successful.
ftp> pwd
257 "/" is current directory.
ftp>
Podemos ver que mi directorio actual dice "/" en vez de "/home/ftpuser"

Prueba 2: Conexión mediante Putty.

Intente conectarse al servidor mediante Putty con las credenciales del usuario de ftp. Al poner las credenciales Putty se cerrará evitando que el usuario pueda ejecutar comandos directo en el command line. Esto es gracias al shell /bin/false.

Terminamos! 


Friday, October 19, 2012

Bash Scripts no corren en crontab pero si manualmente desde el Command Line.

Pues llevo desde las 8 de la mañana tratando de decifrar porque unos scripts corren bien desde el command line pero dan error desde el crontab.

Primero verifica que el script tenga permisos de ejecución. Si los tiene puede que sea lo siguiente.

Los scripts que se ejecutan desde el crontab corren en un subshell que NO hereda los valores de tus environmental variables. Lo que significa que la variable $PATH de ese subshell solamente mira a "/usr/bin:/bin:" por lo que si estas corriendo una aplicación que depende del path de java (como en mi caso) nunca va a ejecutarse.

Esto se corrige de la siguiente manera.

1. Desde el command line buscamos el valor de la variable $PATH
# echo $PATH
PATH=/usr/lib64/qt-3.3/bin:/usr/NX/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/java
2. Ahora editamos el crontab, copiamos el valor de la variable PATH y lo pegamos en la primera linea.

[root@server test]# crontab -e
PATH=/usr/lib64/qt-3.3/bin:/usr/NX/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/java

#Automatic Jobs
34 10 * * * /opt/Test.sh > /opt/Job.log
01 4 * * * /opt/Test2.sh > /opt/Test.log
De esta manera nos estamos asegurando que todos los cronjobs que se corran tengan el $PATH definido.

Ya terminamos, guarda el archivo y ya está! Haz una prueba!

Thursday, October 18, 2012

Como hacer una reinstalación fresca de MySQL en RedHat6.

Tan reciente como hoy por razones ajenas a mi voluntad tuve que volver a reinstalar MySQL en uno de mis servidores. Y luego de 3 horas de buscar aquí y allá finalmente tengo MySQL corriendo nuevamente. 

**PRECAUCION**
En mi caso yo estaba en un ambiente de pruebas y no me importaba la data en las bases de datos. Si tiene data importante y esta en un ambiente de producción le recomiendo NO seguir esta guía y y que busque otra manera de reestrablecer su MySQL. Queda advertido.


1. Nos logueamos como root, bajamos el servicio de MySQL y desinstalamos todo lo que tenga q ver con el.


# service mysqld stop
# yum remove mysql*         

2. Borramos el archivo /var/lib/mysql (directorio default de la instalación) y /etc/my.cnf. 


# rm -rf /var/lib/mysql  
# rm /etc/my.cnf

Vamos al home folder de root y con el comando ls -a buscamos entre los hidden files alguno que se llame .my.conf o .mysql_history y lo borramos. 


# ls -a
.                .bash_profile  install.log         .tcshrc
..               .bashrc        install.log.syslog  .viminfo
anaconda-ks.cfg  .cshrc         .mysql_history      .Xauthority
.bash_history    .dbus          .pki                xorg.conf.new
.bash_logout     .gconf         .ssh
# rm .mysql_history
3. Ya hemos desinstalado MySQL efectivamente, ahora tenemos que instalarlo denuevo. 

# yum groupinstall mysql  
Ya MySQL debe haberse instalado en su default folder '/var/lib/mysql'. 

4. Para  asegurarnos que el folder de MySQL tenga los permisos correctos ejecutamos este comando.

# chown -R mysql:mysql /var/lib/mysql/*  
5. Tenemos que crear el archivo de configuracion My.cnf de MySQL en /etc/. Puede utilizar su editor favorito.

# vim /etc/my.cnf 

[client]
port=3306
socket=/var/lib/mysql/mysql.sock

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
Guarde el archivo.

6. Comienze el servicio con el comando service mysqld start.


Posibles Situaciones

Basado en lo que me paso a mi el servicio de MySQL no me subio por varios errores. Puede encontrar descripción detallada de cualquier error con que se tope en un archivo llamado  $HOSTNAME.err dentro de /var/lib/mysql/

1.El servicio de MySQL subió pero no me pertmitía logearme como root.

2.En $HOSTNAME.err me salía - Error: Can't find file: './mysql/users.frm' (errno: 13)

Esto es un error de permisología. Asegurese que haya corrido este comando.
# chown -R mysql:mysql /var/lib/mysql/*  

3. El archivo de /var/lib/mysql esta vacío luego de reinstalarlo.

A mi entender esto es causado a algún archivo de MySQL que no se borró antes de reinstalar. En mi caso no sabía de la existencia del archivo .mysql_history en el home folder del usuario, en cuanto lo borre y reinstalé todo salió bien.

Ya saben, si en algo me necesitan arreglenselas como puedan!

Como cambiar el password de root de MySQL en RHEL6 si lo olvidó.

El password de root a nadie le importa hasta el dia que todo el mundo lo necesita. Aqui te voy a enseñar como cambiar el password de root de MySQL.

1. Primero paramos el servicio de MySQL.

# service mysqld stop

2. Luego ejecutamos este comando para que MySQL entre en un modo que nos permita acceso como root sin  la necesidad de un password.


# mysqld_safe --skip-grant-tables &

Este comando automáticamente subirá el servicio de MySQL.

3. Nos logeamos a MySQL

# mysqld -u root

Verás que te permitirá la entrada a la base de datos sin necesidad de un password.

4. Cambiamos el password de root con los siquientes comandos.

mysql> use mysql;
mysql> update user set password=PASSWORD("NUEVOPASSWORDAQUI") where User='root';
mysql> flush privileges;
mysql> quit;

5. Paramos el servicio de MySQL para salir de este modo inseguro.

# service mysqld stop


6. Iniciamos el servicio de MySQL e intentamos logearnos con el nuevo password.


# service mysqld start
# mysql -u root -p
# Enter password: XXXXX
# Welcome to the MySQL monitor.  Commands end with ; or \g.
# Your MySQL connection id is 10
# Server version: 5.1.61 Source distribution
#
# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
#
# Oracle is a registered trademark of Oracle Corporation and/or its
# affiliates. Other names may be trademarks of their respective
# owners.
#
# Type 'help;' or '\h' for help. Type '\c' to clear the current input  
# statement.
#
# mysql>

Ya estamos dentro!

Wednesday, October 17, 2012

Como mover la instalación de MySQL a otro path que no sea el default en Linux.


Por X o Y razón quieren mover las bases de datos de MySQL del lugar default donde se instala, usualmente /var/lib/mysql. En mi caso fue para distribuir la carga de procesamiento del OS y la base de datos en discos diferentes. Lleve a cabo este proceso en RedHat 6.0 (RHEL6).

Recomendación: a menos que sea un prerequisito específico para un software trata de instalar la versión de MySQL que provee 'yum'. Te vas a evitar un montón de problemas de dependencies. 

A este momento ya debes haber instalado MySQL.

1. En el terminal escribe mysqlshow -u root -p aprieta enter y pon el password de root de mysql. Eso desplegara las bases de datos que MySQL instala por default y confirmarás que la instalación fue exitosa y que el servicio esta arriba.

# mysqlshow -u root -p
Enter password: *******
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| mysql              |
| test               |
| wikidb             |
+--------------------+

2.  Ahora necesitamos parar el servicio de MySQL para poderlo mover. Utiliza el comando service mysqld stop . 
# service mysqld stop
Stopping MySQL:                                            [  OK  ]

 3. Vamos a crear el directorio donde queremos mover la instalación. (El argumento -p crea los directorios "padres" si no existen")
# mkdir -p /opt/mysql

 4. Ahora copiamos el contenido del folder actual de MySQL al directorio nuevo.
# cp -R /var/lib/mysql/* /opt/mysql/

 5. Le cambiamos el dueño al archivo nuevo y a todo su contenido
# chown -R mysql:mysql /opt/mysql

6. Ya tenemos la instalación en otro lugar. Pero ahora necesitamos decirle MySQL que su ubicación ha cambiado. Hay que modificar nuestro archivo my.cnf. Este archivo le hace overwrite a los valores por default de MySQL y se encuentra en /etc/my.cnf. Si lo buscas y no esta puedes crearlo con tu editor favorito (vi, vim ect...). El contenido de este archivo (minimo) debe ser el siguiente:

[client]
port=3306
socket=/opt/mysql/mysql.sock

[mysqld]
datadir=/opt/mysql
socket=/opt/mysql/mysql.sock
port=3306

#Esto de innodb es opcional y lo voy a explicar mas abajo
innodb_file_per_table

Aqui estamos diciendole al MySQL que le puerto por el cual el cliente se va a estar conectando sera 3306, el path donde esta el socket para la comunicación y donde se encuentra el directorio nuevo. Graba el archivo.

*innodb_file_per_table: Mientras vas creando y borrando bases de datos y tablas MySQL va llenando un archivo que se llama ibdata1 (dentro del archivo de mysql). Este archivo puede llegar a tener GBs de data guardada y no hay manera de limpiarlo (ni aunque dropees la base de datos).  Esta opción lo que hace es que en vez almacenar toda la data de las tablas/DBs creadas en un solo archivo, hace un archivo por cada una de las tablas que creas y a la hora de que borres la tabla el archivo tambien se va. Esto es opcional pero vale la pena mencionarselos porque si ese archivo crece demasiado para limpiarlo vas a tener q hacer un dump de todas las bases de datos, borrar ese archivo y restaurar del dump que hicistes. 

7. Ahora tenemos que correr un comando para cambiar los permisos del archivo nuevo de MySQL y que SELinux nos permita correrlo.
semanage fcontext -a -t mysqld_db_t "/opt/mysql(/.*)?"
*Si no tienes semanage instalado 'yum whatprovides /usr/sbin/semanage' te dira que paquete debes instalar.

8. Ahora hay que reestablecer el mapping de SELinux con este comando.
restorecon -R -v /opt/mysql
9. Ya con esto estamos ready, asi que subimos el servicio de MySQL con el comando service mysqld start
# service mysqld start
Starting MySQL:                                            [  OK  ]


Si no sube verifica que en /opt/mysql/ exista el mysql.sock. Si no existe corre los siguientes comandos estando en el directorio de mysql e intenta subir el servicio denuevo.
# touch mysql.sock
# chown mysql:mysql mysql.sock
    


Si tienen problemas pueden preguntarme, puede que no sepa la respuesta pero si estoy disponible le ayudaré a buscar la contestación