如何使用单个命令从命令行激活(取消激活)PPA?

如何使用单个命令从命令行激活(取消激活)PPA?

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/.listdeb httpdeb-srcsed#

由于该脚本应该处理操作系统的一些敏感部分,因此我尝试对其进行防御性编码。不断检查传递给脚本的参数并相应地设置一些错误消息。还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

保存并完成。

相关内容