如何从命令行获取所有存储库和 PPA 的列表到安装脚本中?

stw*_*sel 307 command-line ppa scripts repository add-apt-repository

我知道如何列出系统上安装的所有软件包

但是如何将所有存储库和 PPA 的列表放入一个脚本中,我可以在新机器上运行该脚本以复制包括密钥在内的存储库设置?

我知道我可以查看/etc/apt/sources.listand /etc/apt/sources.list.d,但我正在寻找一种方法来生成一个脚本,该脚本apt-add-repository在新系统上执行所有命令(整理获取所有密钥)。

有任何想法吗?

woj*_*jox 196

您可以通过以下方式显示所有内容:

grep ^ /etc/apt/sources.list /etc/apt/sources.list.d/*
Run Code Online (Sandbox Code Playgroud)

  • `egrep -v '^#|^ *$' /etc/apt/sources.list /etc/apt/sources.list.d/*` 删除注释掉的行和空行怎么样? (30认同)
  • 如果你不打算过滤掉任何东西,那么运行 `cat /etc/apt/sources.list /etc/apt/sources.list.d/*` 不是更简单吗? (17认同)
  • 我使用 grep ^[^#] ... -- 它自动隐藏所有注释掉的源 (8认同)
  • 你能解释一下`grep ^ /etc/apt/sources.list /etc/apt/sources.list.d/*`中`grep`之后`^`的使用吗? (4认同)
  • @vasa1 插入符号 ^ 和美元符号 $ 是元字符,分别匹配行首和行尾的空字符串。 (4认同)
  • 使用 `grep ^` 而不是 `cat` 非常令人困惑。 (2认同)

stw*_*sel 113

谢谢指点。通过一些清理,我得到了一个列出 PPA 的脚本,但没有列出任何其他存储库:

#! /bin/sh 
# listppa Script to get all the PPA installed on a system ready to share for reininstall
for APT in `find /etc/apt/ -name \*.list`; do
    grep -o "^deb http://ppa.launchpad.net/[a-z0-9\-]\+/[a-z0-9\-]\+" $APT | while read ENTRY ; do
        USER=`echo $ENTRY | cut -d/ -f4`
        PPA=`echo $ENTRY | cut -d/ -f5`
        echo sudo apt-add-repository ppa:$USER/$PPA
    done
done
Run Code Online (Sandbox Code Playgroud)

当你用listppa > installppa.sh你的脚本调用它时,你可以在新机器上复制以重新安装所有 PPA。

下一站:对其他存储库执行此操作:

#! /bin/sh
# Script to get all the PPA installed on a system
for APT in `find /etc/apt/ -name \*.list`; do
    grep -Po "(?<=^deb\s).*?(?=#|$)" $APT | while read ENTRY ; do
        HOST=`echo $ENTRY | cut -d/ -f3`
        USER=`echo $ENTRY | cut -d/ -f4`
        PPA=`echo $ENTRY | cut -d/ -f5`
        #echo sudo apt-add-repository ppa:$USER/$PPA
        if [ "ppa.launchpad.net" = "$HOST" ]; then
            echo sudo apt-add-repository ppa:$USER/$PPA
        else
            echo sudo apt-add-repository \'${ENTRY}\'
        fi
    done
done
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题。我需要一个关于超级用户问题来找出正确的正则表达式。

  • 请注意,PPA 名称可能包含点,因此我认为您想将正则表达式更改为 `http://ppa.launchpad.net/[a-z0-9-]\+/[a-z0-9.-]\ +` (2认同)
  • 不,您想要将正则表达式更改为“[[:graph:]]”而不是“[az...blah.anything]”,因为它将匹配任何字母数字+标点符号字符 - 这就是 PPA 名称的组成部分。 (2认同)

Byt*_*der 34

我感到惊讶的是,尚未发布将所有启用的二进制软件源以及它们指定的文件放在一起的最简单但最有效的方法:

grep -r --include '*.list' '^deb ' /etc/apt/sources.list /etc/apt/sources.list.d/
Run Code Online (Sandbox Code Playgroud)

从所有处理过的文件中,这将打印以deb. 这不包括注释行以及deb-src启用源代码存储库的行。

它实际上只搜索*.list将由 解析的所有文件apt,但例如不搜索*.list.save用于备份的文件或其他具有非法名称的文件。


如果你想要一个更短但可能只有在所有情况下 99.9% 的正确输出可能搜索太多文件(包括所有/etc/apt/sources.list*文件和目录,不仅/etc/apt/sources.list和`/etc/apt/sources.list.d/*),你也可以用这个:

grep -r --include '*.list' '^deb ' /etc/apt/sources.list*
Run Code Online (Sandbox Code Playgroud)

除非有不应该存在的文件,否则输出将是相同的。


我机器上的一个示例输出是这样的:

/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily main restricted
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates main restricted
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily universe
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates universe
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily multiverse
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates multiverse
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-backports main restricted universe multiverse
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security main restricted
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security universe
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security multiverse
/etc/apt/sources.list:deb http://archive.canonical.com/ubuntu wily partner
/etc/apt/sources.list.d/maarten-fonville-ubuntu-ppa-wily.list:deb http://ppa.launchpad.net/maarten-fonville/ppa/ubuntu wily main
/etc/apt/sources.list.d/webupd8team-ubuntu-tor-browser-wily.list:deb http://ppa.launchpad.net/webupd8team/tor-browser/ubuntu wily main
/etc/apt/sources.list.d/fossfreedom-ubuntu-indicator-sysmonitor-wily.list:deb http://ppa.launchpad.net/fossfreedom/indicator-sysmonitor/ubuntu wily main
/etc/apt/sources.list.d/getdeb.list:deb http://archive.getdeb.net/ubuntu wily-getdeb apps
Run Code Online (Sandbox Code Playgroud)

如果你想要更漂亮的输出,让我们通过管道传递它sed

grep -r --include '*.list' '^deb ' /etc/apt/ | sed -re 's/^\/etc\/apt\/sources\.list((\.d\/)?|(:)?)//' -e 's/(.*\.list):/\[\1\] /' -e 's/deb http:\/\/ppa.launchpad.net\/(.*?)\/ubuntu .*/ppa:\1/'
Run Code Online (Sandbox Code Playgroud)

