Add Joplin, old Mac, and Fedora WiFi runbooks; simplify JA3 Whisky scripts and hotspot recovery.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ahauimix
2026-06-19 22:26:33 +03:00
parent 1938b7c743
commit 4bc9629a09
381 changed files with 3442 additions and 773 deletions

View File

@@ -0,0 +1,41 @@
#!/usr/bin/env bash
# Mac: один раз скопировать SSH-ключ на Fedora (пароль из ~/.config/old_mac/fedora.env).
# bash docs/old_mac/scripts/bootstrap-ssh-fedora.sh
set -euo pipefail
ENV="${OLD_MAC_FEDORA_ENV:-$HOME/.config/old_mac/fedora.env}"
KEY="$HOME/.ssh/id_ed25519_fedora"
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
[ -f "$ENV" ] || die "нет $ENV — создайте с FEDORA_USER и FEDORA_PASSWORD"
# shellcheck disable=SC1090
source "$ENV"
[ -f "$KEY" ] || die "нет ключа — bash docs/old_mac/scripts/setup-remote-mac.sh $FEDORA_USER"
command -v sshpass >/dev/null 2>&1 || die "brew install hudochenkov/sshpass/sshpass"
bash "$(dirname "$0")/setup-remote-mac.sh" "$FEDORA_USER" >/dev/null
copy_to() {
local target="$1"
local label="$2"
printf 'Пробую %s (%s)…\n' "$label" "$target"
if sshpass -p "$FEDORA_PASSWORD" ssh-copy-id -i "$KEY" -o ConnectTimeout=5 \
-o StrictHostKeyChecking=accept-new \
"${FEDORA_USER}@${target}" 2>/dev/null; then
printf '[ok] ключ установлен через %s\n' "$label"
return 0
fi
return 1
}
printf '=== bootstrap SSH key → Fedora ===\n\n'
copy_to "$FEDORA_BT_IP" "BT PAN" || \
copy_to "$FEDORA_IP" "hotspot IP" || \
copy_to "$FEDORA_HOST" "mDNS" || \
die "не удалось подключиться — см. REMOTE_ACCESS.md (BT PAN или отключить AP isolation)"
printf '\nПроверка:\n'
bash "$(dirname "$0")/connect-fedora.sh" -- 'echo ok && hostname'

View File

@@ -0,0 +1,67 @@
#!/usr/bin/env bash
# Собрать архив для передачи на Fedora MacBook.
# bash docs/old_mac/scripts/build-delivery-archive.sh
set -euo pipefail
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
STAGE="${TMPDIR:-/tmp}/fedora-bcm4322-wifi-fix-$$"
ARCHIVE="$OLD_MAC/deliverable/fedora-bcm4322-wifi-fix.tar.gz"
PKG="fedora-bcm4322-wifi-fix"
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
[ -f "$OLD_MAC/bundle/bcm4322-offline-bundle/b43/ucode16_mimo.fw" ] \
|| die "нет firmware — сначала: bash $OLD_MAC/scripts/download-bcm4322-offline-bundle.sh"
cleanup() { rm -rf "$STAGE"; }
trap cleanup EXIT
rm -rf "$STAGE"
mkdir -p "$STAGE/$PKG/bundle"
cp -a "$OLD_MAC/bundle/bcm4322-offline-bundle" "$STAGE/$PKG/bundle/"
cp "$OLD_MAC/scripts/install-bcm4322-firmware-fedora.sh" "$STAGE/$PKG/"
cp "$OLD_MAC/scripts/prepare-receive-fedora.sh" "$STAGE/$PKG/"
cp "$OLD_MAC/RUNBOOK.md" "$STAGE/$PKG/"
cat >"$STAGE/$PKG/INSTALL.txt" <<'EOF'
Fedora 43 — BCM4322 Wi-Fi fix (offline)
========================================
1. Распаковать:
tar xzf fedora-bcm4322-wifi-fix.tar.gz
cd fedora-bcm4322-wifi-fix
2. Установить firmware (root):
sudo bash install-bcm4322-firmware-fedora.sh
3. Перезагрузить:
sudo reboot
4. Подключиться к Wi-Fi:
nmcli device wifi list
nmcli device wifi connect "SSID" password "пароль"
5. Проверка:
ls -la /lib/firmware/b43/ucode16_mimo.fw
sudo dmesg | grep -i b43
nmcli device
Подробности: RUNBOOK.md в этом архиве.
EOF
mkdir -p "$OLD_MAC/deliverable"
tar czf "$ARCHIVE" -C "$STAGE" "$PKG"
SHA="$(shasum -a 256 "$ARCHIVE" | awk '{print $1}')"
SIZE="$(stat -f%z "$ARCHIVE" 2>/dev/null || stat -c%s "$ARCHIVE")"
cat >"$OLD_MAC/deliverable/MANIFEST.txt" <<EOF
Package: fedora-bcm4322-wifi-fix.tar.gz
Built: $(date -u +%Y-%m-%dT%H:%M:%SZ)
Size: ${SIZE} bytes
SHA256: ${SHA}
Target: Fedora 43, MacBook Pro Intel, BCM4322 / b43
EOF
printf 'Архив: %s\n' "$ARCHIVE"
printf 'Размер: %s bytes\n' "$SIZE"
printf 'SHA256: %s\n' "$SHA"

