分享一个实用的linux软件版本管理软件--update-alternatives

Author Avatar
ssssdl 8月 08, 2019

前一阵子发现最新的kali的默认java已经不是1.8了,就会导致之前自己一直用的破解的burp就用不了了,然后想换一下kali的java环境,然后就查到了这样一条命令update-alternatives 可以直接修改kali的Java版本,有点神奇,而且比较实用,就省去解决各种软件版本问题的时间,尤其是python和java这种版本之间可能不兼容的软件,给大家分享一下。

简介(抄的)

update-alternatives 命令用于处理linux系统中软件版本的切换,在各个linux发行版中均提供了该命令,命令参数略有区别,但大致是一样的。

命令的原理

看起来很复杂,其实感觉挺简单的,就是一个软连接!的原理,首先你要用update-alternatives设置好你的软件包路径和软连接到的地址(/usr/bin/下),然后当你使用这个命令切换软件版本的时候,这个update-alternatives就会生成对应的软连接,这样如果你是连接到/usr/bin下就可以直接在命令行里面执行了,这个我说起来比较绕口,所以整两个例子:一个是针对应用程序,就是直接可以执行的,一个是针对软件包,需要配环境变量的。

演示

单个程序版本控制

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
~ ᐅ # 首先是Python
~ ᐅ # Ubuntu会自带Python,其映射关系如下
~ ᐅ # lrwxrwxrwx 1 root root 9 Jun 11 05:40 python -> python2.7
~ ᐅ # lrwxrwxrwx 1 root root 9 Jun 11 05:40 python2 -> python2.7
~ ᐅ # -rwxr-xr-x 1 root root 3.5M Nov 27 2018 python2.7
~ ᐅ # lrwxrwxrwx 1 root root 9 Jun 11 05:40 python3 -> python3.6
~ ᐅ # -rwxr-xr-x 2 root root 4.4M Jan 14 2019 python3.6
~ ᐅ # 虽然安装了两个版本的Python,但并没有使用update-alternatives注册
~ ᐅ # 那就当做Python已经装好了,我们直接使用update-alternatives进行版本控制就可以了
~ ᐅ # 第一步,将Python注册到update-alternatives
~ ᐅ
~ ᐅ
~ ᐅ
~ ᐅ # 注册python2.7
~ ᐅ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 10
update-alternatives: 使用 /usr/bin/python2.7 来在自动模式中提供 /usr/bin/python (python)
~ ᐅ
~ ᐅ
~ ᐅ # install代表注册,后面四个参数分别是:
~ ᐅ # 要产生软连接的目标地址
~ ᐅ # 注册的组件名(后面会使用这个控制版本,相同软件一定相同)
~ ᐅ # 是程序源地址
~ ᐅ # 优先级,越大优先级越高
~ ᐅ
~ ᐅ
~ ᐅ # 注册python3.6
~ ᐅ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 20
update-alternatives: 使用 /usr/bin/python3.6 来在自动模式中提供 /usr/bin/python (python)
~ ᐅ
~ ᐅ
~ ᐅ # 查看python当前版本
~ ᐅ python --version
Python 3.6.8
~ ᐅ
~ ᐅ # 交互式修改python版本
~ ᐅ sudo update-alternatives --config python
有 2 个候选项可用于替换 python (提供 /usr/bin/python)。

