没有root权限,我如何安装一个软件包?

我在这台机器上没有root访问权限。
我想知道是否有一种方法可以下载Ubuntu软件包并以非root用户的身份安装它们?
可能是在我的~/bin或~/usr/share之类的地方?那样行吗?

2希望他们很快能够支持它。 - Domi
7你可以在Linux上使用便携应用程序:无需安装,无需root权限。在http://appimage.org/上找到它。连Linus Torvalds都喜欢它。这有点奇怪,因为Linus从来不喜欢任何东西。 - ipse lute
我建议尝试使用fakechroot - Robert Pollak
dpk -xmv的组合对我很有效。或者,如果没有dpk可用,使用ar并与tar进行管道/组合在非常受限制的系统上也对我有用,参见这里 - iolsmit
在[unix.se]上相关的内容:非Root包管理器 - Eliah Kagan
请参考以下链接:https://unix.stackexchange.com/questions/42567/how-to-install-program-locally-without-sudo-privileges/727461#727461 - Charlie Parker
4个回答

Apt本身不直接支持此功能,但有其他方法可以实现:

.deb 方法

apt-get download package_name  # replace `package_name` with the name of the package.

dpkg -x package.deb dir

如果在Ubuntu软件仓库中找不到deb文件,apt-get package_name命令将无法使用,但您可以尝试从网站上下载它。
这将把.deb文件解压到dir/目录下。然后您可以导出二进制文件所在的路径。只要安装了二进制文件的所有依赖项,它应该能够正常运行。
schroot方法
另一种方法是使用schroot创建非root chroot环境。这是一个比较复杂的过程,但您应该能够在社区中找到帮助,因为许多开发人员都会设置chroot环境来编译代码。
apt-get source方法
最后,您可以使用apt-get source命令获取软件包的源代码,并进行本地安装配置。通常情况下,操作如下:
apt-get source package
cd package
./configure --prefix=$HOME
make
make install

这种方法的缺点是你需要开发环境才能使这种方法正常工作,并且你可能会发现自己需要编译数十个软件包来解决所有的依赖关系。
历史方法
过去可以将 package.deb 通过 dpkg 安装到用户的主目录中。
dpkg -i package.deb --force-not-root --root=$HOME

使用dpkg的这种方法的缺点是错误消息可能会很晦涩,dpkg不会自动解决依赖关系或创建预期的目录结构。

2如果您具有root访问权限,但只是不想在全局范围内安装特定的软件包,您可以使用sudo apt-get build-dep package命令来安装构建软件包所需的所有组件(在使用apt-get source获取源代码之后)。 - Vladimir Panteleev
创建chroot的指令似乎需要root权限... 有没有一种不需要这样特权就能使用chroot的方法? - josinalvo
@josinalvo,请检查schroot。 - user.dz
你也可以构建一个deb包,将其安装在除了通常的系统目录之外的其他位置,但这样做非常古怪。尽管有时会这样做,通常是由像谷歌这样的企业实体来完成。 - Faheem Mitha
26这个答案是在2010年写的。自那时以来,这个做法有没有发生任何变化? - a06e
我刚刚尝试使用第二种方法(dpkg -i),但是出现了以下错误。有什么想法吗? dpkg: 错误: 无法访问 dpkg 状态区域:没有这个文件或目录 - krasnaya
44即使使用了--force-not-root选项,我仍然收到“dpkg: error: requested operation requires superuser privilege”错误提示。 - Clément
18朋友们,--force-not-root --root=$HOME或类似的变体都不起作用。Debian二进制软件包并不是设计用来安装在主目录中的,这是毋庸置疑的事实。或者换句话说,“下面的例子将把package.deb安装到你的主目录中。”不,它不会这样做。 - Faheem Mitha
4很遗憾,这样做不起作用。我尝试过--force-not-root --root=/your/custom/path - Viet
@krasnaya,你需要在你打算安装的目录下创建一些文件/目录:touch statusmkdir updates,可能还有一两个。根据出现的错误信息来指导你。 - JellicleCat
4"dpkg -x <package.deb> <dir>" 对我来说是有效的。 - zool
dpkg -x <package.deb> <dir> 这个方法对我有效。
我学到的一点是,运行这个命令后不要导出 <dir>,而是导出包含该软件包二进制文件的路径,例如我使用以下命令导出了路径 /path/to/dir/usr/bin/export PATH="/path/to/dir/usr/bin:$PATH"
- Ahwar
1"dkpg -x" 挽救了我的一天 - Qinsheng Zhang
1请注意,一些二进制软件包(如bison)的二进制文件中包含了硬编码的文件路径,例如/usr/share/bison/m4sugar/m4sugar.m4。对于这样的软件包,使用dpkg -x无法进行非root用户的工作安装,唯一的非root安装方式是从源代码构建。 - Jonathan Ben-Avraham
下载完软件包后,它是如何知道软件包的位置的?也就是说,dpkg -x package.deb dir 命令是如何工作的? - Charlie Parker
@CharlieParker,dpkg -x package.deb <dir>只是解压缩软件包,系统并不知道它的位置。这就是为什么你需要执行export PATH=$PATH:<dir>的原因。 - Jake Stevens-Haas

