2011-05-09 17 views
6

Creé una instalación de software de python con setup.py. En este software utilizo archivos de datos (archivo XML) cuando instalo estos archivos XML usando setup.py, estos archivos se guardan con otros archivos en /usr/lib/python2.7/site_packages/XYZ. Pero el permiso de archivo establecido en estos archivos (archivos XML) rwx------ significa que solo el superusuario (raíz) puede leer este archivo. Quiero cambiar el permiso de archivo de archivos XML, ya que rwxr----- significa que el usuario actual también puede leer ese archivo. ¿Cómo cambio el permiso de los archivos de datos?establecer permisos de archivos en el archivo setup.py

+0

¿Cuál es su umask establece en? – Keith

Respuesta

-5

de sesión como root, y en el tipo de shell:

chmod 744 yourfilename

+2

Si es para fines de implementación, solicitar al usuario que se registre como implementación raíz a parche es la peor idea – Bruce

+0

No quiero que el usuario haga esto manualmente cuando el usuario instale este software usando el archivo setup.py entonces el software lo hará automáticamente –

+0

¿No puede simplemente establecer el permiso antes del lanzamiento? – lamwaiman1988

6

La forma correcta de hacerlo sería para anular el comando install, aquí es cómo hacerlo.

En primer lugar, en el comienzo de sus setup.py añadir las siguientes importaciones:

from setuptools.command.install import install 
from distutils import log # needed for outputting information messages 

Luego hay que crear una clase de comando puede ser llamado, aquí es un ejemplo en el que se crea una clase de comando que instala un guión y se asegura que sólo es ejecutable para root (la hay otras maneras de que en Python por ejemplo siempre se puede salir de la secuencia de comandos, si no es 0. UID.) también estoy usando otra importación aquí:

from setuptools.command.install_scripts import install_scripts 

class OverrideInstall(install): 

    def run(self): 
     uid, gid = 0, 0 
     mode = 0700 
     install.run(self) # calling install.run(self) insures that everything that happened previously still happens, so the installation does not break! 
     # here we start with doing our overriding and private magic .. 
     for filepath in self.get_outputs(): 
      if self.install_scripts in filepath: 
       log.info("Overriding setuptools mode of scripts ...") 
       log.info("Changing ownership of %s to uid:%s gid %s" % 
         (filepath, uid, gid)) 
       os.chown(filepath, uid, gid) 
       log.info("Changing permissions of %s to %s" % 
         (filepath, oct(mode))) 
       os.chmod(filepath, mode) 

Ahora se crea la clase. Yo notifique al instalador que al ver install en la línea de comandos de esta clase debe ser invocada:

setup(
     # keep 
     # all the previous keywords you had ... 
     # add 
     cmdclass={'install': OverrideInstall} 
    ) 

Espero que esta respuesta ayuda.

1

Yo uso setup.py para construir RPM de todo tipo. La solución es un poco diferente para mí. También creo que es más robusto, por dos razones:

  1. que pueden anular los permisos de un archivo de forma explícita
  2. no necesito saber el UID y GID del usuario. En cambio, puedo usar texto sin formato.

aquí es un ejemplo de trabajo

from distutils.core import setup 
import distutils.command.bdist_rpm 
import distutils.command.install 

version='13' 

data_files = [ 
    ('/usr/share/blah', ['README', 'test.sh']), 
] 

permissions = [ 
    ('/usr/share/blah', 'test.sh', '(755, sri, sri)'), 
] 

class bdist_rpm(distutils.command.bdist_rpm.bdist_rpm): 

    def _make_spec_file(self): 
     spec = distutils.command.bdist_rpm.bdist_rpm._make_spec_file(self) 
     for path, files , perm in permissions: 

      ## 
      # Add a line to the SPEC file to change the permissions of a 
      # specific file upon install. 
      # 
      # example: 
      # %attr(666, root, root) path/file 
      # 
      spec.extend(['%attr{} {}/{}'.format(perm, path, files)]) 

     return spec 


setup(name='sri-testme', 
     version=version, 
     description='This is garganbe and is only used to test the permision flag behavior', 
     author='Chris Gembarowski', 
     author_email='[email protected]', 
     url='https://www.python.org/sigs/distutils-sig/', 
     data_files=data_files, 
     cmdclass={'bdist_rpm':bdist_rpm} 
    ) 

Voy a explicar lo que está pasando con más detalle. Los RPM se crean a partir de un archivo SPEC. bdist_rpm crea un archivo SPEC. En un archivo SPEC, puede seleccionar los permisos y la propiedad de un archivo suministrando la opción% attr.

En el ejemplo para hacer que test.sh sea ejecutable y que sea propiedad del usuario 'sri', agregaría %attr(755, sri, sri) al final del archivo SPEC.

Así que cuando anulo el comportamiento de bdist_rpm._make_spec_file todo lo que hago es agregar una línea para cada archivo sobre el que deseo anular los permisos.

El archivo de especificación completa de este ejemplo sería:

%define name sri-testme 
%define version 13 
%define unmangled_version 13 
%define release 1 

Summary: This is garganbe and is only used to test the permision flag behavior 
Name: %{name} 
Version: %{version} 
Release: %{release} 
Source0: %{name}-%{unmangled_version}.tar.gz 
License: UNKNOWN 
Group: Development/Libraries 
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot 
Prefix: %{_prefix} 
BuildArch: noarch 
Vendor: Chris Gembarowski <[email protected]> 
Url: https://www.python.org/sigs/distutils-sig/ 

%description 
UNKNOWN 

%prep 
%setup -n %{name}-%{unmangled_version} 

%build 
python setup.py build 

%install 
python setup.py install -O1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES 

%clean 
rm -rf $RPM_BUILD_ROOT 

%post 
## 
# sri will be turned on in the run-once script instead of here 
# 


%preun 
#!/bin/bash 



%files -f INSTALLED_FILES 
%defattr(-,root,root) 
%attr(755, sri, sri) /usr/share/blah/test.sh 
Cuestiones relacionadas