|
#!/usr/bin/env bash |
|
# ============================================================================= |
|
# ubuntu-reset.sh — Сброс Ubuntu до состояния "только что установлена" |
|
# |
|
# ВНИМАНИЕ: Этот скрипт НЕОБРАТИМО удаляет данные. Сделайте бэкап заранее. |
|
# |
|
# Запуск: |
|
# sudo bash ubuntu-reset.sh [ОПЦИИ] |
|
# |
|
# Опции: |
|
# --dry-run Показать что будет сделано, ничего не удалять |
|
# --yes Не спрашивать подтверждения |
|
# --user=USERNAME Указать пользователя (по умолчанию — вызвавший sudo) |
|
# --reset-home ПОЛНЫЙ сброс home: удалить ВСЁ включая документы, |
|
# загрузки и личные файлы, восстановить только /etc/skel |
|
# (без этого флага личные файлы сохраняются) |
|
# |
|
# Без --reset-home сохраняется: |
|
# ~/Documents, ~/Downloads, ~/Pictures, ~/Videos, ~/Music, ~/Desktop |
|
# (удаляются только конфиги, кэши, dotfiles) |
|
# |
|
# С --reset-home удаляется: |
|
# АБСОЛЮТНО ВСЁ в /home/<user>/, затем восстанавливается из /etc/skel |
|
# ============================================================================= |
|
|
|
set -euo pipefail |
|
|
|
# ─── Цвета ─────────────────────────────────────────────────────────────────── |
|
RED='\033[0;31m' |
|
YEL='\033[1;33m' |
|
GRN='\033[0;32m' |
|
BLU='\033[0;34m' |
|
NC='\033[0m' |
|
|
|
log() { echo -e "${BLU}[INFO]${NC} $*"; } |
|
warn() { echo -e "${YEL}[WARN]${NC} $*"; } |
|
ok() { echo -e "${GRN}[ OK ]${NC} $*"; } |
|
err() { echo -e "${RED}[ERR ]${NC} $*" >&2; } |
|
|
|
# ─── Параметры ─────────────────────────────────────────────────────────────── |
|
DRY_RUN=false |
|
AUTO_YES=false |
|
RESET_HOME=false |
|
TARGET_USER="${SUDO_USER:-$(logname 2>/dev/null || echo '')}" |
|
|
|
for arg in "$@"; do |
|
case "$arg" in |
|
--dry-run) DRY_RUN=true ;; |
|
--yes) AUTO_YES=true ;; |
|
--reset-home) RESET_HOME=true ;; |
|
--user=*) TARGET_USER="${arg#--user=}" ;; |
|
esac |
|
done |
|
|
|
# ─── Проверки ───────────────────────────────────────────────────────────────── |
|
if [[ $EUID -ne 0 ]]; then |
|
err "Скрипт должен запускаться через sudo: sudo bash $0" |
|
exit 1 |
|
fi |
|
|
|
if [[ -z "$TARGET_USER" ]]; then |
|
err "Не удалось определить целевого пользователя. Укажи --user=USERNAME" |
|
exit 1 |
|
fi |
|
|
|
if ! id "$TARGET_USER" &>/dev/null; then |
|
err "Пользователь '$TARGET_USER' не существует." |
|
exit 1 |
|
fi |
|
|
|
USER_HOME=$(getent passwd "$TARGET_USER" | cut -d: -f6) |
|
|
|
# ─── Режим dry-run ─────────────────────────────────────────────────────────── |
|
run() { |
|
if $DRY_RUN; then |
|
echo -e "${YEL}[DRY-RUN]${NC} $*" |
|
else |
|
eval "$@" |
|
fi |
|
} |
|
|
|
# ─── Подтверждение ─────────────────────────────────────────────────────────── |
|
echo "" |
|
echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}" |
|
echo -e "${RED}║ ⚠ ДЕСТРУКТИВНАЯ ОПЕРАЦИЯ ⚠ ║${NC}" |
|
echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" |
|
echo "" |
|
echo -e " Целевой пользователь : ${YEL}${TARGET_USER}${NC}" |
|
echo -e " Домашняя папка : ${YEL}${USER_HOME}${NC}" |
|
echo -e " Режим dry-run : ${YEL}${DRY_RUN}${NC}" |
|
echo -e " Полный сброс home : ${YEL}${RESET_HOME}${NC}" |
|
echo "" |
|
|
|
if $RESET_HOME; then |
|
echo -e "${RED} !! ФЛАГ --reset-home АКТИВЕН !!${NC}" |
|
echo -e "${RED} Будет удалено ВСЁ содержимое ${USER_HOME}/${NC}" |
|
echo -e "${RED} включая Documents, Downloads, Pictures и все личные файлы!${NC}" |
|
echo "" |
|
fi |
|
|
|
warn "Все вручную установленные пакеты, configs и пользовательский мусор будут удалены." |
|
warn "РЕКОМЕНДУЕТСЯ сделать бэкап перед запуском." |
|
echo "" |
|
|
|
if ! $AUTO_YES; then |
|
read -rp "Продолжить? Введи 'YES' для подтверждения: " CONFIRM |
|
if [[ "$CONFIRM" != "YES" ]]; then |
|
echo "Отменено." |
|
exit 0 |
|
fi |
|
fi |
|
|
|
# ============================================================================= |
|
# 1. ПАКЕТЫ APT — удаление вручную установленных |
|
# ============================================================================= |
|
log "=== [1/9] Обнаружение вручную установленных APT-пакетов ===" |
|
|
|
MANUALLY_INSTALLED=() |
|
|
|
INITIAL_PKGS_FILE="" |
|
if [[ -f /var/log/installer/initial-status.gz ]]; then |
|
INITIAL_PKGS_FILE=$(mktemp) |
|
gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u > "$INITIAL_PKGS_FILE" |
|
log "Использую /var/log/installer/initial-status.gz как эталон" |
|
fi |
|
|
|
MANUAL_PKG_FILE=$(mktemp) |
|
apt-mark showmanual | sort -u > "$MANUAL_PKG_FILE" |
|
|
|
if [[ -n "$INITIAL_PKGS_FILE" ]]; then |
|
comm -23 "$MANUAL_PKG_FILE" "$INITIAL_PKGS_FILE" > /tmp/pkgs_to_remove.txt || true |
|
[[ -s "$INITIAL_PKGS_FILE" ]] && rm -f "$INITIAL_PKGS_FILE" |
|
else |
|
warn "initial-status.gz не найден, используем aptitude fallback" |
|
if command -v aptitude &>/dev/null; then |
|
aptitude search '~i !~M' -F '%p' | sed 's/ *$//' | sort -u > /tmp/pkgs_to_remove.txt |
|
else |
|
cp "$MANUAL_PKG_FILE" /tmp/pkgs_to_remove.txt |
|
fi |
|
fi |
|
rm -f "$MANUAL_PKG_FILE" |
|
|
|
PKG_COUNT=$(wc -l < /tmp/pkgs_to_remove.txt) |
|
log "Найдено пакетов для удаления: ${PKG_COUNT}" |
|
|
|
if [[ $PKG_COUNT -gt 0 ]]; then |
|
log "Список сохранён в /tmp/pkgs_to_remove.txt" |
|
if ! $DRY_RUN; then |
|
cat /tmp/pkgs_to_remove.txt | xargs -r sudo apt-get purge -y --ignore-missing 2>/dev/null || true |
|
ok "APT-пакеты удалены" |
|
else |
|
warn "[DRY-RUN] Будет удалено: $(cat /tmp/pkgs_to_remove.txt | tr '\n' ' ')" |
|
fi |
|
fi |
|
|
|
run "apt-get autoremove --purge -y" |
|
run "apt-get clean" |
|
|
|
RC_PKGS=$(dpkg -l | awk '/^rc/{print $2}' | tr '\n' ' ') |
|
if [[ -n "$RC_PKGS" ]]; then |
|
log "Очистка конфиг-остатков (rc-статус): $RC_PKGS" |
|
run "dpkg --purge $RC_PKGS" |
|
fi |
|
|
|
if command -v deborphan &>/dev/null; then |
|
log "Запуск deborphan для удаления библиотек-сирот..." |
|
PASSES=0 |
|
while [[ -n "$(deborphan 2>/dev/null)" ]] && [[ $PASSES -lt 5 ]]; do |
|
run "deborphan | xargs apt-get -y remove --purge" |
|
PASSES=$((PASSES + 1)) |
|
done |
|
ok "deborphan завершён ($PASSES проходов)" |
|
else |
|
warn "deborphan не установлен, пропускаем (можно поставить: apt install deborphan)" |
|
fi |
|
|
|
# ============================================================================= |
|
# 2. SNAP — удаление всех snap кроме базовых |
|
# ============================================================================= |
|
log "=== [2/9] Snap пакеты ===" |
|
|
|
SNAP_KEEP=("core" "core18" "core20" "core22" "core24" "snapd" "bare") |
|
|
|
if command -v snap &>/dev/null; then |
|
SNAP_LIST=$(snap list 2>/dev/null | awk 'NR>1 {print $1}') |
|
for snap_pkg in $SNAP_LIST; do |
|
KEEP=false |
|
for keep in "${SNAP_KEEP[@]}"; do |
|
[[ "$snap_pkg" == "$keep" ]] && KEEP=true && break |
|
done |
|
if ! $KEEP; then |
|
log "Удаляю snap: $snap_pkg" |
|
run "snap remove --purge '$snap_pkg'" |
|
fi |
|
done |
|
ok "Snap-пакеты очищены" |
|
else |
|
warn "snap не установлен, пропускаем" |
|
fi |
|
|
|
# ============================================================================= |
|
# 3. FLATPAK — удаление всех пользовательских приложений |
|
# ============================================================================= |
|
log "=== [3/9] Flatpak пакеты ===" |
|
|
|
if command -v flatpak &>/dev/null; then |
|
FLATPAK_APPS=$(flatpak list --app --columns=application 2>/dev/null || true) |
|
if [[ -n "$FLATPAK_APPS" ]]; then |
|
run "flatpak uninstall --all -y" |
|
ok "Flatpak-приложения удалены" |
|
else |
|
log "Flatpak-приложений нет" |
|
fi |
|
else |
|
warn "flatpak не установлен, пропускаем" |
|
fi |
|
|
|
# ============================================================================= |
|
# 4. PYTHON — pip, pipx, virtualenvs |
|
# ============================================================================= |
|
log "=== [4/9] Python (pip/pipx/virtualenvs) ===" |
|
|
|
for pip_cmd in pip3 pip; do |
|
if sudo -u "$TARGET_USER" command -v $pip_cmd &>/dev/null 2>&1; then |
|
PIP_PKGS=$(sudo -u "$TARGET_USER" $pip_cmd list --user --format=freeze 2>/dev/null | cut -d= -f1 || true) |
|
if [[ -n "$PIP_PKGS" ]]; then |
|
log "Удаляю user pip-пакеты через $pip_cmd..." |
|
run "sudo -u '$TARGET_USER' $pip_cmd uninstall -y $PIP_PKGS 2>/dev/null || true" |
|
fi |
|
break |
|
fi |
|
done |
|
|
|
if sudo -u "$TARGET_USER" command -v pipx &>/dev/null 2>&1; then |
|
PIPX_PKGS=$(sudo -u "$TARGET_USER" pipx list --short 2>/dev/null | awk '{print $1}' || true) |
|
for pkg in $PIPX_PKGS; do |
|
run "sudo -u '$TARGET_USER' pipx uninstall '$pkg' 2>/dev/null || true" |
|
done |
|
fi |
|
|
|
for pydir in "$USER_HOME"/.local/lib/python*/site-packages; do |
|
[[ -d "$pydir" ]] && run "rm -rf '$pydir'" |
|
done |
|
for venv_dir in "$USER_HOME"/.venv "$USER_HOME"/venv "$USER_HOME"/.virtualenvs; do |
|
[[ -d "$venv_dir" ]] && run "rm -rf '$venv_dir'" |
|
done |
|
|
|
ok "Python окружение очищено" |
|
|
|
# ============================================================================= |
|
# 5. NODE.JS — npm global, nvm, volta, pnpm, yarn |
|
# ============================================================================= |
|
log "=== [5/9] Node.js (npm/nvm/volta/pnpm/yarn) ===" |
|
|
|
if command -v npm &>/dev/null; then |
|
NPM_GLOBALS=$(npm list -g --depth=0 --parseable 2>/dev/null | tail -n +2 | xargs -I{} basename {} || true) |
|
for pkg in $NPM_GLOBALS; do |
|
[[ "$pkg" == "npm" ]] && continue |
|
run "npm uninstall -g '$pkg' 2>/dev/null || true" |
|
done |
|
fi |
|
|
|
if sudo -u "$TARGET_USER" command -v npm &>/dev/null 2>&1; then |
|
NPM_USER_GLOBALS=$(sudo -u "$TARGET_USER" npm list -g --depth=0 --parseable 2>/dev/null | tail -n +2 | xargs -I{} basename {} || true) |
|
for pkg in $NPM_USER_GLOBALS; do |
|
[[ "$pkg" == "npm" ]] && continue |
|
run "sudo -u '$TARGET_USER' npm uninstall -g '$pkg' 2>/dev/null || true" |
|
done |
|
fi |
|
|
|
[[ -d "$USER_HOME/.nvm" ]] && run "rm -rf '$USER_HOME/.nvm'" |
|
[[ -d "$USER_HOME/.volta" ]] && run "rm -rf '$USER_HOME/.volta'" |
|
[[ -d "$USER_HOME/.local/share/pnpm" ]] && run "rm -rf '$USER_HOME/.local/share/pnpm'" |
|
[[ -d "$USER_HOME/.config/yarn" ]] && run "rm -rf '$USER_HOME/.config/yarn'" |
|
|
|
ok "Node.js окружение очищено" |
|
|
|
# ============================================================================= |
|
# 6. RUST (rustup, cargo) |
|
# ============================================================================= |
|
log "=== [6/9] Rust (rustup/cargo) ===" |
|
|
|
RUSTUP_HOME_DIR="${USER_HOME}/.rustup" |
|
CARGO_HOME_DIR="${USER_HOME}/.cargo" |
|
|
|
if [[ -f "$CARGO_HOME_DIR/bin/rustup" ]]; then |
|
log "Удаляю Rust через rustup self uninstall..." |
|
run "sudo -u '$TARGET_USER' RUSTUP_HOME='$RUSTUP_HOME_DIR' CARGO_HOME='$CARGO_HOME_DIR' '$CARGO_HOME_DIR/bin/rustup' self uninstall -y 2>/dev/null || true" |
|
fi |
|
|
|
[[ -d "$RUSTUP_HOME_DIR" ]] && run "rm -rf '$RUSTUP_HOME_DIR'" |
|
[[ -d "$CARGO_HOME_DIR" ]] && run "rm -rf '$CARGO_HOME_DIR'" |
|
|
|
ok "Rust удалён" |
|
|
|
# ============================================================================= |
|
# 7. GO — установки через go install |
|
# ============================================================================= |
|
log "=== [7/9] Go (~/go, /usr/local/go) ===" |
|
|
|
GO_USER_DIR="${USER_HOME}/go" |
|
GO_SYSTEM_DIR="/usr/local/go" |
|
|
|
[[ -d "$GO_USER_DIR" ]] && run "rm -rf '$GO_USER_DIR'" && ok "~/go удалён" |
|
[[ -d "$GO_SYSTEM_DIR" ]] && run "rm -rf '$GO_SYSTEM_DIR'" && ok "/usr/local/go удалён" |
|
|
|
if [[ -f "/usr/local/bin/go" ]] || [[ -L "/usr/local/bin/go" ]]; then |
|
run "rm -f /usr/local/bin/go /usr/local/bin/gofmt" |
|
fi |
|
|
|
# ============================================================================= |
|
# 8. /usr/local и /opt — нестандартные установки |
|
# ============================================================================= |
|
log "=== [8/9] /usr/local и /opt — ручные установки ===" |
|
|
|
USR_LOCAL_DIRS=(bin sbin lib lib64 include share man) |
|
for subdir in "${USR_LOCAL_DIRS[@]}"; do |
|
TARGET_DIR="/usr/local/$subdir" |
|
if [[ -d "$TARGET_DIR" ]]; then |
|
log "Очистка /usr/local/$subdir..." |
|
run "find '$TARGET_DIR' -mindepth 1 -delete 2>/dev/null || true" |
|
fi |
|
done |
|
|
|
for item in /usr/local/*; do |
|
basename_item=$(basename "$item") |
|
case "$basename_item" in |
|
bin|sbin|lib|lib64|include|share|man|src|games|etc) continue ;; |
|
*) |
|
log "Удаляю нестандартное: /usr/local/$basename_item" |
|
run "rm -rf '/usr/local/$basename_item'" |
|
;; |
|
esac |
|
done |
|
|
|
if [[ -d "/opt" ]]; then |
|
for item in /opt/*; do |
|
[[ -e "$item" ]] || continue |
|
log "Удаляю /opt/$(basename $item)..." |
|
run "rm -rf '$item'" |
|
done |
|
fi |
|
|
|
ok "/usr/local и /opt очищены" |
|
|
|
# ============================================================================= |
|
# 9. ДОМАШНЯЯ ПАПКА |
|
# ============================================================================= |
|
log "=== [9/9] Очистка домашней папки: $USER_HOME ===" |
|
|
|
if $RESET_HOME; then |
|
# ------------------------------------------------------------------------- |
|
# ПОЛНЫЙ СБРОС HOME: удалить абсолютно всё, восстановить из /etc/skel |
|
# ------------------------------------------------------------------------- |
|
log "Режим ПОЛНОГО сброса home (--reset-home)..." |
|
|
|
# Дополнительное подтверждение, если не передан --yes |
|
if ! $AUTO_YES && ! $DRY_RUN; then |
|
echo "" |
|
echo -e "${RED}ПОСЛЕДНЕЕ ПРЕДУПРЕЖДЕНИЕ!${NC}" |
|
echo -e "Будет уничтожено ВСЁ содержимое ${YEL}${USER_HOME}/${NC}" |
|
echo -e "включая документы, фото, загрузки и все личные файлы." |
|
read -rp "Подтверди полный сброс home. Введи 'RESET HOME' : " CONFIRM2 |
|
if [[ "$CONFIRM2" != "RESET HOME" ]]; then |
|
warn "Полный сброс home отменён. Переходим к мягкой очистке конфигов." |
|
RESET_HOME=false |
|
fi |
|
fi |
|
fi |
|
|
|
if $RESET_HOME; then |
|
if $DRY_RUN; then |
|
warn "[DRY-RUN] Будет выполнено: rm -rf ${USER_HOME}/{*,.[!.]*,..?*}" |
|
warn "[DRY-RUN] Будет выполнено: cp -rT /etc/skel '${USER_HOME}'" |
|
else |
|
log "Удаляем все файлы и папки в ${USER_HOME}/ ..." |
|
# Удаляем всё: видимые файлы/папки и скрытые (dotfiles) |
|
find "$USER_HOME" -mindepth 1 -maxdepth 1 -exec rm -rf {} + |
|
log "Восстанавливаем структуру из /etc/skel..." |
|
cp -rT /etc/skel "$USER_HOME" |
|
chown -R "${TARGET_USER}:${TARGET_USER}" "$USER_HOME" |
|
ok "Home полностью сброшен до состояния /etc/skel" |
|
fi |
|
else |
|
# ------------------------------------------------------------------------- |
|
# МЯГКАЯ ОЧИСТКА: удалить конфиги/кэши, сохранить личные файлы |
|
# ------------------------------------------------------------------------- |
|
log "Режим мягкой очистки (личные файлы сохраняются)..." |
|
|
|
# Конфигурационные каталоги |
|
CONFIG_DIRS=( |
|
".config" |
|
".local/share" |
|
".local/state" |
|
".cache" |
|
".var" |
|
) |
|
for dir in "${CONFIG_DIRS[@]}"; do |
|
FULL_PATH="$USER_HOME/$dir" |
|
if [[ -d "$FULL_PATH" ]]; then |
|
log "Очистка $FULL_PATH..." |
|
run "rm -rf '$FULL_PATH'" |
|
fi |
|
done |
|
|
|
# Восстановление базовых dotfiles из /etc/skel |
|
log "Восстановление базовых dotfiles из /etc/skel..." |
|
run "cp -rT /etc/skel '$USER_HOME'" |
|
run "chown -R '$TARGET_USER:$TARGET_USER' '$USER_HOME'" |
|
|
|
# Конкретные dotfiles |
|
DOTFILES_TO_REMOVE=( |
|
".bash_history" ".python_history" ".mysql_history" ".psql_history" |
|
".lesshst" ".wget-hsts" ".node_repl_history" ".rediscli_history" |
|
".dbshell" ".mongodbshell" ".gitconfig" ".gitcredentials" |
|
".ssh" ".gnupg" ".npmrc" ".yarnrc" ".yarnrc.yml" ".pnpmfile.cjs" |
|
".cargo" ".rustup" ".go" ".gradle" ".m2" ".ivy2" ".sbt" |
|
".stack" ".ghc" ".cabal" ".rbenv" ".rvm" ".gem" ".bundle" |
|
".nix-profile" ".nix-channels" ".nix-defexpr" |
|
".docker" ".kube" ".minikube" ".terraform.d" ".vagrant.d" ".ansible" |
|
".dbus" ".dconf" ".gconf" ".gnome2" ".kde" |
|
".mozilla" ".thunderbird" ".wine" |
|
".java" ".android" ".idea" ".vscode" ".vscode-server" ".cursor" ".continue" |
|
".zsh_history" ".oh-my-zsh" ".zsh" ".tmux" ".tmux.conf" |
|
".vim" ".vimrc" ".emacs" ".emacs.d" |
|
".composer" ".symfony" ".platformsh" ".heroku" |
|
".aws" ".azure" ".gcloud" |
|
) |
|
|
|
for dotfile in "${DOTFILES_TO_REMOVE[@]}"; do |
|
FULL_PATH="$USER_HOME/$dotfile" |
|
if [[ -e "$FULL_PATH" ]] || [[ -L "$FULL_PATH" ]]; then |
|
run "rm -rf '$FULL_PATH'" |
|
fi |
|
done |
|
|
|
ok "Конфиги домашней папки очищены (личные файлы сохранены)" |
|
fi |
|
|
|
# ─── Crontab ───────────────────────────────────────────────────────────────── |
|
log "Очистка crontab..." |
|
run "crontab -r 2>/dev/null || true" |
|
run "sudo -u '$TARGET_USER' crontab -r 2>/dev/null || true" |
|
|
|
# ─── Пользовательские systemd-юниты ───────────────────────────────────────── |
|
SYSTEMD_USER_DIR="$USER_HOME/.config/systemd/user" |
|
if [[ -d "$SYSTEMD_USER_DIR" ]]; then |
|
log "Удаление пользовательских systemd-юнитов..." |
|
run "rm -rf '$SYSTEMD_USER_DIR'" |
|
fi |
|
|
|
if ! $DRY_RUN; then |
|
warn "Проверь /etc/systemd/system/ вручную на предмет добавленных юнитов" |
|
fi |
|
|
|
# ─── Репозитории APT ───────────────────────────────────────────────────────── |
|
log "Сброс APT-репозиториев к дефолтным (удаление PPA)..." |
|
if ! $DRY_RUN; then |
|
find /etc/apt/sources.list.d/ \( -name "*.list" -o -name "*.sources" \) 2>/dev/null | \ |
|
grep -v "official-package-repositories" | xargs -r rm -f |
|
find /etc/apt/trusted.gpg.d/ \( -name "*.gpg" -o -name "*.asc" \) 2>/dev/null | \ |
|
grep -v "ubuntu-keyring" | xargs -r rm -f 2>/dev/null || true |
|
ok "PPA и сторонние репозитории удалены" |
|
else |
|
warn "[DRY-RUN] PPA в /etc/apt/sources.list.d/ будут удалены" |
|
fi |
|
|
|
# ─── Финальное обновление ───────────────────────────────────────────────────── |
|
log "Обновление apt-индексов..." |
|
run "apt-get update -qq" |
|
|
|
# ============================================================================= |
|
echo "" |
|
echo -e "${GRN}╔══════════════════════════════════════════════════════════════╗${NC}" |
|
echo -e "${GRN}║ ✓ СБРОС ЗАВЕРШЁН ║${NC}" |
|
echo -e "${GRN}╚══════════════════════════════════════════════════════════════╝${NC}" |
|
echo "" |
|
log "Сводка:" |
|
log " - Вручную установленные apt-пакеты: ${PKG_COUNT} удалено" |
|
log " - Snap, Flatpak, pip, npm, Rust, Go: очищены" |
|
log " - /usr/local/*, /opt/*: очищены" |
|
if $RESET_HOME; then |
|
log " - Домашняя папка ($USER_HOME): ПОЛНОСТЬЮ сброшена до /etc/skel" |
|
else |
|
log " - Домашняя папка ($USER_HOME): конфиги удалены, личные файлы сохранены" |
|
fi |
|
log " - Crontab и системные PPA: удалены" |
|
echo "" |
|
warn "Рекомендуется перезагрузить систему: sudo reboot" |
|
echo "" |