我猜你想安装jedit。首先你得找到这个软件包并下载它。我通常会选择从某个镜像站点下载deb文件,然后在控制台/终端中打开它:
  1. mkdir /tmp/jedit && cd /tmp/jedit -- 在 tmp 中创建一个新的目录并切换到该目录。
  2. wget http://mirrors.kernel.org/ubuntu/pool/universe/j/jedit/jedit_4.3.1.dfsg-0ubuntu1_all.deb -- 下载软件包
  3. ar x jedit_4.3.1.dfsg-0ubuntu1_all.deb 或者更简单地,ar x *.deb -- 这将解压文件内容
  4. tar xvzf data.tar.gz -- 文件 data.tar.gz 包含了执行该软件所需的所有内容
  5. usr/bin/jedit 打开编辑器
  6. 完成 :-)

您可以将这些文件移动到家目录中的某个位置,并从那里执行它们。


13请注意,预安装和后安装脚本不会被执行;此外,您需要自行解决任何依赖关系或路径问题。但是在默认安装情况下,这对于许多桌面应用程序来说已经足够了。 - jbowtie
1你也可以直接下载软件包,而不需要搜索它,只需使用apt-get download命令(请参考其他答案)。 - lib
我相信你的链接有问题。 - Winnemucca

我写了一个叫做JuNest的程序,基本上允许在你的$HOME/.junest目录下拥有一个非常小的Linux发行版(只包含软件包管理器)。
它允许你在家目录中拥有自定义系统,通过proot可以访问,并且你可以安装任何软件包而无需root权限。它可以在所有主要的Linux发行版下正常运行,唯一的限制是JuNest需要在Linux内核的最低推荐版本2.6.32上运行。
例如,在安装JuNest之后,要安装jedit:
$>junest -f
(junest)$> pacman -S jedit
(junest)> jedit

这在Ubuntu上运行得很好,对吧? - Seth
是的,如果Ubuntu的Linux内核版本大于或等于2.6.32,它将可以工作。 - user967489
3起初我以为你在谈论的是这个:链接。第二个大写的J才是区别所在。 - kon psych
1问题是我们是否可以安装Ubuntu软件包。使用Junest,我们只能安装ArchLinux软件包,而不能安装Ubuntu软件包。例如,如果同一个软件包在ArchLinux上不可用,那么这将没有帮助。话虽如此,还是感谢Junest。 - kiranpradeep
juju现在是junest,而且它之所以能够运行是因为proot。 - Rainb

我发现被接受的答案缺乏具体的例子。这是一个完整的工作示例:
# - opam (snap, no sudo)
# ref: https://askubuntu.com/questions/339/how-can-i-install-a-package-without-root-access
apt-get download opam
#apt-get download opam_1.2.2-4_amd64
#ls | less
mkdir -p ~/.local
dpkg -x opam_1.2.2-4_amd64.deb ~/.local/bin
export PATH="$HOME/.local/bin:$PATH"
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc.user

tr ':' '\n' <<< "$PATH"

opam --version

特别是你需要小心,因为apt-get download可能不会给你带有你期望的确切名称的.deb文件。
注意这个通常也有效。
# - install the bin then put it in path and restart your bash
mkdir ~/.rbenv
cd ~/.rbenv
git clone https://github.com/rbenv/rbenv.git .

export PATH="$HOME/.rbenv/bin:$PATH"
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
#    exec $SHELL
#bash

rbenv -v