View File

@@ -0,0 +1,54 @@
#!/usr/bin/env bash
# Собрать архив удалённого доступа для Fedora.
set -euo pipefail
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
STAGE="${TMPDIR:-/tmp}/fedora-remote-access-$$"
ARCHIVE="$OLD_MAC/deliverable/fedora-remote-access.tar.gz"
PKG="fedora-remote-access"
# Убедиться что есть pubkey
bash "$OLD_MAC/scripts/setup-remote-mac.sh" >/dev/null 2>&1 || true
cleanup() { rm -rf "$STAGE"; }
trap cleanup EXIT
rm -rf "$STAGE"
mkdir -p "$STAGE/$PKG"
cp "$OLD_MAC/scripts/setup-ssh-fedora.sh" "$STAGE/$PKG/"
cp "$OLD_MAC/scripts/setup-bt-pan-fedora.sh" "$STAGE/$PKG/"
cp "$OLD_MAC/REMOTE_ACCESS.md" "$STAGE/$PKG/"
[ -f "$OLD_MAC/deliverable/mac_pubkey.txt" ] && \
cp "$OLD_MAC/deliverable/mac_pubkey.txt" "$STAGE/$PKG/"
cat >"$STAGE/$PKG/INSTALL.txt" <<'EOF'
Fedora — удалённый SSH с Mac (хотспот / BT PAN)
================================================
1. Распаковать:
tar xzf fedora-remote-access.tar.gz
cd fedora-remote-access
2. SSH (один раз, root):
sudo bash setup-ssh-fedora.sh ВАШ_ЛОГИН
3a. Если Mac видит fedora.local и ping OK:
На Mac: bash connect-fedora.sh
3b. Если ping FAIL (изоляция хотспота):
sudo bash setup-bt-pan-fedora.sh
Mac: Bluetooth → fedora → Connect (Network)
Mac: bash setup-bt-pan-mac.sh
Mac: bash connect-fedora.sh
Подробно: REMOTE_ACCESS.md
EOF
mkdir -p "$OLD_MAC/deliverable"
tar czf "$ARCHIVE" -C "$STAGE" "$PKG"
SHA="$(shasum -a 256 "$ARCHIVE" | awk '{print $1}')"
printf 'Архив: %s\n' "$ARCHIVE"
printf 'SHA256: %s\n' "$SHA"
printf 'Отправка: bash %s/send-to-fedora-bluetooth.sh %s\n' "$OLD_MAC/scripts" "$ARCHIVE"

View File

@@ -0,0 +1,44 @@
#!/usr/bin/env bash
# Mac: подключиться к Fedora по SSH (LAN или BT PAN).
# bash docs/old_mac/scripts/connect-fedora.sh [ssh args...]
set -euo pipefail
ENV="${OLD_MAC_FEDORA_ENV:-$HOME/.config/old_mac/fedora.env}"
KEY="$HOME/.ssh/id_ed25519_fedora"
EXTRA_ARGS=("$@")
if [ -f "$ENV" ]; then
# shellcheck disable=SC1090
source "$ENV"
fi
FEDORA_USER="${FEDORA_USER:-p}"
try_host() {
local host="$1"
local label="$2"
if ssh -i "$KEY" -o ConnectTimeout=3 -o BatchMode=yes \
-o StrictHostKeyChecking=accept-new \
"$host" "echo ok" >/dev/null 2>&1; then
printf '[ok] SSH через %s (%s)\n' "$label" "$host"
exec ssh -i "$KEY" -o StrictHostKeyChecking=accept-new "$host" "${EXTRA_ARGS[@]}"
fi
return 1
}
[ -f "$KEY" ] || {
printf 'Нет ключа %s — сначала: bash docs/old_mac/scripts/setup-remote-mac.sh\n' "$KEY"
exit 1
}
printf 'Пробую подключение к Fedora (user %s)…\n' "$FEDORA_USER"
try_host "fedora-mbp" "ssh config / mDNS" || \
try_host "fedora-mbp-bt" "BT PAN" || \
try_host "${FEDORA_USER}@${FEDORA_HOST:-fedora.local}" "mDNS" || \
try_host "${FEDORA_USER}@${FEDORA_IP:-10.23.120.30}" "hotspot IP" || \
try_host "${FEDORA_USER}@${FEDORA_BT_IP:-172.20.99.1}" "BT Fedora IP" || {
printf '\nSSH недоступен (ключ не принят или нет сети).\n'
printf ' Парольный bootstrap: bash docs/old_mac/scripts/bootstrap-ssh-fedora.sh\n'
printf ' Диагностика: bash docs/old_mac/scripts/discover-fedora.sh\n'
exit 1
}

