stw*_*sel 307 command-line ppa scripts repository add-apt-repository
但是如何将所有存储库和 PPA 的列表放入一个脚本中,我可以在新机器上运行该脚本以复制包括密钥在内的存储库设置?
我知道我可以查看/etc/apt/sources.list
and /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)
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)
这应该可以解决问题。我需要一个关于超级用户的问题来找出正确的正则表达式。
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)
这是我的脚本“ 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
/参数(请参阅 参考资料)。--yes
add-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
最后一行的命令,其余的都是样板文件。
使用add-apt-repository
from software-properties-common
,非常简单:
add-apt-repository --list
Run Code Online (Sandbox Code Playgroud)
可以轻松地将输出提供回add-apt-repository
命令以重新创建源。
然而,它只列出了deb
来源。如果您也对ppa
s 感兴趣,那么这个问题的其他答案会更有用。
看来该--list
选项仅自 0.99.0+ 版本起可用software-properties-common
,默认情况下从 Ubuntu 20.10 (Groovy) 开始可用。因此,您需要更新软件版本,或者将发行版升级到至少 20.10。