如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?

Posted

技术标签:

【中文标题】如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?【英文标题】:How to install packages in Linux (CentOS) without root user with automatic dependency handling? 【发布时间】:2016-08-07 15:49:32 【问题描述】:

是否可以在 Linux(特别是 CentOS)中使用 RPM 或 YUM 或任何其他包管理器来安装已下载的包或从 repo 安装到自定义位置而无需管理员/root 访问权限?

我尝试从源代码构建,使用 cmake、configure、make、make install 等,但是,它最终一个接一个地拥有如此多的依赖项。

或者有没有更好的选择?

【问题讨论】:

【参考方案1】:

goldilocks 的这个答案听起来像你要找的。

https://unix.stackexchange.com/a/61295

这仍然不是一个漂亮的过程,但似乎比从源代码构建更容易。

否则,您可能希望研究非 root 包管理器作为 yum 的替代方案。

【讨论】:

该 rpm2cpio 解决方案似乎可以很好地提取文件,但提取的库 (*.so) 已损坏。 您可能需要设置链接器和 pkgconfig,以便操作系统在运行时能够找到库。 这些年来我一直认为这是可能的非root用户,我只是懒得学习。【参考方案2】:

是的。如果软件打包在 repos 中。并安装了管理员 PackageKit-command-not-found 包。

见: https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound

【讨论】:

【参考方案3】:

TL;DR 使用 Miniconda,conda-forge 很棒。

curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" | sh

或者,或者:

curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh > Miniconda.sh
bash Miniconda.sh -b -p ~/conda
# -b is used to specify that this is done "in batch", so skip the EULA prompt
# -p lets you specify where you want conda installed

常用包:

gcc conda install gcc zlib conda install zlib 制作conda install make cmake conda install cmake git conda install gitconda install -c conda-forge fish zsh conda install -c ActivisionGameScience zsh tmux conda install -c conda-forge tmux 这个 tmux 有一个错误,它使用的 ncurse 库的名称。您可以通过转到您的 da/lib 文件夹并符号链接 ln -sT libtinfow.so.6.1 libtinfo.so.6 来解决它

其他的可以试试https://anaconda.org/search?q=


我已经尝试了很长时间让包管理器在 CentOS/RedHat 上运行良好,但没有成功。我能做的最好的事情是在另一个具有root访问权限的CentOS上的正确位置安装Gentoo Prefix,然后将整个安装的.tar.xz scp到目标服务器(获得Gentoo Prefix的正确gcc的唯一方法)。我可以在目标服务器上emerge(构建和安装)软件包,但一直遇到本地和权限问题。


我最近使用 conda 实现了一些有趣的软件包的用户安装。以下是如何从命令行安装它:

curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" | sh

如果像我一样,您的主文件夹托管在远程驱动器(网络文件系统)上,您可能不想将其安装在主文件夹中,因此您可能希望使用类似 mkdir /var/tmp/lo 的内容,然后指定安装安装过程中/var/tmp/lo/da 之类的文件夹。

然后您将能够安装相当多的软件包,尽管可能不是所有您想要的。大多数时候,如果它不在默认频道中,它将在conda-forge。你可以在https://anaconda.org/search?q=查看现有的包


我在 conda 之后尝试使用的其他包管理器:

Linuxbrew

我认为这样安装 homebrew (linuxbrew) 会很容易,但它们的源代码很混乱,并且使用硬编码的绝对路径指向 ruby​​ 解释器,但它失败了,因为它不是最后一个版本等等等等我放弃了。

尼克斯

Nix 仍然要求您使用 /nix 文件夹。他们也对其进行了硬编码,并且很难从安装期间必须执行的每次下载中正确地对其进行 sed(更不用说更新了)。

Gentoo 前缀

我希望 Gentoo Prefix 更容易直接安装,因为我们可以在目标服务器上使用 gcc。 -- 好的,我试过了,但在安装过程中遇到了权限错误(2018-09-28):

portage.exception.OperationNotPermitted: chown(b'~/gentoo/tmp/var/tmp/portage/sys-apps/gentoo-functions-0.12/image/var', 2000, 2000)

PkgSrc

我现在要试试pkgsrc。 -- 如果在 CentOS 6 上或在 7.x 版本中遇到 (G)LibC 版本问题,请使用(旧)版本 64 位 EL 6.x。 -- 不走运,pkgsrc 硬编码/usr/pkg/sbin/usr/pkg/bin。所以它不能作为用户使用,除非可能设置一个 fakechroot 环境。但我从来没有这样做过,我预计会出现可用性问题。