View File

@@ -0,0 +1,59 @@
#!/usr/bin/env bash
# Mac: RDP к Fedora (xrdp, порт 3389).
# bash docs/old_mac/scripts/connect-rdp-fedora.sh
set -euo pipefail
ENV="${OLD_MAC_FEDORA_ENV:-$HOME/.config/old_mac/fedora.env}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
if [ -f "$ENV" ]; then
# shellcheck disable=SC1090
source "$ENV"
fi
FEDORA_USER="${FEDORA_USER:-p}"
FEDORA_RDP_PORT="${FEDORA_RDP_PORT:-3389}"
# Порядок хостов: BT PAN → mDNS → hotspot IP
HOSTS=(
"${FEDORA_BT_IP:-172.20.99.1}"
"${FEDORA_HOST:-fedora.local}"
"${FEDORA_IP:-10.23.120.30}"
)
reachable() {
nc -z -G 2 -w 2 "$1" "$FEDORA_RDP_PORT" 2>/dev/null
}
TARGET=""
for h in "${HOSTS[@]}"; do
if reachable "$h"; then
TARGET="$h"
break
fi
done
if [ -z "$TARGET" ]; then
printf 'RDP %s недоступен на:\n' "$FEDORA_RDP_PORT"
for h in "${HOSTS[@]}"; do printf ' %s:%s\n' "$h" "$FEDORA_RDP_PORT"; done
printf '\nПричина: изоляция хотспота или нет BT PAN.\n'
printf ' bash %s/discover-fedora.sh\n' "$SCRIPT_DIR"
printf ' docs/old_mac/REMOTE_ACCESS.md\n'
exit 1
fi
printf 'RDP → %s:%s (user %s)\n' "$TARGET" "$FEDORA_RDP_PORT" "$FEDORA_USER"
if command -v xfreerdp >/dev/null 2>&1; then
exec xfreerdp "/v:${TARGET}:${FEDORA_RDP_PORT}" "/u:${FEDORA_USER}" +clipboard /dynamic-resolution
fi
if [ -d "/Applications/Microsoft Remote Desktop.app" ]; then
exec open -a "Microsoft Remote Desktop"
fi
printf 'Установите клиент:\n'
printf ' brew install freerdp\n'
printf ' или Microsoft Remote Desktop из App Store\n'
printf '\nВручную: %s:%s user %s\n' "$TARGET" "$FEDORA_RDP_PORT" "$FEDORA_USER"
exit 1

View File

