feat: update ghostty ssh term
This commit is contained in:
+64
-5
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# ICMP/TCP 扫描本网段或指定网段的在线主机与开放端口
|
||||
# ICMP/TCP 扫描本网段或指定网段的在线主机、主机名与开放端口
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
# shellcheck disable=SC1091
|
||||
@@ -10,7 +10,7 @@ usage() {
|
||||
用法: scan-ip [端口或网段参数...]
|
||||
|
||||
扫描局域网主机:
|
||||
无参数 ICMP 扫描本网段 .1-.254
|
||||
无参数 ICMP 扫描本网段 .1-.254,并尽力显示主机名
|
||||
10.0.0 扫描指定网段前缀
|
||||
22 扫描本网段 TCP 22 端口
|
||||
80,443,8080 扫描多个端口(任一开放即显示)
|
||||
@@ -20,6 +20,7 @@ usage() {
|
||||
-h, --help 显示此帮助
|
||||
|
||||
依赖: ping;端口模式需要 nc (netcat)。
|
||||
主机名: macOS 使用系统解析器;Linux 使用 NSS(getent),安装 avahi-utils 时也会查询 mDNS;均会回退反向 DNS。
|
||||
EOF
|
||||
}
|
||||
|
||||
@@ -95,14 +96,72 @@ else
|
||||
fi
|
||||
echo "------------------------------------------------------"
|
||||
|
||||
hostname_for_ip() {
|
||||
local ip="$1"
|
||||
local hostname=""
|
||||
|
||||
# macOS 的系统解析器包含本机 hosts、DNS 和可用的 Bonjour/mDNS 记录。
|
||||
if [ "$(uname -s)" = "Darwin" ] && command -v dscacheutil &>/dev/null; then
|
||||
hostname=$(dscacheutil -q host -a ip_address "$ip" 2>/dev/null \
|
||||
| awk -F': ' '/^name: / {print $2; exit}')
|
||||
fi
|
||||
|
||||
# Linux 的 NSS 配置可包含 /etc/hosts、DNS 与 mDNS(例如 libnss-mdns)。
|
||||
if [ -z "$hostname" ] && command -v getent &>/dev/null; then
|
||||
hostname=$(getent hosts "$ip" 2>/dev/null | awk 'NR == 1 {print $2}')
|
||||
fi
|
||||
|
||||
# 未配置 NSS mDNS 时,avahi-utils 仍可直接查询局域网的 .local 名称。
|
||||
if [ -z "$hostname" ] && command -v avahi-resolve-address &>/dev/null; then
|
||||
if command -v timeout &>/dev/null; then
|
||||
hostname=$(timeout 1 avahi-resolve-address -4 "$ip" 2>/dev/null \
|
||||
| awk -F '\t' 'NR == 1 {print $2}')
|
||||
else
|
||||
hostname=$(avahi-resolve-address -4 "$ip" 2>/dev/null \
|
||||
| awk -F '\t' 'NR == 1 {print $2}')
|
||||
fi
|
||||
fi
|
||||
|
||||
# 没有本地记录时再查询 PTR;限制超时,避免名称解析拖慢扫描。
|
||||
if [ -z "$hostname" ] && command -v dig &>/dev/null; then
|
||||
# macOS 的 dig 会在 DNS 超时时将 ";; connection timed out" 输出到 stdout。
|
||||
# PTR 记录只接受由主机名字符组成的一行,避免将诊断信息显示为主机名。
|
||||
hostname=$(dig +time=1 +tries=1 +short -x "$ip" 2>/dev/null \
|
||||
| awk '/^[[:alnum:]_][[:alnum:]_.-]*\.?$/ {print; exit}')
|
||||
fi
|
||||
|
||||
# PTR 记录通常以点结尾,显示时去掉以保持紧凑。
|
||||
printf '%s' "${hostname%.}"
|
||||
}
|
||||
|
||||
format_host() {
|
||||
local ip="$1"
|
||||
local hostname
|
||||
hostname=$(hostname_for_ip "$ip")
|
||||
|
||||
if [ -n "$hostname" ]; then
|
||||
printf '%s (%s)' "$ip" "$hostname"
|
||||
else
|
||||
printf '%s' "$ip"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ ${#PORTS[@]} -eq 0 ]; then
|
||||
if [ "$(uname -s)" = "Darwin" ]; then
|
||||
for i in $(seq 1 254); do
|
||||
ping -c 1 -W 1000 -S "$LOCAL_IP" "$PREFIX.$i" >/dev/null 2>&1 && echo "$PREFIX.$i 在线" &
|
||||
(
|
||||
ip="$PREFIX.$i"
|
||||
ping -c 1 -W 1000 -S "$LOCAL_IP" "$ip" >/dev/null 2>&1 \
|
||||
&& echo "$(format_host "$ip") 在线"
|
||||
) &
|
||||
done
|
||||
else
|
||||
for i in $(seq 1 254); do
|
||||
ping -c 1 -W 1 -I "$LOCAL_IP" "$PREFIX.$i" >/dev/null 2>&1 && echo "$PREFIX.$i 在线" &
|
||||
(
|
||||
ip="$PREFIX.$i"
|
||||
ping -c 1 -W 1 -I "$LOCAL_IP" "$ip" >/dev/null 2>&1 \
|
||||
&& echo "$(format_host "$ip") 在线"
|
||||
) &
|
||||
done
|
||||
fi
|
||||
wait
|
||||
@@ -130,7 +189,7 @@ check_host() {
|
||||
fi
|
||||
done
|
||||
if [ ${#hit[@]} -gt 0 ]; then
|
||||
echo "$ip 开放: ${hit[*]}"
|
||||
echo "$(format_host "$ip") 开放: ${hit[*]}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user