2011-03-22 5 views
5

En Mac OS X, ls y chmod tienen algunas características adicionales para manejar los permisos ACL que el sistema operativo coloca en la parte superior de los permisos de posix predeterminados. I have some permission problems that need fixing y I wrote a script para ayudar a solucionar estos problemas hasta que Apple solucione ese error. Aquí está el código que analiza ls para conseguir el la ACL:¿Hay alguna forma mejor de leer ACL en Ruby que analizar ls?

result = `#{Escape.shell_command(["ls", "-led", file])}` 
if result.empty? 
    # ls error... 
else 
    @acl = result.split("\n")[1..-1].collect do |ace| 
     ace = ace.split(": ", 2) 
     ace[0] = ace[0].to_i 
     ace 
    end 
    # acl processing code... 
end 

he añadido la gema escape, pero sigue siendo prácticamente el mismo código.

Pero sé que es una mala idea en general analizar ls en un script, entonces ¿hay una mejor manera de leer los permisos ACL de un archivo?

necesito las ACE y sus índices para usar con chmod más adelante en la secuencia de comandos:

system("chmod -a# #{index} \"#{file}\"") 
+0

'ls -led' recupera el OS X atributos avanzados, correcto? No creo que Ruby tenga soporte integrado para estos atributos. @Swanand: el modo solo trata con los bits de permiso de Unix normales, ¿no? – Nemo157

+0

@ Nemo157 Sí, lo olvidé, la opción '-e' es probablemente única para OS X. Imprime las ACL después de la salida' -l' estándar – Tim

Respuesta

0

estoy mirando a través de la clase de Ruby 1.8.7 File. Si mi lectura de un minuto es correcta, lo que deduzco es que los permisos del proceso regirán lo que se puede ver en el archivo, que es exactamente lo que hará ls.

Por lo tanto, si el script de Ruby se ejecuta como root, puede obtener todo tipo de información sobre un archivo, pero si se ejecuta como usuario, y ese usuario no está en el grupo del archivo, y el archivo no está legible por todo el mundo por ejemplo, entonces el script no puede ver ese archivo.

Parece que si está ejecutando un script como un determinado usuario, y desea cambiar los permisos de un archivo, puede reunirlos y cambiarlos con Ruby 1.8.7's chmod en el enlace de arriba, ¿no?

+0

El chmod de Mac OS X tiene administración de ACL integrada. Recuerdo haber leído en alguna parte que esta no es la forma estándar de Unix de lidiar con ACL (corrígeme si estoy equivocado). ¿El chmod de Ruby toma en cuenta esto o simplemente hace el comportamiento chmod estándar de Unix? – Tim

0

Esto suena como un trabajo para IRB. (Escriba irb en la línea de comandos). Si aún no lo hace, debería considerar usar IRB si está escribiendo Ruby y/o rails console si está escribiendo una aplicación de Ruby on Rails. Cuando ejecute este último en la raíz de una aplicación Rails, cargará IRB con todos (o la mayoría) del código asociado con su aplicación Rails.

Hice dos archivos, "file_1.txt" y "file_2.txt". Como usuario "Charlie", abro una cáscara IRB desde el directorio donde se encuentran estos archivos, y jugado un poco con la clase de archivos de Ruby en esos dos archivos:

-rw-r--r-- 1 root  staff 30 Mar 22 09:06 file_1.txt 
-rwxrwxrwx 1 charlie staff 16 Mar 22 09:06 file_2.txt 

charlie:stackoverflow charlie$ man ls 
charlie:stackoverflow charlie$ irb 
ruby-1.8.7-p330 :001 > File.writable?("file_1.txt") 
=> false 

Entonces, hice lo mismo como root:

irb(main):002:0> File.writable?("file_1.txt") 
=> true 
irb(main):003:0> File.writable?("file_2.txt") 
=> true 
irb(main):004:0> 

Ese es mi modus operandi, para aprender lo que tengo que hacer, y espero que ayude a responder su pregunta.

+0

Sí, he usado IRB, ha sido muy útil. Pero no sé cómo encontrar una forma de leer las entradas de ACL subyacentes en el archivo desde Ruby. – Tim

0

¿Esto es lo que buscas?

File.chmod(0644, path)    # Sets the file to 0644 
printf("%o", File.stat(path).mode) # Returns the mode as an 
            # integer and is converted to octal 
100644 => nil 
+2

Lo siento, eso es posix permisos. Necesito editar los permisos de ACL. Hasta ahora, parece que solo el 'chmod' del sistema puede manejarlos. Esperaba que hubiera algunas librerías de Ruby para manejar ACL, así que podría evitar analizar 'ls'. – Tim

0

cómo sobre lstat?

>> File.lstat('file') 
=> #<File::Stat dev=0x803, ino=3365, mode=0100644, nlink=1, uid=0, gid=0, rdev=0x0, size=1328, blksize=4096, blocks=8, atime=2011-03-30 08:39:30 +0800, mtime=2011-03-30 08:36:34 +0800, ctime=2011-03-30 08:36:34 +0800> 
>> print "%o" % (File.lstat('file').mode & 0777 ) 
644 

Lo anterior significa que el archivo llamado "archivo" tiene el permiso de 644.

+3

Necesito acceso a los permisos de ACL, no a los permisos de posix. Recientemente revisé la pregunta para que quede más clara. – Tim

0

Por lo que yo puedo decir, no hay realmente una mejor opción. Las ACL no parecen estar expuestas a OSA por el Finder o los Eventos del sistema, por lo que Appscript no será de ayuda.Puede usar FFI y las funciones POSIX ACL, pero la API en ese nivel es extremadamente molesta.

0

he creado un gem hacer ACL lectura y modificaciones:

>> require 'acl' 
=> true 
>> acl = OSX::ACL.of("tmp") 
=> #<OSX::ACL:0x007f92eaabc578 @path="tmp"> 
>> acl.entries 
=> [#<OSX::ACL::Entry:0x007f92eaaf7510 @components=["user", "FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000046", "_www", "70", "allow", "read"]>] 
>> ace = acl.entries.first 
=> #<OSX::ACL::Entry:0x007f92eaaf7510 @components=["user", "FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000046", "_www", "70", "allow", "read"]> 
>> ace.assignment 
=> #<OSX::ACL::Assignment:0x007f92ea2a0060 @type="user", @uuid="FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000046", @name="_www", @id="70"> 
>> ace.assignment.type 
=> "user" 
>> ace.assignment.name 
=> "_www" 
>> ace.rules 
=> ["allow"] 
>> ace.permissions 
=> ["read"] 
>> acl.remove_entry_at_index(0) 
chmod -a# 0 tmp # user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000046:_www:70:allow:read 
=> true 
Cuestiones relacionadas