@@ -0,0 +1,68 @@
#!/usr/bin/env bash
# Mac: найти Fedora в сети хотспота.
# bash docs/old_mac/scripts/discover-fedora.sh
set -euo pipefail
SUBNET=""
IFACE="en0"
wifi_ip() {
ifconfig "$IFACE" 2>/dev/null | awk '/inet / {print $2; exit}'
}
IP="$(wifi_ip || true)"
[ -n "$IP" ] || { printf 'Wi-Fi IP не найден на %s\n' "$IFACE"; exit 1; }
SUBNET="$(printf '%s\n' "$IP" | awk -F. '{print $1"."$2"."$3}')"
printf 'Mac Wi-Fi: %s (подсеть %s.0/24)\n\n' "$IP" "$SUBNET"
# mDNS
printf '%s\n' '--- mDNS ---'
for name in fedora.local fedora; do
FIP=""
if command -v dscacheutil >/dev/null 2>&1; then
FIP="$(dscacheutil -q host -a name "$name" 2>/dev/null | awk '/ip_address:/ {print $2; exit}')"
fi
[ -n "$FIP" ] || FIP="$(ping -c 1 -t 1 "$name" 2>/dev/null | sed -n 's/.*(\([0-9.]*\)).*/\1/p' | head -1)"
if [ -n "$FIP" ]; then
printf '%s → %s\n' "$name" "$FIP"
if ping -c 1 -W 1000 "$FIP" >/dev/null 2>&1; then
printf ' ping: ok\n'
else
printf ' ping: FAIL (вероятна изоляция клиентов хотспота)\n'
fi
if nc -z -w 2 "$FIP" 22 2>/dev/null; then
printf ' ssh:22: open\n'
else
printf ' ssh:22: closed/unreachable\n'
fi
if nc -z -w 2 "$FIP" 3389 2>/dev/null; then
printf ' rdp:3389: open\n'
else
printf ' rdp:3389: closed/unreachable\n'
fi
fi
done
printf '%s\n' '--- ARP ---'
arp -a 2>/dev/null | grep "$SUBNET" | grep -v 'incomplete' || true
printf '%s\n' '--- Быстрый sweep (ssh:22) ---'
FOUND=0
for i in $(seq 1 254); do
T="$SUBNET.$i"
[ "$T" = "$IP" ] && continue
nc -z -G 1 -w 1 "$T" 22 2>/dev/null && printf 'ssh open: %s\n' "$T" && FOUND=1
done
[ "$FOUND" -eq 0 ] && printf '(ни одного ssh:22 не найдено)\n'
printf '%s\n' '--- BT PAN fallback ---'
printf 'Проверка 172.20.99.1 (Fedora BT PAN)…\n'
if ping -c 1 -W 1000 172.20.99.1 >/dev/null 2>&1; then
printf ' ping 172.20.99.1: ok\n'
else
printf ' ping 172.20.99.1: нет (запустите setup-bt-pan-fedora.sh на Fedora)\n'
fi
printf '\nПодсказка: если ping FAIL но mDNS есть — отключите AP isolation на телефоне\n'
printf 'или используйте Bluetooth PAN: REMOTE_ACCESS.md §4\n'

View File

@@ -0,0 +1,54 @@
#!/usr/bin/env bash
# Скачать и собрать firmware b43 для BCM4322 (запуск на Mac с интернетом).
# bash docs/old_mac/scripts/download-bcm4322-offline-bundle.sh
set -euo pipefail
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
BUNDLE_DIR="$OLD_MAC/bundle/bcm4322-offline-bundle"
WORK="${TMPDIR:-/tmp}/bcm4322-build-$$"
WL_VERSION="6.30.163.46"
WL_TARBALL="broadcom-wl-${WL_VERSION}.tar.bz2"
WL_OBJECT="broadcom-wl-${WL_VERSION}.wl_apsta.o"
WL_URL="https://web.archive.org/web/2023/https://www.lwfinger.com/b43-firmware/${WL_TARBALL}"
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
command -v b43-fwcutter >/dev/null 2>&1 || die "brew install b43-fwcutter"
command -v curl >/dev/null 2>&1 || die "curl не найден"
cleanup() { rm -rf "$WORK"; }
trap cleanup EXIT
mkdir -p "$WORK" "$BUNDLE_DIR"
cd "$WORK"
if [ ! -s "$WL_TARBALL" ]; then
printf 'Скачиваю %s …\n' "$WL_URL"
curl -fsSL --max-time 180 -o "$WL_TARBALL" "$WL_URL"
fi
file "$WL_TARBALL" | grep -qi bzip2 || die "скачанный файл не bzip2"
tar xjf "$WL_TARBALL"
[ -f "$WL_OBJECT" ] || die "нет $WL_OBJECT в архиве"
rm -rf "$WORK/fw-out"
mkdir -p "$WORK/fw-out"
b43-fwcutter -w "$WORK/fw-out" "$WL_OBJECT"
[ -f "$WORK/fw-out/b43/ucode16_mimo.fw" ] || die "нет ucode16_mimo.fw"
rm -rf "$BUNDLE_DIR/b43"
cp -a "$WORK/fw-out/b43" "$BUNDLE_DIR/"
COUNT="$(find "$BUNDLE_DIR/b43" -type f | wc -l | tr -d ' ')"
SHA_UC="$(shasum -a 256 "$BUNDLE_DIR/b43/ucode16_mimo.fw" | awk '{print $1}')"
cat >"$BUNDLE_DIR/MANIFEST.txt" <<EOF
BCM4322 b43 firmware offline bundle
Built: $(date -u +%Y-%m-%dT%H:%M:%SZ)
Source: broadcom-wl-${WL_VERSION} via b43-fwcutter
Files: ${COUNT}
SHA256 b43/ucode16_mimo.fw: ${SHA_UC}
EOF
printf 'Firmware: %s файлов\n' "$COUNT"
bash "$(dirname "$0")/build-delivery-archive.sh"

View File

