LINUX: Montar una unidad samba (cifs) con permisos Read/Write

Existe un bug en la configuración de fstab al montar una unidad samba mediante cifs que no deja modificar los ficheros después de crearlos a pesar de especificar las directrices del manual.

Después de investigar un poco sobre el tema he encontrado la solución. Supondremos que estamos trabajando en un entorno windows y que queremos compartir una carpeta en ese directorio windows accediendo mediante un usuario del active directory.

En primer lugar debermos crear un fichero con el nombre de usuario y password del active directory:

gksu gedit /root/.smbcredentials

y lo llenamos con

username=USUARIO_WINDOWS
password=PASSWORD_WINDOWS

Después editamos el fichero fstab para que la unidad se monte automáticamente con los siguientes parámetros:

gksu gedit /etc/fstab

Y añadimos la línea:

//RUTA/SAMBA /media/DIRECTORIO_A_MONTAR cifs auto,uid=LINUXUSER,gid=LINUXGROUP,nocase,noperm,file_mode=0777,dir_mode=0777,credentials=/root/.smbcredentials 0 0

UBUNTU: Compartición de carpetas en red

  • Para poder compartir carpetas en un entorno de red en linux debemos usar samba. Nos podemos encontrar con dos situaciones diferentes, que requieren pasos de configuración distintos.  En un primer caso explicaremos como compartir una carpeta del propio linux hacia el exterior y en el segundo caso hablaremos de cómo montar una unidad de red externa como si fuera local en el propio linux.

Compartiendo una carpeta interna

Crearemos una carpeta, y le asignaremos los permisos adecuados para que un usuario externo pueda escribir en ella:

sudo mkdir /opt/shared_folder
sudo chmod 777 /opt/shared_folder

Estamos asumiendo que hablamos de un entorno seguro (una red local de casa o de la oficina) en el caso que se quiera compartir públicamente sería necesario afinar un poco más este paso, asignando solamente los permisos necesarios.

Si compartimos la carpeta como está actualmente, los ficheros se guardarán como usuario root, con lo que nuestro usuario de SO no tendrá acceso a los ficheros que se dejen allí. Para ello, debemos especificar en el fichero de configuración samba con qué usuario y grupo queremos que se guarden los ficheros. Para ello editaremos el fichero:

gksu gedit /etc/samba/smb.conf

y especificaremos los siguientes parámetros:

security = share
create mask = 0775
security mask = 0775
force user = linuxosuser
force group = linuxosgroup

A continuación, procederemos a compartir la carpeta (lo podemos hacer visualmente pulsando con el botón derecho del mouse y accediendo a Sharing), especificaremos el nombre del recurso de red que queremos asignar a la carpeta y guardaremos los cambios.

Después reiniciaremos samba y ya tendremos el share creado.

sudo /etc/init.d/samba restart

