2011-05-09 27 views
6

Tôi đã tạo một phần mềm python cài đặt với setup.py. Trong phần mềm này, tôi sử dụng các tệp dữ liệu (tệp XML) khi tôi cài đặt các tệp xml này bằng cách sử dụng setup.py sau đó các tệp này lưu với các tệp khác trong /usr/lib/python2.7/site_packages/XYZ. Nhưng tập tin cho phép thiết lập cho các tập tin (tập tin XML) rwx------ có nghĩa là chỉ người dùng siêu (root) có thể đọc những tập tin này tôi muốn thay đổi sự cho phép tập tin của các tập tin XML như rwxr----- có nghĩa là người dùng hiện tại cũng có thể đọc tập tin đó. Làm cách nào để thay đổi quyền truy cập tệp dữ liệu.đặt quyền tệp trong tệp setup.py

+0

umask của bạn là gì thiết lập để? – Keith

Trả lời

-5

Đăng nhập như là người chủ, và trong các loại vỏ:

chmod 744 yourfilename

+2

Nếu nó dành cho mục đích triển khai, yêu cầu người dùng đăng nhập dưới dạng root để triển khai bản vá là ý tưởng tồi tệ nhất – Bruce

+0

tôi không muốn người dùng làm điều này manully khi người dùng cài đặt phần mềm này bằng tệp setup.py thì phần mềm sẽ tự động –

+0

đặt quyền trước khi phát hành? – lamwaiman1988

6

Cách đúng để làm điều đó sẽ ghi đè lên các lệnh install, đây là cách để làm điều đó.

đầu tiên trong đầu của bạn setup.py thêm hàng nhập khẩu như sau:

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

Sau đó, bạn cần phải tạo ra một lớp lệnh callable, đây là một ví dụ mà tôi tạo ra một lớp lệnh đó cài đặt một kịch bản và đảm bảo mà nó chỉ thực thi cho root (các cách khác để rằng trong python Ví dụ, bạn luôn có thể thoát khỏi kịch bản, nếu bạn không phải là UID 0..) tôi cũng đang sử dụng một khẩu đây:

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) 

Bây giờ lớp được tạo ra. Tôi thông báo cho trình cài đặt rằng khi nhìn thấy install trong dòng lệnh, lớp này sẽ được gọi:

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

Tôi hy vọng câu trả lời này sẽ hữu ích.

1

Tôi sử dụng setup.py để tạo RPM tất cả các loại. Các giải pháp là một chút khác nhau đối với tôi. Tôi cũng nghĩ rằng nó mạnh mẽ hơn vì hai lý do:

  1. tôi có thể ghi đè lên các điều khoản của một tập tin một cách rõ ràng
  2. Tôi không cần phải biết uid và gid của người dùng. Thay vào đó tôi có thể sử dụng văn bản thuần túy.

đây là một ví dụ làm việc

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

Hãy để tôi giải thích những gì đang xảy ra một cách chi tiết hơn. RPM được tạo từ tệp SPEC. bdist_rpm xây dựng một tệp SPEC. Trong tệp SPEC, bạn có thể chọn quyền và quyền sở hữu tệp bằng cách cung cấp tùy chọn% attr.

Trong ví dụ để làm cho test.sh thực thi và được sở hữu bởi người dùng 'tôi' sẽ thêm %attr(755, sri, sri) vào cuối tệp SPEC.

Vì vậy, khi tôi ghi đè hành vi của bdist_rpm._make_spec_file, tất cả những gì tôi đang làm là thêm một dòng cho mỗi tệp mà tôi muốn ghi đè quyền.

File SPEC đầy đủ từ ví dụ này sẽ là:

%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 
Các vấn đề liên quan