在linux环境下载离线安装包,经常会存在安装依赖的问题,为了方便解决下载依赖的问题,通过shell脚本,根据设置的依赖深度,全部自动下载。
** 该脚本适用于Ubuntu、UOS等Debian系使用apt依赖管理工具的linux操作系统。
** Centos等Redhat系使用yum或者dnf依赖管理工具的系统,处理逻辑和此一致。
#!/bin/bash
# Date:2022-04-13
# Author: Create by cooper_73
echo -e "`date` \nReadly to download all of $1's packages \n\
\$1 is target Software name; \n\
\$2 indicates the depth of the dependency level. e.g.:1、2、3...;\n\
\$3 is the package architecture. e.g.:amd64、arm64..."
sleep 1
getDepends()
{
pkg_list=`apt-cache depends $1|grep -E "依赖|建议|推荐"|grep -v "<\|>"`
pkg_download=`apt-cache depends $1|grep -E "依赖|建议|推荐"|grep -v "<\|>"|awk -F: '{print $2}'|tr '\n' '@'|sed "s/\@/:$2/g"`
}
pkgDownload()
{
echo -e "\nBegin to download...\n"
if [ -d "./packages/" ];then
chmod 777 packages && cd packages && rm -rf * && apt-get download $dl_pkgs > /dev/null
else
mkdir packages && chmod 777 packages && cd packages && apt-get download $dl_pkgs > /dev/null
fi
ls -t ../packages | tr ' ' '\n'
echo -e "\n!!! Download Complete !!!\n"
}
lah=`sudo dpkg --print-architecture`
ah=$3
lv=$2
if [ ! $ah ];then
ah=$lah
fi
if [ ! $lv ];then
lv=0
fi
pkgs="$1:$ah"
i=0
echo -e "\nArchitecture:$ah"
if [ $ah != $lah ];then
sudo dpkg --add-architecture $ah
echo -e "\nUpdate repo for architecture $ah...\n"
sudo apt-get update > /dev/null
fi
echo -e "Search all of depends about $1 with lever $lv :\n"
while [ $i -lt $lv ];
do
let i++
all_list="$pkgs"
all_pkgs="$pkgs"
for p in $pkgs
do
getDepends $p $ah
all_list="$all_list $pkg_list"
all_pkgs="$all_pkgs $pkg_download"
done
pkgs=$all_pkgs
done
echo $all_list
dl_pkgs=`echo "$pkgs $all_pkgs"|tr ' ' '\n'|sort -ru|tr '\n' ' '`
echo $dl_pkgs
pkgDownload
if [ "$ah" != "$lah" ];then
echo "Delete forgin-architecture:$ah"
sudo dpkg --remove-architecture $ah
sudo apt-get update >/dev/null
fi
转自:https://www.cnblogs.com/cooper-73/p/16139180.html
根据上面脚本,改写成兼容CentOS的脚本:
#!/bin/bash
# Date:2022-04-13
# Author: Create by cooper_73
# Modify:melodyding by 2022-09-30
echo -e "`date` \nReadly to download all of $1's packages \n\
\$1 is target Software name; \n\
\$2 indicates the depth of the dependency level. e.g.:1、2、3...;\n"
sleep 1
down_dir=/root/packages
if [ $1x == ""x ];then
echo "Error: Please enter parameters."
exit 1
fi
getDepends()
{
pkg_list=`yum repoquery --deplist $1 2>/dev/null | awk '/provider: /{print $2}' | sed 's/-[0-9].*//g' | sort -u | xargs`
pkg_download=`yum repoquery --deplist $1 2>/dev/null | awk '/provider: /{print $2}' | sed 's/-[0-9].*//g' | sort -u | xargs`
}
pkgDownload()
{
echo -e "\nBegin to download...\n"
cd $down_dir
yum install -y --downloadonly --downloaddir=$down_dir $dl_pkgs
ls -t $down_dir | tr ' ' '\n'
echo -e "\n!!! Download Complete !!!\n"
}
checkEnv()
{
if [ `yum --version | wc -l` == 0 ];then
yum install -y yum yum-utils 2>/dev/null
else
[ `yumdownloader --version 2>/dev/null | wc -l` == 0 ] && yum install -y yum-utils
fi
if [ -d $down_dir ];then
chmod 777 $down_dir
else
mkdir $down_dir && chmod 777 $down_dir
fi
}
#the package architecture.
lah=`uname -i`
ah=$3
lv=$2
if [ ! $ah ];then
ah=$lah
fi
if [ ! $lv ];then
lv=0
fi
pkgs="$1"
i=0
echo -e "\nArchitecture:$ah"
#if [ $ah != $lah ];then
# sudo dpkg --add-architecture $ah
# echo -e "\nUpdate repo for architecture $ah...\n"
# sudo apt-get update > /dev/null
#fi
echo -e "Search all of depends about $1 with lever $lv :\n"
while [ $i -lt $lv ];
do
let i++
all_list="$pkgs"
all_pkgs="$pkgs"
for p in $pkgs
do
getDepends $p $ah
all_list="$all_list $pkg_list"
all_pkgs="$all_pkgs $pkg_download"
done
pkgs=$all_pkgs
done
checkEnv
echo $all_list
dl_pkgs=`echo "$pkgs $all_pkgs"|tr ' ' '\n'|sort -ru|tr '\n' ' '`
echo $dl_pkgs
pkgDownload
#if [ "$ah" != "$lah" ];then
# echo "Delete forgin-architecture:$ah"
# sudo dpkg --remove-architecture $ah
# sudo apt-get update >/dev/null
#fi
0