#!/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