129 lines
3.8 KiB
Bash
Executable File
129 lines
3.8 KiB
Bash
Executable File
#!/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
|