我们将看到这一点:

deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily main restricted
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates main restricted
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily universe
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates universe
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily multiverse
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates multiverse
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-backports main restricted universe multiverse
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security main restricted
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security universe
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security multiverse
deb http://archive.canonical.com/ubuntu wily partner
[maarten-fonville-ubuntu-ppa-wily.list] ppa:maarten-fonville/ppa
[webupd8team-ubuntu-tor-browser-wily.list] ppa:webupd8team/tor-browser
[fossfreedom-ubuntu-indicator-sysmonitor-wily.list] ppa:fossfreedom/indicator-sysmonitor
[getdeb.list] deb http://archive.getdeb.net/ubuntu wily-getdeb apps
Run Code Online (Sandbox Code Playgroud)


Key*_*0de 20

运行以下命令:

apt-cache policy | grep http | awk '{print $2 $3}' | sort -u
Run Code Online (Sandbox Code Playgroud)

来源

  • 注意:“apt-cache策略”只会在运行“apt-get update”后显示存储库。如果您刚刚使用“add-apt-repository”添加了一个存储库,则在运行“apt-get update”之前,它不会与“apt-cachepolicy”一起显示 (4认同)

ejm*_*ejm 8

这是我的脚本“ list-apt-repositories”,其中列出了“ ”/etc/sources.list"和“ /etc/sources.list.d/*.list”中的所有存储库。您可以添加--ppa-only以仅显示 PPA。PPA 会自动转换为ppa:USER/REPO格式。

list_sources相关部分是和函数中的 5 行list_ppa,其余部分只是将其包装在方便的 shell 脚本中的样板。

list-apt-repositories:

#!/bin/sh

usage () {
  cat >&2 <<USAGE
$0 [--ppa-only]

Options:
  --ppa-only            only list PPAs
USAGE
  exit $1
}

list_sources () {
  grep -hE '^deb\s' /etc/apt/sources.list /etc/apt/sources.list.d/*.list |\
    sed '/ppa/ s/deb //g' |\
    sed -re 's#http://ppa\.launchpad\.net/([^/]+)/([^/]+)(.*?)$#ppa:\1/\2#g'
}

list_ppa () {
  list_sources | grep '^ppa:'
}

generate=list_sources

while test -n "$1"
do
  case "$1" in
    -h|--help) usage 1;;
    --ppa-only) generate=list_ppa;;
    *)
      printf -- "Unknown argument '$1'\n" >&2
      usage 2
    ;;
  esac
  shift
done

$generate
Run Code Online (Sandbox Code Playgroud)

要制作安装脚本,请通过管道输入另一个脚本“ make-apt-repository-install-script”。生成的脚本支持非交互式使用的-y/参数(请参阅 参考资料)。--yesadd-apt-repository(1)

make-apt-repository-install-script:

#!/bin/sh

if test -n "$1"
then
  cat >&2 <<USAGE
Usage: $0 < PATH_TO_LIST_OF_REPOS
       list-apt-repositories [--ppa-only] | $0

No options recognized.

Reads list of repositories from stdin and generates a script to install them
using \`add-apt-repository(1)\`. The script is printed to stdout.

The generated script supports an optional
\`-y\` or \`--yes\` argument which causes the \`add-apt-repository\` commands
to be run with the \`--yes\` flag.
USAGE
  exit 1
fi

cat <<INSTALL_SCRIPT
#!/bin/sh
y=
case "\$1" in
  -y|--yes) y=\$1;;
  '') y=;;
  *)
    printf '%s\n' "Unknown option '\$1'" "Usage: \$0 [{-y|--yes}]" >&2
    exit 1
  ;;
esac
INSTALL_SCRIPT

xargs -d'\n' printf "add-apt-repository \$y '%s'\n"
Run Code Online (Sandbox Code Playgroud)

同样,重要的部分是xargs最后一行的命令,其余的都是样板文件。


sma*_*c89 6

使用add-apt-repositoryfrom software-properties-common,非常简单:

add-apt-repository --list
Run Code Online (Sandbox Code Playgroud)

可以轻松地将输出提供回add-apt-repository命令以重新创建源。

然而,它只列出了deb来源。如果您也对ppas 感兴趣,那么这个问题的其他答案会更有用。

可用性

看来该--list选项仅自 0.99.0+ 版本起可用software-properties-common,默认情况下从 Ubuntu 20.10 (Groovy) 开始可用。因此,您需要更新软件版本,或者将发行版升级到至少 20.10。

  • Ubuntu 20.04 上没有这样的选项 `--list` (3认同)