Files
kindle-calendar/scripts/connect-kindle-usbnet-mac.sh
2026-03-15 14:54:51 +08:00

129 lines
3.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
set -eu
# 这个脚本用于在 Mac 上给 Kindle 的 USBNetwork 网卡补一个 192.168.15.x 地址,
# 然后立刻验证 22 端口和 SSH 公钥登录是否可用。
#
# 默认值适配当前这台 Kindle
# - Kindle USB IP: 192.168.15.244
# - 本机别名 IP: 192.168.15.201
# - 默认网卡: en8
#
# 用法:
# sh scripts/connect-kindle-usbnet-mac.sh
# sh scripts/connect-kindle-usbnet-mac.sh auto 192.168.15.244 192.168.15.201
# sh scripts/connect-kindle-usbnet-mac.sh en8 192.168.15.244 192.168.15.201
#
# 参数说明:
# $1: Mac 上的 USB 网卡名,默认 auto自动尝试 en8/en11
# $2: Kindle 在 usbnet 模式下的 IP默认 192.168.15.244
# $3: Mac 要补的别名 IP默认 192.168.15.201
USB_IFACE="${1:-auto}"
KINDLE_IP="${2:-192.168.15.244}"
HOST_IP="${3:-192.168.15.201}"
KEY1="${HOME}/.ssh/id_ed25519"
KEY2="${HOME}/.ssh/id_ed25519_git"
pick_iface() {
if [ "${USB_IFACE}" != "auto" ]; then
echo "${USB_IFACE}"
return 0
fi
# 当前这台 Mac 在 Kindle 插入后会出现多个活动的 USB 相关接口,
# 实测常见候选是 en8 和 en11。这里按顺序轮询哪个能打通 22 端口就用哪个。
for iface in en8 en11; do
if ! ifconfig "${iface}" >/dev/null 2>&1; then
continue
fi
echo >&2
echo "== 尝试接口 ${iface} ==" >&2
sudo ifconfig "${iface}" inet "${HOST_IP}" netmask 255.255.255.0 alias >/dev/null 2>&1 || true
sudo arp -d "${KINDLE_IP}" >/dev/null 2>&1 || true
echo "当前网卡状态:" >&2
ifconfig "${iface}" >&2
echo >&2
echo "路由检查:" >&2
route -n get "${KINDLE_IP}" >&2 || true
echo >&2
echo "22 端口探测:" >&2
if nc -vz -G 5 "${KINDLE_IP}" 22; then
echo "${iface}"
return 0
fi
echo "接口 ${iface} 未打通,清理别名后继续尝试下一个。" >&2
sudo ifconfig "${iface}" -alias "${HOST_IP}" >/dev/null 2>&1 || true
done
return 1
}
echo "== 配置 USB 网卡 =="
echo "接口参数: ${USB_IFACE}"
echo "Kindle IP: ${KINDLE_IP}"
echo "本机别名 IP: ${HOST_IP}"
FOUND_IFACE="$(pick_iface)" || {
echo
echo "未能在候选 USB 网卡上打通 ${KINDLE_IP}:22。"
echo "通常说明 Kindle 端的 sshd/dropbear 没有在跑,或者 USBNetwork 链路本身还没真正连起来。"
exit 1
}
USB_IFACE="${FOUND_IFACE}"
echo
echo "== 选中的接口 =="
echo "${USB_IFACE}"
echo
echo "== 尝试使用第一把密钥登录 =="
if [ -f "${KEY1}" ]; then
if ssh -i "${KEY1}" \
-o BatchMode=yes \
-o IdentitiesOnly=yes \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/tmp/kindle_usbnet_known_hosts_1 \
root@"${KINDLE_IP}" true; then
echo "第一把密钥验证成功,进入交互登录。"
exec ssh -i "${KEY1}" \
-o IdentitiesOnly=yes \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/tmp/kindle_usbnet_known_hosts_1 \
root@"${KINDLE_IP}"
fi
else
echo "未找到密钥: ${KEY1}"
fi
echo
echo "== 尝试使用第二把密钥登录 =="
if [ -f "${KEY2}" ]; then
if ssh -i "${KEY2}" \
-o BatchMode=yes \
-o IdentitiesOnly=yes \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/tmp/kindle_usbnet_known_hosts_2 \
root@"${KINDLE_IP}" true; then
echo "第二把密钥验证成功,进入交互登录。"
exec ssh -i "${KEY2}" \
-o IdentitiesOnly=yes \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/tmp/kindle_usbnet_known_hosts_2 \
root@"${KINDLE_IP}"
fi
else
echo "未找到密钥: ${KEY2}"
fi
echo "两把密钥都未登录成功。"
exit 1