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
Trả lời
Đăng nhập như là người chủ, và trong các loại vỏ:
chmod 744 yourfilename
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
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 –
đặt quyền trước khi phát hành? – lamwaiman1988
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.
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:
- 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
- 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
umask của bạn là gì thiết lập để? – Keith