Ubuntu 系统下在无 root 情况下安装软件

进组后成功拥有组里服务器的使用权限,但为了安全考虑,研一新生不会有root权限。
为了能够畅快使用自己需要的软件,这段时间也是捉摸了一些不使用sudo就能安装软件的方法,并写在博客中记录一下。

顺便提一下,因为无法使用root权限,因此安装后的程序也无法使用root,需要SUID提权至root的的程序也无法正常运行。

单一可执行进程

不少轻量级软件都会将软件本体编译在一个二进制可执行文件中,例如分布式文件系统juicefs、云存储软件rclone等。这类软件甚至在官网上都会写明“仅有一个二进制文件”。
用户仅需将软件解压缩到自己喜欢的地方,并配置好PATH路径即可。

我常用的放置这类二进制文件的路径是$HOME/bin,即自己的用户根目录。为了能够在bash中直接使用,只需要在~/.bashrc中增加以下内容:

1
PATH="$HOME/bin:$PATH"

虽然没找到切实的证据,但似乎确实有版本的 Ubuntu/shell 会自动将该目录增加到~/.profile文件中,在 login shells 的状态下可以直接使用$HOME/bin中的命令,而无需在.bashrc中二次设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 以下是我的.prfile文件,可以看到其中确实添加了$HOME/bin路径

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi

请注意,虽然有很多博客都会强调,在设置PATH路径时应在前面加上export,以便“导出”该变量,使之可以让子进程使用。但我的.profile中确实没有在PATH之前加上export,因此我在.bashrc中延续了这一传统。
值得注意的时,即使未在.bashrc中设置export PATH,最终的bash环境中,PATH变量也是导出状态。

1
2
3
4
$ export -p # 查看当前bash环境中的导出变量有哪些
...
declare -x PATH="/data/xxx/.local/bin:/data/xxx/bin:/data/xxx/bin:/data/xxx/usr/bin:/data/xxx/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
...

deb包直接解压缩

对于轻量软件而言,可以使用dpkg -x <.deb文件路径> <解压路径>将deb包中的内容解压到指定目录中即可使用。部分软件安装过程中需要在安装前或安装后执行一定的脚本,这部分我也没学会,建议各位自行摸索XD

deb包解压后的文件目录结构遵循FHS(Filesystem Hierarchy Standard,文件系统层次结构标准),因此我选择在用户根目录下创建属于属于自己的usr目录,并将deb包的解压目录指定为此。

值得注意的是,不同软件包会有不同的依赖关系,在正式使用前需要补足依赖,否则可能导致未知的错误。

源码编译安装

一般不推荐自己编译源码,因为需要安装一系列的开发库文件,或者说是lib-dev文件。
如果一定要自己编译软件包,那我建议选择在package.ubuntu.com或者使用apt source下载全部三个文件,以curl为例

1
2
3
- curl_7.68.0-1ubuntu2.23.dsc            # 为Debian包生成的源代码控制信息
- curl_7.68.0.orig.tar.gz # curl原始代码
- curl_7.68.0-1ubuntu2.23.debian.tar.xz # 为适配debian或为修补curl错误而引入的补丁文件等

这里只简述了以上文件的含义,有关编译或Debian开发的具体内容可参见Debian开发者手册

这里感谢所有开源贡献者的努力,使得Debian和其他开源项目具有完善且实用的文档

完成以上三个文件的下载并将三个文件放置于同一目录下后,执行dpkg-source -x curl_7.68.0-1ubuntu2.23.dsc命令,便可在同级目录下生成curl源码。
随后,进入生成的源码目录,这里是curl-7.68.0,并执行./configure --prefix=<安装目录,例如$HOME/usr/>命令,即可生成编译和安装所需的Makefile文件。
执行make编译,编译成功后执行make install进行安装即可。

通常情况下,在完成./configure这一后会显示缺少一些库文件,这时候就需要打开package.ubuntu.com,在源码包页面查找构建时需要的依赖库有哪些,并挨个补足了,例如源码包: curl (7.68.0-1ubuntu2.23) [security]。补足后在执行./configure命令时,需要按照./configure --help中的指引传入库文件目录,或在环境变量PKG_CONFIG_PATH中指定路径。


结语:还是有root权限方便。


Ubuntu 系统下在无 root 情况下安装软件
https://www.yao9e.cn/2024/08/09/7be51fc8d210/
作者
yao9e
发布于
2024年8月9日
许可协议