如果您成功安装任何其他包管理器,请发表评论/回答。

【讨论】:

有趣,虽然在运行该 curl 命令时我会失控 >>> 请回答“是”或“否”:滚动完 EULA 后我无法回答【参考方案4】:

可以使用 yum 和 rpm 在发行版的存储库中安装任何软件包。这是食谱:

查找包名

使用yum search

下载

使用yumdownloader(默认在 CentOS 上可用)下载包及其所有依赖项。您需要将其传递给--resolve 以获得依赖关系解析。 yumdownloader 下载到当前目录,除非您指定 --destdir

mkdir -p ~/rpm
yumdownloader --destdir ~/rpm --resolve vim-common

选择前缀位置

可能是~~/centos~/y。如果你家因为在网络文件系统上而速度慢,你可以把它放在/var/tmp/...

mkdir ~/centos

解压所有 .rpm 包

将所有 .rpm 包解压到您选择的前缀位置。

cd ~/centos && rpm2cpio ~/rpm/x.rpm | cpio -id
rpm2cpio 将 .rpm 文件作为 .cpio 存档输出到标准输出。 cpio 从标准输入读取它 -i 表示解压(到当前目录) -d 表示创建缺失目录

您可以选择使用-v:详细

配置环境

您需要配置环境变量PATHLD_LIBRARY_PATH 以使已安装的软件包正常工作。这是我~/.bashrc的相应示例:

export PATH="$HOME/centos/usr/sbin:$HOME/centos/usr/bin:$HOME/centos/bin:$PATH"

export MANPATH="$HOME/centos/usr/share/man:$MANPATH"

L='/lib:/lib64:/usr/lib:/usr/lib64'
export LD_LIBRARY_PATH="$HOME/centos/usr/lib:$HOME/centos/usr/lib64:$L"

已编辑注释(感谢@AmitNaidu 指出我的错误):

根据bash documentation about startup files,通过ssh连接服务器时,只有.bashrc来源:

由远程 shell 守护进程调用

Bash 尝试确定它何时在其标准输入连接到网络连接的情况下运行,就像由远程 shell 守护程序(通常是 rshd)或安全 shell 守护程序 sshd 执行时一样。如果 Bash 确定它正在以这种方式运行,它会从 ~/.bashrc 读取并执行命令,前提是该文件存在并且可读。


现在,如果您想以这种方式安装大量软件包,您可能希望自动化该过程。如果是这样,请查看this repository。


额外说明:如果您尝试安装任何gcc, zlib, make, cmake, git, fish, zsh or tmux ,您应该真正考虑使用conda,请参阅my other answer。

【讨论】:

那么,让我们把事情提出来,如何下载这样的东西?它应该添加新的回购......例如 - copr.fedorainfracloud.org/coprs/ivoarch/Tilix 或这样的组安装?例如-hiroom2.com/2017/07/26/centos-7-xfce-en 我的系统上有 yum,但没有 yumdownloader。我只在 Redhat 文档中找到了这种 yum 下载的替代方法:yum install --downloadonly --downloaddir=./rpm 但是当我运行它时,它仍然说需要 root priv。 来自您的 bash 启动文件链接:Bash attempts to determine when it is being run with its standard input connected to a network connection, as when executed by the remote shell daemon, usually rshd, or the secure shell daemon sshd. If Bash determines it is being run in this fashion, it reads and executes commands from ~/.bashrc, if that file exists and is readable. 谢谢!我相信我会找到一种方法来完成这项工作,但安装后我收到“加载共享库时出错:libreadline.so.6:错误的 ELF 类:ELFCLASS64” 如果你像我一样认为你然后运行 ​​yum install,你不会。最终的可执行文件位于~/centos【参考方案5】:

下载包,并使用--resolve 标志指示包含依赖项。

yumdownloader --resolve openslide-tools

遍历所有下载的rpm 文件。

for i in *.rpm; do rpm2cpio $i | cpio -idv; done

输出将存储在您当前的工作目录$PWD/usr/*

【讨论】:

以上是关于如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在没有root的情况下在linux中制作键盘记录器?

如何在Linux下修改Mysql的用户(root)密码

如何在没有 root 访问权限的情况下在服务器上杀死其他人的 Python 进程?

如何在没有用户交互的情况下在后台接收 iOS 通知

如何在没有地图视图的情况下在自定义图像上显示用户位置

如何在没有ROOT访问的Android上执行SQL注入