#!/data/data/com.termux/files/usr/bin/bash #set -u -x -e INDIR="$HOME/.atilo" test ! -d $INDIR && mkdir $INDIR INED_LIST=(`ls ${INDIR}`) ARCH_LIST=('aarch64' 'armhf') LOCAL_ARCH=$(dpkg --print-architecture) LINUX_LIST=('alpine' 'aosc' 'arch' 'centos' 'debian' 'fedora' 'kali' 'opensuse' 'ubuntu' 'termux' 'parrot' 'backbox' 'void') tips() { printf " $@ \n";} warn() { printf "\033[1;33m $@ \033[0m\n";} error() { printf "[\033[1;31m $@ \033[0m]\n";} cutline(){ tips "******************************************";} ###### 显示说明 #apertis #alpine #ubuntu #debian #kali show_help(){ cutline tips "atilo 0.19.5 (Bash Script) by http://funs.ml" tips "用法: atilo [选项] [参数]" tips "" tips "apertis\t\t| 安装apertis" tips "fedora \t\t| 安装fedora" tips "debian \t\t| 安装debian" tips "alpine \t\t| 安装alpine" tips "aosc \t\t| 安装aosc" tips "arch \t\t| 安装archlinux" tips "kali \t\t| 安装kali" tips "void \t\t| 安装voidlinux" tips "parrot \t\t| 安装parrot" tips "backbox\t\t| 安装backbox" tips "ubuntu \t\t| 安装ubuntu" tips "centos \t\t| 安装centos" tips "opensuse \t\t| 安装opensuse" #tips "termux \t\t| 安装termux" tips "run \t\t| 运行一个linux" tips "rm \t\t| 删除安装的linux" cutline exit 0 } run_proot(){ cd $INDIR unset LD_PRELOAD #export PROOT_NO_SECCOMP=1 proot \ -l \ -0 \ -k \ "\\Linux\\${NAME}\\5.4-fake\#1\\${LOCAL_ARCH}\\localhost\\-1\\" \ -r ${NAME} \ -b /sdcard \ -b /dev \ -b /proc \ -b /sys \ -b /data/data/com.termux/files/home \ -w /root \ -b ${NAME}/tmp:/dev/shm \ -b ${NAME}/proc/.stat:/proc/stat \ -b ${NAME}/proc/.uptime:/proc/uptime \ /usr/bin/env -i \ HOME=/root \ PATH=/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/games \ TERM=${TERM} \ /bin/su -l exit } ########################################### ############## 删除linux ###############j rm_linux(){ set +e if echo "${LINUX_LIST[@]}" | grep -w "${1}" &>/dev/null; then chmod -R 0755 ${INDIR}/${1} > /dev/null 2>&1; rm -rf ${INDIR}/${1} ${PREFIX}/bin/start${1} > /dev/null 2>&1; tips "删除${1}成功"; exit 0; else warn "! 输入错误"; exit 1; fi } #################################### is_installed(){ if echo "${INED_LIST[@]}" | grep -wq "$1";then true else echo "未安装${1}" exit 1 fi } if [ $# = 0 ]; then show_help; fi sh=bash zip=pxvf get_arch(){ if [ $LOCAL_ARCH == "${ARCH_LIST[0]}" ]; then ARCH="arm64" elif [ ${LOCAL_ARCH} == "${ARCH_LIST[1]}" ]; then ARCH="armhf" else warn "! 未知架构 ${LOCAL_ARCH}\n只支持(aarch64,armhf)" fi } get_durl(){ url="https://api.funs.ml/rootfs/?url=${NAME}_${LOCAL_ARCH}.tgz" } ####################################### get_arch ###### linux列表 case "$1" in apertis) NAME=apertis; zip=pxJf; mirrors=0 mirrorshost=0 mirrorspath=0;; alpine) NAME=alpine; zip=pzxf; sh=ash; mirrors="mirrors.bfsu.edu.cn" mirrorshost="dl-cdn.alpinelinux.org" mirrorspath="etc/apk/repositories";; arch) NAME=arch; zip=pxzf; mirrors="mirrors.bfsu.edu.cn\/archlinuxarm" mirrorshost="mirror.archlinuxarm.org" mirrorspath="etc/pacman.d/mirrorlist" #attach="pacman-key --init;pacman-key --populate archlinuxarm;locale-gen" attach="echo hello";; centos) NAME=centos; zip=pxf; mirrors=0 #"mirrors.tuna.tsinghua.edu.cn\/centos" mirrorshost=0 #"mirrorlist.centos.org" mirrorspath=0 #"etc/yum.repos.d/CentOS-Base.repo" attach="echo ...";; ubuntu) NAME=ubuntu; zip=pxJf; mirrors="mirrors.bfsu.edu.cn" mirrorshost="ports.ubuntu.com" mirrorspath="etc/apt/sources.list" #attach="apt update;apt install -y perl apt-utils dialog locales";; attach="locale-gen zh_CN.UTF-8 && sed -i '/^LANG/c'LANG=zh_CN.UTF-8'' /etc/default/locale";; fedora) NAME=fedora; if [ ${LOCAL_ARCH} != "arm" ];then zip=pxf; fi mirrors=0; mirrorshost=0 attach="dnf update";; debian) NAME=debian; zip=pxf; mirrors="mirrors.bfsu.edu.cn" mirrorshost="deb.debian.org" mirrorspath="etc/apt/sources.list" attach="apt update;apt install -y perl apt-utils dialog locales";; aosc) NAME=aosc; zip=pxf; mirrors="mirrors.bfsu.edu.cn\/anthon" mirrorshost="repo.aosc.io" mirrorspath="etc/apt/sources.list" attach="apt-gen-list m tuna;apt update;ln -s /usr/bin/perl5.24.3 /usr/bin/perl;dpkg --configure -a";; backbox) NAME=backbox; zip=pxf mirrors="mirrors.bfsu.edu.cn" mirrorshost="ports.ubuntu.com" mirrorspath="etc/apt/sources.list" attach="apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 680E1A5A78A7ABE1;apt update;apt install -y apt-utils dialog";; parrot) NAME=parrot; zip=pxf; mirrors="mirrors.bfsu.edu.cn" mirrorshost="ba.mirror.garr.it\/mirrors" mirrorspath="etc/apt/sources.list" attach="apt update";; opensuse) NAME=opensuse; zip=pxf; mirrors=0 ##"mirrors.tuna.tsinghua.edu.cn\/opensuse" mirrorshost=0 ##"download.opensuse.org" mirrorspath=0 ##"etc/zypp/repos.d/repo-update.repo" attach="zypper up";; kali) NAME=kali; zip=pxf; mirrors="mirrors.bfsu.edu.cn" mirrorshost="http.kali.org" mirrorspath="etc/apt/sources.list" attach="locale-gen zh_CN.UTF-8 && apt update && apt install apt-utils -y";; void) NAME=void; zip=pxf; mirrors="mirrors.bfsu.edu.cn\/voidlinux" mirrorshost="alpha.de.repo.voidlinux.org" mirrorspath="usr/share/xbps.d/*-repository-*.conf" attach="echo ...";; # termux) NAME=termux; zip=pJx; # mirrors="deb http://mirrors.tuna.tsinghua.edu.cn/termux/ stable main" # mirrorshost=0 # mirrorspath="etc/apt/sources.list" # attach="pkg up";; rm) rm_linux $2;; run) is_installed $2;NAME=$2;run_proot;; *) warn "! 未知选项: '$1'";exit 1; esac ####################################### ############ 下载 ############## mkdir -p ${INDIR}/${NAME} cd ${INDIR}/${NAME} tips "" cutline get_durl if [ ! -f "${NAME}.tgz" ];then touch ${NAME}.tgz (curl -A funs -sfL ${url} -o ${NAME}.tgz) & all_size=$(curl ${url} -sfLI |grep -i "Content-Length:" |awk -F "[Cc]ontent-[Ll]ength: " '{print $2}'|dos2unix) if [ "$all_size" == '' ]; then tips "+ 下载错误 (请检查链接是否能正常访问)\n ${url}" rm -rf ${INDIR}/$1 cutline exit 1 fi while [[ $all_size != $dow_size ]] do dow_size=$(wc -c ${NAME}.tgz |awk -F ' ' '{print $1}') echo -en "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"' + 下载根目录文件 ... '`echo "scale=2;${dow_size} / (${all_size} / 100)"|bc`'%' done echo -ne '\n\n' wait else tips "+ 跳过文件下载 ..." tips "" fi ######################################### ############# 解压 ############## tips "+ 解压根目录文件 ..." tips "" if [ ${LOCAL_ARCH} == "arm" ];then if [ ${NAME} == "fedora" ];then tar xvf fedora.tgz --strip-components=1 --exclude json --exclude VERSION tar xpf layer.tar chmod +w . rm layer.tar rm fedora.tgz fi fi if [ ${NAME} == "termux" ];then unzip -q termux.tgz else set +e proot -0 -l tar ${zip} ${NAME}.tgz --exclude=dev if [ "$?" != "0" ]; then tips "+ 解压错误" exit 0 fi fi ########################################### ########### 设置 DNS ########## tips "+ 设置DNS服务器 ..." tips "" rm -r ${INDIR}/${NAME}/etc/resolv.conf 2>/dev/null echo -e "nameserver 119.29.29.29\nnameserver 8.8.8.8" > ${INDIR}/${NAME}/etc/resolv.conf #echo "export USER=root" >> ~/${cmd}/etc/profile #echo "export LC_ALL=zh_CN.utf8" >> ~/${cmd}/etc/profile #echo "zh_CN.UTF-8 UTF-8" >> ~/${cmd}/etc/locale.gen #echo "export DISPLAY=127.0.0.1:0" >> ~/${cmd}/etc/profile #echo "export PULSE_SERVER=tcp:127.0.0.1:4712" >> ~/${cmd}/etc/profile ######################################### proot -0 sed -i 's#root:.*#root:$6$9XNS6Hzz0bzrPIwm$whRSUOZ6o5dkSeORcBKup2YZUt7/Z4hhqDvJ6lG0o5ApmwfrP/3eObde6OLHfekjoheKWkVZ0ZNZ3H1.WcX/Z1:18549:0:99999:7:::#g' ${INDIR}/${NAME}/etc/shadow echo -e "pts/0\npts/1" >> ${INDIR}/${NAME}/etc/securetty 2>/dev/null chmod 700 ${INDIR}/${NAME}/proc/ proot -0 echo '843422.42 3355754.32' > ${INDIR}/${NAME}/proc/.uptime proot -0 cat <<- EOF > ${INDIR}/${NAME}/proc/.stat cpu 1050008 127632 898432 43828767 37203 63 99244 0 0 0 cpu0 212383 20476 204704 8389202 7253 42 12597 0 0 0 cpu1 224452 24947 215570 8372502 8135 4 42768 0 0 0 cpu2 222993 17440 200925 8424262 8069 9 17732 0 0 0 cpu3 186835 8775 195974 8486330 5746 3 8360 0 0 0 cpu4 107075 32886 48854 8688521 3995 4 5758 0 0 0 cpu5 90733 20914 27798 1429573 2984 1 11419 0 0 0 intr 53261351 0 686 1 0 0 1 12 31 1 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7818 0 0 0 0 0 0 0 0 255 33 1912 33 0 0 0 0 0 0 3449534 2315885 2150546 2399277 696281 339300 22642 19371 0 0 0 0 0 0 0 0 0 0 0 2199 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2445 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 162240 14293 2858 0 151709 151592 0 0 0 284534 0 0 0 0 0 0 0 0 0 0 0 0 0 0 185353 0 0 938962 0 0 0 0 736100 0 0 1 1209 27960 0 0 0 0 0 0 0 0 303 115968 452839 2 0 0 0 0 0 0 0 0 0 0 0 0 0 160361 8835 86413 1292 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3592 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6091 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35667 0 0 156823 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 2667417 0 41 4008 952 16633 533480 0 0 0 0 0 0 262506 0 0 0 0 0 0 126 0 0 1558488 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 8 0 0 6 0 0 0 10 3 4 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 1 1 83806 0 1 1 0 1 0 1 1 319686 2 8 0 0 0 0 0 0 0 0 0 244534 0 1 10 9 0 10 112 107 40 221 0 0 0 144 ctxt 90182396 btime 1595203295 processes 270853 procs_running 2 procs_blocked 0 softirq 25293348 2883 7658936 40779 539155 497187 2864 1908702 7229194 279723 7133925 EOF chmod +rw ${INDIR}/${NAME}/etc/passwd chmod +rw ${INDIR}/${NAME}/etc/shadow chmod +rw ${INDIR}/${NAME}/etc/group echo "aid_$(id -un):x:$(id -u):$(id -g):Android user:/:/usr/sbin/nologin" >> ${INDIR}/${NAME}/etc/passwd echo "aid_$(id -un):*:18446:0:99999:7:::" >> ${INDIR}/${NAME}/etc/shadow for g in $(id -G); do echo "aid_$(id -gn "$g"):x:${g}:root,aid_$(id -un)" >> ${INDIR}/${NAME}/etc/group if [ -f "${HOME}/${NAME}/etc/gshadow" ]; then chmod +rw ${INDIR}/${NAME}/etc/gshadow echo "aid_$(id -gn "$g"):*::root,aid_$(id -un)" >> ${INDIR}/${NAME}/etc/gshadow fi done ############# 修改源 ########## set -e ch_mirrors(){ # echo -e "$mirrors" > "$mirrorspath" sed -i "s/${mirrorshost}/${mirrors}/" $mirrorspath tips "+ 修改软件源 ... " } if [ "$mirrors" != "0" ]; then "ch_mirrors"; fi ################################ #tips "+ 修复系统 ... " #cutline #tips "" #start${cmd} ${attach} #> /dev/null 2>&1 tips "" ############ 全部完成 ################ tips "+ 安装完成" cutline tips "+ 启动${NAME}的命令\033[1;33m atilo run ${NAME}\033[0m" tips "+ 默认账号:root 密码:root" cutline tips "" #######################################