选择 路径 优先级 状态
------------------------------------------------------------
* 0 /usr/bin/python3.6 20 自动模式
1 /usr/bin/python2.7 10 手动模式
2 /usr/bin/python3.6 20 手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:1
update-alternatives: 使用 /usr/bin/python2.7 来在手动模式中提供 /usr/bin/python (python)
~ ᐅ
~ ᐅ # 查看python版本
~ ᐅ python --version
Python 2.7.15+
~ ᐅ
~ ᐅ
~ ᐅ # 非交互式修改
~ ᐅ sudo update-alternatives --set python /usr/bin/python3.6
update-alternatives: 使用 /usr/bin/python3.6 来在手动模式中提供 /usr/bin/python (python)
~ ᐅ python --version
Python 3.6.8
~ ᐅ
~ ᐅ
~ ᐅ # 查看python状态
~ ᐅ sudo update-alternatives --display python
python - 手动模式
最佳链接版本为 /usr/bin/python3.6
链接目前指向 /usr/bin/python3.6
链接 python 指向 /usr/bin/python
/usr/bin/python2.7 - 优先级 10
/usr/bin/python3.6 - 优先级 20
~ ᐅ
~ ᐅ
~ ᐅ
~ ᐅ
~ ᐅ # 还有删除,设置手动模式啥的就不一一演示了
~ ᐅ
~ ᐅ
~ ᐅ

程序包版本控制

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
~ ᐅ # 首先下载好软件包,解压好,存到自己想存的路径下(/usr/local)
~ ᐅ # 然后设置环境变量如下(设置环境变量可以修改/etc/profile,也可以~/.bash_profile,然后我用的zsh可以修改~/.zshrc。虽然文件不一样,但添加的内容是一样的)
export JAVA_HOME=/usr/bin/jdk # 注意这里的jdk是软连接的目标地址
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin
~ ᐅ
~ ᐅ
~ ᐅ
~ ᐅ # 然后对我下载的三个jdk进行注册
~ ᐅ sudo update-alternatives --install /usr/bin/jdk java /usr/local/jdk-12.0.1 20
update-alternatives: 使用 /usr/local/jdk-12.0.1 来在自动模式中提供 /usr/bin/jdk (java)
~ ᐅ sudo update-alternatives --install /usr/bin/jdk java /usr/local/jdk1.8.0_221 30
update-alternatives: 使用 /usr/local/jdk1.8.0_221 来在自动模式中提供 /usr/bin/jdk (java)
~ ᐅ sudo update-alternatives --install /usr/bin/jdk java /usr/local/jdk1.6 10
~ ᐅ sudo update-alternatives --display java
java - 自动模式
最佳链接版本为 /usr/local/jdk1.8.0_221
链接目前指向 /usr/local/jdk1.8.0_221
链接 java 指向 /usr/bin/jdk
/usr/local/jdk-12.0.1 - 优先级 20
/usr/local/jdk1.6 - 优先级 10
/usr/local/jdk1.8.0_221 - 优先级 30
~ ᐅ
~ ᐅ # 查看Java版本
~ ᐅ # 可能需要重启一下,发现这个主题还可以计数
[oh-my-zsh] Random theme '/home/ssssdl/.oh-my-zsh/themes/skaro.zsh-theme' loaded...
1 ~ » java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
2 ~ »
2 ~ »
2 ~ » # 交互式修改Java版本
3 ~ » sudo update-alternatives --config java
[sudo] ssssdl 的密码:
有 3 个候选项可用于替换 java (提供 /usr/bin/jdk)。

选择 路径 优先级 状态
------------------------------------------------------------
* 0 /usr/local/jdk1.8.0_221 30 自动模式
1 /usr/local/jdk-12.0.1 20 手动模式
2 /usr/local/jdk1.6 10 手动模式
3 /usr/local/jdk1.8.0_221 30 手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:1
update-alternatives: 使用 /usr/local/jdk-12.0.1 来在手动模式中提供 /usr/bin/jdk (java)
4 ~ » java -version
java version "12.0.1" 2019-04-16
Java(TM) SE Runtime Environment (build 12.0.1+12)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
5 ~ »

结语

到这整合命令就说完了,其实还有一些其他的参数,比如remove从列表中删除已经注册的程序等等吧,感觉个人使用的时候还是交互式修改比较常用,shell脚本啥的可能还是要用set直接修改,然后使用这种方法可以管理很多软件,尤其是对于一些经常需要好几个版本软件切换的小伙伴,然后工具原理比较简单,有时间可以在Windows上搞一个,来一波GitHub摘星啥的。要是感觉我没说全可以去网上再看看,就这样吧。。