Cambiar permisos en Solaris desde java

Como es sabido , hay 3 atributos básicos en Unix  para archivos simples: lectura, escritura y ejecutar.

  •  R  , es decir permiso de lectura (read):Si tiene permiso de lectura de un archivo, puede ver su contenido.
  • W , es decir  permiso de escritura (write):Si tiene permiso de escritura de un archivo, puede modificar el archivo. Puede agregar, sobrescribir o borrar su contenido.
  • X, es decir permiso de ejecución (execute):Si el archivo tiene permiso de ejecución, entonces puedes decirle al sistema operativo que lo ejecute como si fuera un programa. Si es un programa llamado “foo” lo podremos ejecutar como cualquier comando.

En este punto es muy interesante saber que un script en Cshell  (interprete) necesitara permisos de lectura y ejecución para poderlo lanzar, pero sin embargo un programa compilado  en java( por ejemplo en un jar) solo necesitara permisos de lectura  .

Para  cambiar los permisos tanto en directorios como en ficheros en todas las versiones de unix y variantes   usamos el comando  chmod (change mode)  pudiéndose agregar o remover permisos a uno o mas archivos con + (mas) o – (menos)

La representación octal de chmod es muy sencilla:

  • Lectura tiene el valor de 4
  • Escritura tiene el valor de 2
  • Ejecución tiene el valor de 1

Entonces:

 rwx | 7 | Lectura, escritura y ejecución |
rw- | 6 | Lectura, escritura |
r-x | 5 | Lectura y ejecución |
r– | 4 | Lectura |
-wx | 3 | Escritura y ejecución |
-w- | 2 | Escritura |
–x | 1 | Ejecución |
— | 0 | Sin permisos |

Por lo tanto:

chmod u=rwx,g=rwx,o=rwx | chmod 777 |
chmod u=rwx,g=rx,o= | chmod 760 |
chmod u=rw,g=r,o=r | chmod 644 |
chmod u=rw,g=r,o= | chmod 640 |
chmod u=rw,go= | chmod 600 |
chmod u=rwx,go= | chmod 700 |

Es decir para asignar a  un fichero o directorio permisos totales usaremos  el comando

chmod 777  fichero

Es una tarea habitual  que  nuestras aplicaciones java necesiten cambiar permisos  en el sistema de ficheros no solo windows sino tambien en la maquina donde se ejecutaran ( Solaris, Unix,etc)

La forma tradicional de hacerlo a partir de Jr6   es mediante las primitivas  setReadable, setExecutable  o setWritable  del   objeto fichero (file)

Por ejemplo para dar permisos totales (777) sobre un objeto file,   esta es  la sintaxis a usar:

     file.setReadable(true, false);

     file.setExecutable(true, false);

     file.setWritable(true, false);

Por  desgracia   aunque podamos compilar código java mediante las primitivas  setReadable, setExecutable  o setWritable ,por ejemplo para dar permisos totales (777) sobre un objeto file ,   puede que en la maquina donde se ejecute  nos falle  porque tenga otra versión de java inferior

 

Una solución bastante potente que  resuelve el problema es usar  el metodo untime.getRuntime().exec     que nos permite invocar  a otro programa java o incluso comandos del sistema operativo ( en nuestro  caso chmod 77)

 

Como ejemplo ,  os  muestro una clase que cambia los permisos a 777 un fichero o directorio que se le pase como parámetro:

public static void permisos777 (final String pathname)
{

Process theProcess = null;

//intentamos cambiar los permisos del fichero recien creado
System.out.println(«Cambiamos permisos 777 a «+pathname);
try
{
theProcess = Runtime.getRuntime().exec(«chmod 777 «+ pathname);
}
catch(IOException e)
{
System.out.println(«Error en el método exec()»);
}
//fin de cambio de permisos

}

Deja una respuesta