Ubuntu 提供简单的 GUI 界面它允许您编辑、(停用)激活和删除 PPA。
但浏览所有的 GUI 对话框和菜单有时会很乏味,特别是当您在系统中添加了大量 PPA 时。
这就是为什么我想知道是否有办法从命令行禁用(和启用)PPA。
笔记:我不是在谈论添加/删除 PPA(这很容易做到:sudo add-apt-repository ppa
/ sudo add-apt-repository --remove ppa
)。我正在寻找一种暂时禁用 PPA 并根据需要重新启用它的方法 - 所有这些都可以在 CLI 中完成。
编辑:
Sushantp606 和 Davidson Chua 的回答是一个很好的起点,让我改变了问题的范围。知道可以使用文件管理存储库当然是件好事,sources.list
但对我来说这仍然是一项非常繁琐的任务。我很想知道是否有办法像软件属性窗口一样自动执行此操作。
理想情况下,我希望找到一个命令,可以通过 PPA 地址快速启用和禁用 PPA,例如:
ppa_activate ppa:synapse-core/ppa
和
ppa_deactivate ppa:synapse-core/ppa
答案1
ppa 信息实际上保存在 中的单独文件中/etc/apt/sources.list
。以下代码将执行所需的操作以停用或激活所需的存储库。将下面给出的代码保存在文件中,例如mod-ppa
#!/bin/bash
mydir=/etc/apt/sources.list.d
function getlist(){
echo -e "\n\tchose one of the following lists"
echo -e "\t================================"
for itm in `seq 1 $1`
do
echo -e "\t`echo $2 | awk -v x=$itm '{print $x}' | awk -F/ '{print $NF}'`"
done
}
if [ $# -lt 1 ]
then
echo "E: mod_ppa: missing operand"
echo "Try 'mod_ppa --help' for more information."
exit 0
elif [ $# -lt 2 ]
then
echo -e "E: syntax error,\nTry 'mod_ppa --help' for more information."
exit 0
fi
case "$1" in
-d )
ppa=`ls $mydir/$2*.list`
num=`echo $ppa | wc -w`
if [ `echo $num` -gt 1 ]
then
getlist "$num" "$ppa"
else
if [ -e $mydir/$2*.list ]
then
sed -i "s/^deb\-src/\#deb\-src/" $ppa
sed -i "s/^deb\ http/\#deb\ http/" $ppa
else
echo "E: ppa does not exist/check ppa name"
fi
fi
;;
-a )
ppa=`ls $mydir/$2*.list`
num=`echo $ppa | wc -w`
if [ `echo $num` -gt 1 ]
then
getlist "$num" "$ppa"
else
if [ -e $mydir/$2*.list ]
then
sed -i "s/^\#deb\-src/deb\-src/" $ppa
sed -i "s/^\#deb\ http/deb\ http/" $ppa
else
echo "E: ppa does not exist/check ppa name"
fi
fi
;;
--help)
echo "Usage: mod_ppa [OPTION] [PPA NAME'S INITIAL PART]"
echo "Mandatory argument options."
echo "-a Activate certain ppa"
echo "-d Deactivate certain ppa"
;;
* )
echo "mod_ppa: invalid option '$1'"
echo "Try 'mod_ppa --help' for more information."
;;
esac
将脚本保存在 中/home/<username>/bin/
,通常位于 PATH 中。要检查,请在终端中写入
echo $PATH
如果没有,请将/home/<username>/bin/
以下行.bash_profile
或.bashrc
任何方便的行添加到 PATH,
export PATH=$PATH:$HOME/bin
然后source该文件,在终端中写入
source .bash_profile [or source .bashrc]
赋予mod_ppa
执行权限,在终端中写入
chmod +x mod_ppa
用法
要停用 ppa,请使用
sudo mod_ppa -d <ppa_name's_initial_part>
例如,要停用ppa:webupd8team/java
使用
sudo mod_ppa -d webupd8team
要激活 ppa,请使用
sudo mod_ppa -a <ppa_name's_initial_part>
例如,激活ppa:synapse-core
使用
sudo mod_ppa -a synapse-core
帮助
mod_ppa --help
我假设您不会对停用 中列出的基本和默认 ppa 感兴趣/etc/apt/sources.list
。无论如何,只有少数几个,如果您愿意,您可以手动停用它们。Sushantp606 的回答非常有帮助。
怎么运行的
当使用软件中心(GUI)停用任何 ppa 存储库时,它实际上会在处相应的 ppa 文件#
内的所有行前面放置一个。通常大多数文件包含以和开头的两行,少数文件只有一行。上面的脚本使用 执行相同的操作。首先,它检查 ppa .list(用户输入)是否存在。然后相应地在行前面放置或删除一个。.list
/etc/apt/sources.list.d/
.list
deb http
deb-src
sed
#
由于该脚本应该处理操作系统的一些敏感部分,因此我尝试对其进行防御性编码。不断检查传递给脚本的参数并相应地设置一些错误消息。还help
添加了一个小部分。这些部分增加了代码的长度。
答案2
甚至更简单的脚本也可以在激活或停用特定 ppa 之间切换。将下面给出的代码保存在文件中,例如toggle_ppa.sh
。
#!/bin/bash
#
# toggle_ppa.sh
#
# created by souravc (https://askubuntu.com/users/127327/)
# modified by Glutanimate (https://askubuntu.com/users/81372/)
#
# originally released at https://askubuntu.com/q/383605/81372
#
# DESCRIPTION: Detects if a PPA is active/inactive and deactivates/activates it
# on user confirmation.
#
# USAGE: toggle_ppa.sh ppa:launchpaduser/ppaname
### VARIABLES
SOURCEDIRECTORY=/etc/apt/sources.list.d
PPA="$1"
### USAGE CHECKS
## Arguments
if [ -z "$PPA" ]
then
echo "Error: Please provide a PPA name to toggle between activation/deactivation"
echo "The PPA name should be formatted as it appears on launchpad, e.g.:
"$0" ppa:webupd8team/y-ppa-manager"
exit 1
fi
## Root privileges
if [ "$(whoami)" != "root" ]; then
echo "Error: This script needs root privileges. Restarting..."
sudo "$0" "$1"
exit
fi
### MAIN
SOURCELIST_NOPFX="${PPA#*:}" #remove 'ppa:' prefix
SOURCELIST="${SOURCELIST_NOPFX////-}"-$(lsb_release -cs) #replace all slashes with dashes, include release
SOURCEFILE="$SOURCEDIRECTORY"/"$SOURCELIST".list #compose sources list path
if [ -e "$SOURCEFILE" ]
then
echo "Processing $SOURCEFILE..."
SOURCE_COMMENTED=$(grep "^\#deb\ " "$SOURCEFILE") #check if sources line is commented
if [ -z "$SOURCE_COMMENTED" ]
then
echo "$PPA is active. Going to deactivate. Proceed? [ y/n ]"
read ANSWER
if [ $ANSWER == "y" ]
then
sed -i "s/^deb\-src/\#deb\-src/" $SOURCEFILE
sed -i "s/^deb\ http/\#deb\ http/" $SOURCEFILE
echo "Updating package index files..."
sudo apt-get update
echo "Done."
else
echo "Aborted."
exit 0
fi
else
echo "$PPA is inactive. Going to activate. Proceed? [ y/n ]"
read ANSWER
if [ $ANSWER == "y" ]
then
sed -i "s/^\#deb\-src/deb\-src/" $SOURCEFILE
sed -i "s/^\#deb\ http/deb\ http/" $SOURCEFILE
echo "Updating package index files..."
sudo apt-get update
echo "Done."
else
echo "Aborted."
exit 0
fi
fi
else
echo "Error: Source file at $SOURCEFILE for $PPA does not exist. Please check PPA name."
exit 0
fi
跟着另一个答案中给出了程序将文件保存在 PATH 中并使其可执行。
用法
sudo toggle_ppa.sh <full-ppa-name>
例子
sudo toggle_ppa.sh ppa:webupd8team/java
怎么运行的
该代码的工作原理是与我的其他答案相同。代码以非常交互的方式运行。当有人以 ppa 名称作为参数运行此代码时,它将显示 PPA 的当前状态以及代码在成功执行后将执行的操作。然后它将请求用户的许可。只有当用户输入'y'
确认代码时,它才会更改 PPA 的状态并激活/停用它。如果用户输入“否”,它将立即中止'n'
。
答案3
通过编辑
/etc/apt/sources.list
文件,我们可以从命令行添加,删除或暂时禁用软件存储库。只需通过终端注释掉不需要的存储库即可。
我无法发出命令,这只是一个想法。请告诉我你是否可以通过终端命令连接它,例如-
注释掉 /etc/apt/sources.list 中的源存储库的命令是:
sudo sed -i 's/^deb\-src/\#deb\-src/' /etc/apt/sources.list
并取消注释使用
sudo sed -i 's/^\#deb\-src/deb\-src/' /etc/apt/sources.list
使用您想要禁用/注释掉的存储库,而不是 s/^\#deb\-src/deb\-src/
在进行任何更改之前,制作一个备份源列表文件,如下所示-
sudo cp -v /etc/apt/sources.list /etc/apt/sources.list.backup
答案4
我知道这个答案不是你想要的(一个命令解决方案)。但对于搜索如何在不删除 PPA 的情况下禁用它的人来说,这个帖子是 Google 搜索结果中排名最高的帖子之一。
最简单的方法是通过注释禁用/etc/apt/sources.list.d
文件夹中的条目。顺便说一下,“软件与更新“禁用条目时有效”其他更新“ 标签。
示例:禁用 Chrome 更新
打开终端并编辑/etc/apt/sources.list.d/google-chrome.list
文件:
sudo nano /etc/apt/sources.list.d/google-chrome.list
deb
然后像这样禁用该行:
# deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main
保存并完成。