首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从RPM内部运行脚本并与之交互?

如何从RPM内部运行脚本并与之交互?
EN

Stack Overflow用户
提问于 2016-01-06 11:23:18
回答 1查看 5.9K关注 0票数 0

我正在构建一个RPM,它需要将bash脚本作为root运行。

规范文件的%install节是:

代码语言:javascript
复制
%install

cp %{SOURCE1} %{SOURCE2} %{_tmppath}/%{name}-%{version}-%{release}
cd %{_tmppath}/%{name}-%{version}-%{release}
chmod u+x %{installscript}
sudo ./%{installscript}

其中%{installscript}是与sudo一起以root形式运行的脚本。

rpmbuild执行%{installscript}并创建RPM (没有问题)。

但是,当我安装RPM时:

代码语言:javascript
复制
$ sudo rpm -Uvh $rpmpath
Preparing...                ########################################### [100%]
   1:tty-cap ########################################### [100%]
$

没有执行%{installscript}脚本。

我试图通过将脚本调用移动到%post节来更改规范文件:

代码语言:javascript
复制
%install

cp %{SOURCE1} %{SOURCE2} %{_tmppath}/%{name}-%{version}-%{release}
cd %{_tmppath}/%{name}-%{version}-%{release}

%post

chmod u+x %{installscript}
sudo ./%{installscript}

%post似乎什么也没做。

如何打包一个在安装时执行脚本的RPM?

编辑1:

在回顾了下面有帮助的注释之后,这里有一个带有%post节的规范文件,它实际上在RPM安装过程中被执行。

但是,脚本%{installscript}不与用户交互(就像从shell运行时那样),但似乎接受了所有默认设置,而没有用户交互。

我应该更改什么,以便脚本能够与rpm 命令用户交互?

代码语言:javascript
复制
$ cat ~/RPMBUILD/SPECS/demo.spec
#
# %_topdir and %_tmppath are defined in  ~/.rpmmacros

%define name tty-cap
%define version 5.2
%define release 1
%define buildroot %{_tmppath}/%{name}-%{version}-%{release}

%define tarversion tty-5.2.0-00-70270
%define tarfile %{tarversion}.tar
%define installscript tty.install.sh

Name:           %{name}
Version:        %{version}
Release:        %{release}
BuildArch:      noarch
Summary:        Bla
License:        Proprietary
Source1:        %{installscript}
Source2:        tty-5.2.0-00-70270.tar
Prefix:         /opt/Intellinx/TTYCapture
BuildRoot:      %{_builddir}/%{name}-root

%description
Demonstration RPM

%prep

%build

%install

cp %{SOURCE1} %{SOURCE2} %{_tmppath}/%{name}-%{version}-%{release}
cd %{_tmppath}/%{name}-%{version}-%{release}

%clean
[ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT}

%post
echo ">>> Inside post <<<"
chmod u+x %{installscript}
./%{installscript}

%files