En el caso que queramos compartir la carpeta en una red windows es posible que queramos integrar la carpeta en el workgroup de windows y con el active directory para aprovechar la autenticación de los usuarios windows. Para ello deberíamos seguir los siguientes pasos:

        sudo apt-get install winbind
      cd /usr/lib/samba/idmap/
      sudo ln -s /usr/lib/likewise-open/idmap/lwopen.so
      gksu gedit /etc/samba/smb.conf
      • Añadir las siguientes lineas:
        security = ads
        workgroup = WINDOWS_WORKGROUP
        realm = WINDOWS_WORKGROUP.EXT
        idmpa backend = lwopen
        idmap uid = 50-9999999999
        idmap gid = 50-9999999999
        • Modificar los ficheros y reiniciar los servicios:
        mv /var/lib/samba/secrets.tdb /var/lib/samba/secrets.tdb.orig
        ln -s /etc/samba/secrets.tdb /var/lib/samba/secrets.tdb
        sudo /etc/init.d/samba restart
        sudo /etc/init.d/likewise-open restart
        sudo /etc/init.d/winbind restart
      1. A continuación seguimos los mismos pasos que antes para compartir la carpeta y ésta pedirá un login de un usuario del active directory.
      2. Montando una unidad de red (carpeta externa compartida)
        Uno de los problemas típicos es que al montar una unidad de red sobre una carpeta compartida externa es que no tengamos permisos para escribir ficheros en el destino o que una vez creados,  no podamos modificarlos ni borrarlos. Esto es debido a que se monta la unidad como usuario root y el usuario del S.O. linux no tiene permisos suficientes para modificarlos. Para ello, haremos que la unidad se monte como un usuario de windows creando un fichero de configuración al que apuntaremos desde fstab.
        Creamos un fichero con el usuario de windows (asumimos que la carpeta compartida es en windows):

        gksu gedit  /root/.smbpasswd

        Añadimos las siguientes líneas al fichero vacío:

        username=mywindowsusername
        password=mywindowspassword
        Le damos los permisos necesarios:
        sudo chmod 600 /root/.smbpasswd
        Editamos el fichero fstab:
        gksu gedit /etc/fstab
        Añadimos la línea:
        //servername/sharename /mountdirectory cifs credentials=/root/.smbpasswd 0 0
        Y montamos la carpeta:
        sudo mount /mountdirectory
        Más información en: http://www.justlinux.com/nhf/Filesystems/Mounting_smbfs_Shares_Permanently.html

        Stored Procedure SQL Server generador de fechas

        El siguiente Stored Procedure nos sirve para generar fechas hasta la fecha actual. Útil para rellenar una tabla de dimensión fecha (DIM_FECHA) con los campos:

        id_data: idenfitificador de la fecha en integer (ejp: 20091001)

        • date: fecha en sql
        • dia: dia en integer
        • dia_text: texto del dia (ejp: Sábado)
        • mes: mes en integer
        • mes_text: mes en texto (Marzo)
        • anyo: año en integer
        • periode: período en integer (ejp: 200910)
        CREATE PROCEDURE generar_dim_fecha
         
        AS
         
        BEGIN
         
        SET NOCOUNT ON
         
        SET XACT_ABORT ON
         
        declare @Date smalldatetime,
         
        @i int,
        @id_data int,
        @id_data_text varchar(50),
        @dia int,
        @dia_setmana int,
        @dia_text varchar(50),
        @mes int,
        @mes_text varchar(50),
        @anyo int,
        @periode int,
        @max_data_bd smalldatetime
         
        SELECT @max_data_bd = isnull(max(DATA),'2008-01-01') FROM DIM_FECHA
         
        SET @Date = '2008-01-01'
         
        IF @max_data_bd > @Date SET @Date = dateadd(d,1,@max_data_bd)
         
        SET @i = 1
         
        while @date <= getDate()
         
        begin
         
        SET @id_data_text = CONVERT(varchar(8), @date, 112)
         
        SET @periode = SUBSTRING(@id_data_text,1,6)
         
         SET @id_data = CONVERT(varchar(8), @date, 112)
         
        SET @dia = SUBSTRING( @id_data_text,7,2)
         
         SET @mes = SUBSTRING( @id_data_text,5,2)
         
         SET @anyo = SUBSTRING( @id_data_text,1,4)
         
        SET @dia_setmana = DATEPART ( dw ,@date)
         
         SET @dia_text =
         
        CASE 
         
        WHEN @dia_setmana = 1 THEN 'Domingo'
         
        WHEN @dia_setmana = 2 THEN 'Lunes'
         
        WHEN @dia_setmana = 3 THEN 'Martes'
         
        WHEN @dia_setmana = 4 THEN 'Miércoles'
         
        WHEN @dia_setmana = 5 THEN 'Jueves'
         
        WHEN @dia_setmana = 6 THEN 'Viernes'
         
        WHEN @dia_setmana = 7 THEN 'Sábado'
         
         END
         
        SET @mes_text =
         
        CASE
         
        WHEN @mes = 1 THEN 'Enero'
         
        WHEN @mes = 2 THEN 'Febrero'
         
        WHEN @mes = 3 THEN 'Marzo'
         
        WHEN @mes = 4 THEN 'Abril'
         
        WHEN @mes = 5 THEN 'Mayo'
         
        WHEN @mes = 6 THEN 'Junio'
         
        WHEN @mes = 7 THEN 'Julio'
         
        WHEN @mes = 8 THEN 'Agosto'
         
        WHEN @mes = 9 THEN 'Septiembre'
         
        WHEN @mes = 10 THEN 'Octubre'
         
        WHEN @mes = 11 THEN 'Novembre'
         
        WHEN @mes = 12 THEN 'Desembre'
         
        END
         
        /*PRINT @id_data
         
        PRINT @dia
         
        PRINT @dia_setmana
         
        PRINT @dia_text
         
        PRINT @mes
         
        PRINT @mes_text
         
        PRINT @anyo
         
        PRINT @periode*/
         
        INSERT DIM_FECHA
         
         (id_data, DATA, dia,dia_text,mes,mes_text,anyo,periode)
         
        VALUES (@id_data,@date,@dia, @dia_text, @mes, @mes_text, @anyo, @periode)
         
         SET @i = @i + 1
         
         SET @Date = DateAdd(d, 1, @Date)
         
        end
         
        END

        Herramienta iconv. Convertir de un juego de caracteres a otro

        Con la herramienta iconv podemos convertir un fichero en formato texto de una codificación a otra. los parámetros para esta función son los siguientes:

        iconv [fichero] -f [from_code] -t [to_code] 

        por ejemplo, para convertir de UTF-8 a ISO estándar podemos hacer:

         iconv fichero1  -f UTF-8 -t ISO_8859-1

        Ubicación del fichero httpd.conf

        $IAS_ORACLE_HOME/Apache/Apache/conf

        Estreno

        Estrenamos la primera notícia del weblog