2011-05-09 55 views
6

Ho creato un'installazione di software python con setup.py. In questo software utilizzo file di dati (file XML) quando installo questi file xml utilizzando setup.py, quindi questi file salvano con altri file in /usr/lib/python2.7/site_packages/XYZ. Ma l'autorizzazione file impostata su questi file (file XML) rwx------ significa che solo il super utente (root) può leggere questi file Voglio modificare il permesso di file XML come rwxr----- significa che l'utente corrente può anche leggere quel file. Come posso modificare l'autorizzazione per i file di dati.imposta i permessi dei file nel file setup.py

+0

Qual è la vostra umask impostato? – Keith

risposta

-5

login come radice, e nel tipo shell:

chmod 744 yourfilename

+2

Se è a scopo di distribuzione, richiedere l'utente di accedere come root alla distribuzione delle patch è l'idea peggiore – Bruce

+0

non voglio che l'utente lo faccia manully quando l'utente installa questo software utilizzando il file setup.py, quindi il software lo farà automaticamente –

+0

Non puoi semplicemente impostare l'autorizzazione prima del rilascio? – lamwaiman1988

6

Il modo corretto per farlo sarebbe quello di ignorare il comando install, ecco come fare.

prima all'inizio dei vostri setup.py aggiungere le seguenti importazioni:

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

allora avete bisogno di creare una classe di comando richiamabile, ecco un esempio in cui creo una classe di comando che installa uno script e si assicura che è solo eseguibile per root (The sono altri modi per quella in pitone Ad esempio si può sempre uscire dallo script, se UID non è 0..) sono anche utilizzando un altro importazione qui:

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) 

Ora la classe è stata creata. Ho notificare al programma di installazione che dopo aver visto install nella riga di comando deve essere invocato questa classe:

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

Spero che questa risposta aiuta.

1

Io uso setup.py per creare RPM di tutti i tipi. La soluzione è leggermente diversa per me. Penso anche che è più robusta per due motivi:

  1. posso ignorare i permessi di un file in modo esplicito
  2. Non ho bisogno di conoscere l'uid e gid dell'utente. Invece posso usare il testo normale.

ecco un esempio di lavoro

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} 
    ) 

vorrei spiegare che cosa sta succedendo in modo più dettagliato. Gli RPM sono costruiti da un file SPEC. bdist_rpm crea un file SPEC. In un file SPEC, è possibile selezionare le autorizzazioni e la proprietà di un file fornendo l'opzione% attr.

Nell'esempio per rendere eseguibile test.sh e di proprietà dell'utente 'sri', aggiungerei %attr(755, sri, sri) alla fine del file SPEC.

Così, quando eseguo l'override del comportamento di bdist_rpm._make_spec_file, tutto quello che sto facendo è aggiungere una riga per ogni file su cui voglio sovrascrivere le autorizzazioni.

Il file SPEC completo da questo esempio potrebbe essere:

%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 
Problemi correlati