%define tmp /
%{tmp}/%{tarfile}
%{tmp}/%{installscript}
代码语言:javascript
复制
$ rpmbuild -v -bb  ~/RPMBUILD/SPECS/demo.spec
Executing(%prep): /bin/sh -e /home/ronbarak/RPMBUILD/tmp/rpm-tmp.oEOM10
+ umask 022
+ cd /home/ronbarak/RPMBUILD/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Executing(%build): /bin/sh -e /home/ronbarak/RPMBUILD/tmp/rpm-tmp.qQFuTA
+ umask 022
+ cd /home/ronbarak/RPMBUILD/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Executing(%install): /bin/sh -e /home/ronbarak/RPMBUILD/tmp/rpm-tmp.8rTMLa
+ umask 022
+ cd /home/ronbarak/RPMBUILD/BUILD
+ '[' /home/ronbarak/RPMBUILD/tmp/tty-cap-5.2-1 '!=' / ']'
+ rm -rf /home/ronbarak/RPMBUILD/tmp/tty-cap-5.2-1
++ dirname /home/ronbarak/RPMBUILD/tmp/tty-cap-5.2-1
+ mkdir -p /home/ronbarak/RPMBUILD/tmp
+ mkdir /home/ronbarak/RPMBUILD/tmp/tty-cap-5.2-1
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cp /home/ronbarak/RPMBUILD/SOURCES/tty.install.sh /home/ronbarak/RPMBUILD/SOURCES/tty-5.2.0-00-70270.tar /home/ronbarak/RPMBUILD/tmp/tty-cap-5.2-1
+ cd /home/ronbarak/RPMBUILD/tmp/tty-cap-5.2-1
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-python-bytecompile
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: tty-cap-5.2-1.noarch
Requires(interp): /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(post): /bin/sh
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/ronbarak/RPMBUILD/tmp/tty-cap-5.2-1
Wrote: /home/ronbarak/RPMBUILD/RPMS/noarch/tty-cap-5.2-1.noarch.rpm
Executing(%clean): /bin/sh -e /home/ronbarak/RPMBUILD/tmp/rpm-tmp.Yag9bm
+ umask 022
+ cd /home/ronbarak/RPMBUILD/BUILD
+ '[' /home/ronbarak/RPMBUILD/tmp/tty-cap-5.2-1 '!=' / ']'
+ rm -rf /home/ronbarak/RPMBUILD/tmp/tty-cap-5.2-1
+ exit 0
代码语言:javascript
复制
$ sudo rpm -Uvh /home/ronbarak/RPMBUILD/RPMS/noarch/tty-cap-5.2-1.noarch.rpm
Preparing...                ########################################### [100%]
   1:tty-cap                ########################################### [100%]
>>> Inside post <<<

###### Starting tty capturing installation ######


Specify installation directory full path [/opt/Intellinx/TTYCapture]:
/opt/Intellinx/TTYCapture already exists. continue installation? (y/n) [y]
Extracting archive tty-5*.* ...

Please specify TTY sensor owner user [ronbarak]:
TTY sensor will be accessible by user 'ronbarak' in group 'ronbarak'

Specify sensor working directory full path [/opt/Intellinx/TTYCapture/work]:

Specify sensor listening port [1024-65000] [8888]:

Do you want to register the sensor service? (y/n) [n]
Server gxttySensorService is not register as a daemon

Executing default user shell (y/n) [y]

TTY capturing has been installed successfully.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-06 13:48:10

你在这里混合了几个概念。所以让我们退后一步。

%prep部分,您应该解压缩%{SOURCE0}并应用补丁(如果有的话)。通常都是这样

代码语言:javascript
复制
%setup -q

但是,如果您需要,可以手动提取它。有关此宏的更多信息,请参见http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html

%build部分,您通常将源代码编译成二进制文件。如果使用解释语言或tar包含已编译的二进制文件,则可能为空。

%install部分中,您应该将文件复制到%{buildroot}中,并创建将在包中的结构。例如,%{buildroot}/etc/yourconfig%{buildroot}/usr/bin/yourcommand等。您可以在那里运行任何您想要的脚本,但请记住,它只在构建时中运行。也就是说,仅在您的机器上(或构建系统)。这是为了创建自动生成的文件(例如,源代码中的库文档)。

然后是%post部分,它在安装包后在用户机器上运行。所有文件都安装在最终路径中。不是在建筑里。开始时,您将更改为/,因此需要在该用户机器上指定完整路径。

因此,就您的情况而言,应该是这样的:

代码语言:javascript
复制
%install
mkdir -p %{buildroot}%{_bindir}
cp -a %{installscript} %{buildroot}%{_bindir}/
chmod a+x %{buildroot}%{_bindir}/%{installscript}

%files
%{_bindir}/%{installscript}

%post
%{_bindir}%{installscript}

Sever注释:

  1. %post部分在root下执行,因此不需要sudo。
  2. 强烈反对运行交互式脚本。RPM被设计为非交互式的,而且周围的每个实用程序都假定在包安装过程中没有交互(例如PackageKit、太空行走等)。所以很快你就会得到一些补偿。更安全的是,用户在安装后手动运行一些命令(或者使用Ansible或Puppet自动执行命令)。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34631942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档