@@ -0,0 +1,63 @@
#!/usr/bin/env bash
# Установить firmware b43 для BCM4322 на Fedora (offline).
# Запуск на Fedora MacBook (root):
# tar xzf fedora-bcm4322-wifi-fix.tar.gz
# cd fedora-bcm4322-wifi-fix
# sudo bash install-bcm4322-firmware-fedora.sh
set -euo pipefail
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
if [ "$(id -u)" -ne 0 ]; then
die "запустите с sudo"
fi
ROOT="$(cd "$(dirname "$0")" && pwd)"
SRC="${1:-$ROOT/bundle/bcm4322-offline-bundle}"
[ -d "$SRC/b43" ] || die "нет каталога $SRC/b43"
[ -f "$SRC/b43/ucode16_mimo.fw" ] || die "нет $SRC/b43/ucode16_mimo.fw (BCM4322)"
DEST="/lib/firmware/b43"
BACKUP="/var/lib/bcm4322-firmware-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$DEST" "$BACKUP"
if [ -d "$DEST" ] && [ "$(ls -A "$DEST" 2>/dev/null | wc -l)" -gt 0 ]; then
cp -a "$DEST/." "$BACKUP/" 2>/dev/null || true
printf 'Резервная копия старых файлов: %s\n' "$BACKUP"
fi
cp -a "$SRC/b43/." "$DEST/"
chmod 644 "$DEST"/*.fw 2>/dev/null || true
restorecon -Rv /lib/firmware/b43 >/dev/null 2>&1 || true
COUNT="$(find "$DEST" -maxdepth 1 -name '*.fw' | wc -l | tr -d ' ')"
printf 'Установлено %s файлов в %s\n' "$COUNT" "$DEST"
printf 'Ключевой файл: %s (%s bytes)\n' "$DEST/ucode16_mimo.fw" "$(stat -c%s "$DEST/ucode16_mimo.fw" 2>/dev/null || stat -f%z "$DEST/ucode16_mimo.fw")"
printf 'Перезагрузка модуля b43 …\n'
modprobe -r b43 2>/dev/null || true
sleep 1
modprobe b43
sleep 2
if dmesg | tail -50 | grep -qi 'firmware file.*not found'; then
die "ядро всё ещё не видит firmware — проверьте: sudo dmesg | grep -i b43"
fi
if command -v nmcli >/dev/null 2>&1; then
nmcli device status || true
WIFI_DEV="$(nmcli -t -f DEVICE,TYPE device | awk -F: '$2=="wifi"{print $1; exit}')"
if [ -n "${WIFI_DEV:-}" ]; then
printf 'Wi-Fi интерфейс появился: %s\n' "$WIFI_DEV"
nmcli radio wifi on 2>/dev/null || true
nmcli device wifi list 2>/dev/null | head -10 || true
else
printf 'Wi-Fi интерфейс пока не виден — нужна перезагрузка.\n'
fi
fi
printf '\nГотово. Дальше:\n'
printf ' sudo reboot\n'
printf ' nmcli device wifi list\n'
printf ' nmcli device wifi connect "SSID" password "пароль"\n'

View File

@@ -0,0 +1,48 @@
#!/usr/bin/env bash
# Запустить НА FEDORA перед отправкой файла с Mac.
# bash prepare-receive-fedora.sh
set -euo pipefail
DEST="${1:-$HOME/Downloads}"
mkdir -p "$DEST"
printf '=== Приём файла по Bluetooth (Fedora) ===\n\n'
# obex user session (GNOME/KDE)
if systemctl --user list-unit-files 2>/dev/null | grep -q '^obex.service'; then
systemctl --user start obex 2>/dev/null && printf '[ok] obex.service запущен\n' || true
fi
# obexpushd — слушает входящие push (если установлен)
if command -v obexpushd >/dev/null 2>&1; then
printf '[ok] obexpushd → %s (Ctrl+C после приёма)\n' "$DEST"
exec obexpushd -B -n -p "$DEST"
fi
printf 'Автоматический приём недоступен без obexpushd.\n\n'
printf 'Сделайте вручную (обязательно ДО отправки с Mac):\n'
printf ' 1. Иконка Bluetooth (Blueman) в трее\n'
printf ' 2. «Принять файл» / «Receive a File»\n'
printf ' 3. Должен появиться диалог «Ожидание входящего файла…»\n\n'
printf 'Если Blueman нет:\n'
printf ' sudo dnf install blueman bluez-obexd\n'
printf ' blueman-applet &\n\n'
printf 'Затем на Mac:\n'
printf ' bash …/send-to-fedora-bluetooth.sh\n\n'
# Попытка открыть Blueman (GUI)
if command -v blueman-manager >/dev/null 2>&1; then
blueman-manager >/dev/null 2>&1 &
fi
printf 'Ожидание файла в: %s\n' "$DEST"
printf 'Нажмите Ctrl+C когда файл получен.\n'
# Держим скрипт живым, пока пользователь жмёт Receive в Blueman
while true; do
sleep 2
if ls "$DEST"/fedora-bcm4322-wifi-fix.tar.gz >/dev/null 2>&1; then
printf '\n[ok] Файл получен: %s/fedora-bcm4322-wifi-fix.tar.gz\n' "$DEST"
exit 0
fi
done

View File

@@ -0,0 +1,76 @@
#!/usr/bin/env bash
# Отправить файл на Fedora MacBook по Bluetooth (с этого Mac).
#
# Порядок:
# 1. FEDORA: Blueman → «Принять файл» (диалог «Ожидание…»)
# 2. MAC: bash send-to-fedora-bluetooth.sh [файл] [устройство]
# 3. MAC: Bluetooth File Exchange → fedora → Send
#
# Примеры:
# bash docs/old_mac/scripts/send-to-fedora-bluetooth.sh
# bash docs/old_mac/scripts/send-to-fedora-bluetooth.sh ~/Desktop/foo.tar.gz
# bash docs/old_mac/scripts/send-to-fedora-bluetooth.sh foo.tar.gz fedora
set -euo pipefail
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
DEFAULT_ARCHIVE="$OLD_MAC/deliverable/fedora-bcm4322-wifi-fix.tar.gz"
DEFAULT_DEVICE="fedora"
BFX="/System/Library/CoreServices/Bluetooth File Exchange.app"
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
usage() {
cat <<EOF
usage: $0 [файл] [устройство_bluetooth]
файл путь к отправляемому файлу (по умолчанию: delivery-архив Wi-Fi fix)
устройство имя BT-устройства Fedora (по умолчанию: fedora)
Перед запуском на Fedora: Blueman → «Принять файл».
См. docs/old_mac/BLUETOOTH_FILE_TRANSFER.md
EOF
}
FILE=""
DEVICE="$DEFAULT_DEVICE"
case $# in
0) FILE="$DEFAULT_ARCHIVE" ;;
1)
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then usage; exit 0; fi
if [ -f "$1" ]; then
FILE="$1"
else
FILE="$DEFAULT_ARCHIVE"
DEVICE="$1"
fi
;;
2)
[ -f "$1" ] || die "файл не найден: $1"
FILE="$1"
DEVICE="$2"
;;
*) usage; exit 1 ;;
esac
[ -f "$FILE" ] || die "файл не найден: $FILE"
[ -d "$BFX" ] || BFX="/System/Applications/Utilities/Bluetooth File Exchange.app"
[ -d "$BFX" ] || die "Bluetooth File Exchange не найден"
MAC_BT="$(system_profiler SPBluetoothDataType 2>/dev/null || true)"
if ! printf '%s\n' "$MAC_BT" | grep -A1 "Connected:" | grep -qi "$DEVICE"; then
die "«$DEVICE» не в Connected. На Fedora: Bluetooth on, Trust этого Mac."
fi
printf '\n=== Отправка по Bluetooth ===\n\n'
printf 'СНАЧАЛА на Fedora: Blueman → «Принять файл».\n'
printf 'Без этого диалог приёма НЕ появится.\n\n'
printf 'Файл : %s (%s bytes)\n' "$FILE" "$(stat -f%z "$FILE" 2>/dev/null || stat -c%s "$FILE")"
printf 'Куда : %s\n\n' "$DEVICE"
printf 'Открываю Bluetooth File Exchange → выберите «%s» → Send.\n\n' "$DEVICE"
killall "Bluetooth File Exchange" 2>/dev/null || true
sleep 0.5
open -a "Bluetooth File Exchange" "$FILE"
printf 'Готово. Подтвердите отправку в окне Bluetooth File Exchange.\n'

View File

@@ -0,0 +1,46 @@
#!/usr/bin/env bash
# Fedora: поднять Bluetooth PAN (NAP) для прямой сети Mac ↔ Fedora.
# Обходит изоляцию клиентов на хотспоте телефона.
# sudo bash setup-bt-pan-fedora.sh
set -euo pipefail
PAN_IF="${PAN_IF:-pan0}"
PAN_IP="${PAN_IP:-172.20.99.1}"
PAN_CIDR="${PAN_CIDR:-24}"
MAC_BT_IP="${MAC_BT_IP:-172.20.99.2}"
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
[ "$(id -u)" -eq 0 ] || die "sudo"
printf '=== Bluetooth PAN (Fedora = сервер) ===\n\n'
for pkg in bluez bluez-tools; do
rpm -q "$pkg" >/dev/null 2>&1 || dnf install -y "$pkg" || true
done
command -v bt-network >/dev/null 2>&1 || die "нет bt-network (dnf install bluez-tools)"
systemctl start bluetooth
sleep 1
# Остановить старый NAP
bt-network -d nap 2>/dev/null || true
pkill -f "bt-network -s nap" 2>/dev/null || true
sleep 1
printf 'Запуск NAP на %s (%s/%s)…\n' "$PAN_IF" "$PAN_IP" "$PAN_CIDR"
bt-network -s nap "$PAN_IF" &
sleep 2
ip link set "$PAN_IF" up 2>/dev/null || true
ip addr flush dev "$PAN_IF" 2>/dev/null || true
ip addr add "${PAN_IP}/${PAN_CIDR}" dev "$PAN_IF"
printf '\n[ok] PAN сервер на Fedora\n'
printf ' Интерфейс: %s = %s/%s\n' "$PAN_IF" "$PAN_IP" "$PAN_CIDR"
printf ' Mac после подключения PAN: назначьте %s/24 на bnep0\n' "$MAC_BT_IP"
printf ' (или Mac Internet Sharing — см. REMOTE_ACCESS.md)\n\n'
printf 'На Mac:\n'
printf ' 1. Bluetooth → fedora → Connect / «Сеть» / Network Access Point\n'
printf ' 2. bash docs/old_mac/scripts/setup-bt-pan-mac.sh\n'
printf ' 3. bash docs/old_mac/scripts/connect-fedora.sh\n'

View File

@@ -0,0 +1,39 @@
#!/usr/bin/env bash
# Mac: настроить IP на Bluetooth PAN к Fedora (после Connect к NAP).
# bash docs/old_mac/scripts/setup-bt-pan-mac.sh
set -euo pipefail
MAC_IP="${MAC_IP:-172.20.99.2}"
FEDORA_IP="${FEDORA_IP:-172.20.99.1}"
PREFIX=24
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
# Найти bnep/pan интерфейс
IFACE=""
for cand in bnep0 pan0 bridge100; do
if ifconfig "$cand" >/dev/null 2>&1; then
IFACE="$cand"
break
fi
done
if [ -z "$IFACE" ]; then
IFACE="$(ifconfig -l | tr ' ' '\n' | grep -E '^bnep|^pan' | head -1)"
fi
[ -n "$IFACE" ] || die "нет bnep/pan интерфейса — сначала на Fedora: sudo bash setup-bt-pan-fedora.sh, затем Mac Bluetooth → fedora → Connect (Network)"
printf 'Интерфейс: %s\n' "$IFACE"
sudo ifconfig "$IFACE" "$MAC_IP" netmask 255.255.255.0 up
sudo route add -host "$FEDORA_IP" -interface "$IFACE" 2>/dev/null || true
printf '\nПроверка ping %s …\n' "$FEDORA_IP"
if ping -c 2 -W 1000 "$FEDORA_IP"; then
printf '\n[ok] L2/L3 связь Mac ↔ Fedora по BT PAN\n'
printf 'SSH: bash docs/old_mac/scripts/connect-fedora.sh\n'
else
printf '\n[!] ping не прошёл — повторите Connect к fedora в Bluetooth\n'
exit 1
fi

View File

@@ -0,0 +1,69 @@
#!/usr/bin/env bash
# Mac: ключ SSH + ssh config для Fedora MacBook.
# bash docs/old_mac/scripts/setup-remote-mac.sh [fedora_user]
set -euo pipefail
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
FEDORA_USER="${1:-p}"
KEY="$HOME/.ssh/id_ed25519_fedora"
KEY_PUB="${KEY}.pub"
SSH_CONFIG="$HOME/.ssh/config"
DELIVERABLE="$OLD_MAC/deliverable"
PUBKEY_EXPORT="$DELIVERABLE/mac_pubkey.txt"
mkdir -p "$DELIVERABLE" "$HOME/.ssh"
chmod 700 "$HOME/.ssh"
if [ ! -f "$KEY" ]; then
ssh-keygen -t ed25519 -f "$KEY" -N "" -C "mac-fedora-remote-$(hostname -s)"
printf 'Создан ключ: %s\n' "$KEY"
fi
cp "$KEY_PUB" "$PUBKEY_EXPORT"
chmod 644 "$PUBKEY_EXPORT"
MARK_BEGIN="# --- old_mac fedora-mbp (local_machine) ---"
MARK_END="# --- end old_mac fedora-mbp ---"
BLOCK=$(cat <<EOF
$MARK_BEGIN
Host fedora-mbp old-mac-fedora fedora
User $FEDORA_USER
IdentityFile $KEY
IdentitiesOnly yes
StrictHostKeyChecking accept-new
# Hotspot LAN (mDNS)
HostName fedora.local
# BT PAN: Fedora = 172.20.99.1
# HostName 172.20.99.1
Host fedora-mbp-bt
HostName 172.20.99.1
User $FEDORA_USER
IdentityFile $KEY
IdentitiesOnly yes
StrictHostKeyChecking accept-new
$MARK_END
EOF
)
if [ -f "$SSH_CONFIG" ] && grep -q "$MARK_BEGIN" "$SSH_CONFIG"; then
awk -v b="$MARK_BEGIN" -v e="$MARK_END" '
$0==b {skip=1; next}
$0==e {skip=0; next}
!skip {print}
' "$SSH_CONFIG" >"$SSH_CONFIG.tmp"
mv "$SSH_CONFIG.tmp" "$SSH_CONFIG"
fi
printf '\n%s\n' "$BLOCK" >>"$SSH_CONFIG"
chmod 600 "$SSH_CONFIG"
printf '\n=== Mac готов ===\n'
printf 'Ключ: %s\n' "$KEY"
printf 'Публичный ключ (для Fedora): %s\n' "$PUBKEY_EXPORT"
printf 'SSH config: Host fedora-mbp | fedora-mbp-bt\n\n'
printf 'Дальше:\n'
printf ' 1. Пересобрать архив: bash %s/build-remote-access-archive.sh\n' "$(dirname "$0")"
printf ' 2. Отправить на Fedora по BT: bash %s/send-to-fedora-bluetooth.sh\n' "$(dirname "$0")"
printf ' 3. На Fedora: sudo bash setup-ssh-fedora.sh %s\n' "$FEDORA_USER"
printf ' 4. С Mac: bash %s/connect-fedora.sh\n' "$(dirname "$0")"

View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
# Fedora: включить SSH и подготовить удалённый доступ.
# sudo bash setup-ssh-fedora.sh [имя_пользователя]
set -euo pipefail
USER_NAME="${1:-${SUDO_USER:-$USER}}"
SSH_DIR="/home/$USER_NAME/.ssh"
AUTH_KEYS="$SSH_DIR/authorized_keys"
PUBKEY_FILE="$(dirname "$0")/mac_pubkey.txt"
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
[ "$(id -u)" -eq 0 ] || die "запустите с sudo"
id "$USER_NAME" >/dev/null 2>&1 || die "пользователь не найден: $USER_NAME"
printf '=== SSH remote access (Fedora) ===\n\n'
# openssh-server
if ! rpm -q openssh-server >/dev/null 2>&1; then
if command -v dnf >/dev/null 2>&1; then
dnf install -y openssh-server || die "dnf install openssh-server failed"
else
die "установите openssh-server вручную"
fi
fi
systemctl enable --now sshd
systemctl is-active sshd >/dev/null || die "sshd не запустился"
# firewall
if systemctl is-active firewalld >/dev/null 2>&1; then
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
printf '[ok] firewalld: ssh разрешён\n'
else
printf '[info] firewalld не активен — пропуск\n'
fi
# authorized_keys
install -d -m 700 -o "$USER_NAME" -g "$USER_NAME" "$SSH_DIR"
touch "$AUTH_KEYS"
chown "$USER_NAME:$USER_NAME" "$AUTH_KEYS"
chmod 600 "$AUTH_KEYS"
if [ -s "$PUBKEY_FILE" ]; then
if ! grep -qF "$(awk '{print $1,$2}' "$PUBKEY_FILE")" "$AUTH_KEYS" 2>/dev/null; then
cat "$PUBKEY_FILE" >>"$AUTH_KEYS"
printf '[ok] добавлен ключ из mac_pubkey.txt\n'
else
printf '[ok] ключ из mac_pubkey.txt уже есть\n'
fi
else
printf '[!] mac_pubkey.txt пуст — добавьте ключ Mac вручную:\n'
printf ' echo "ssh-ed25519 AAAA... mac-fedora" >> %s\n' "$AUTH_KEYS"
fi
# hostname для mDNS
if command -v hostnamectl >/dev/null 2>&1; then
hostnamectl set-hostname fedora 2>/dev/null || true
fi
printf '\n--- Сеть ---\n'
ip -4 -o addr show scope global 2>/dev/null | awk '{print $2, $4}' || true
printf 'hostname: %s\n' "$(hostname -f 2>/dev/null || hostname)"
printf '\n--- Готово ---\n'
printf 'С Mac: ssh %s@<IP>\n' "$USER_NAME"
printf 'mDNS: ssh %s@fedora.local\n' "$USER_NAME"
printf '\nЕсли с Mac не пингуется — изоляция хотспота или используйте BT PAN (см. REMOTE_ACCESS.md).\n'