REAL_USER="{SUDO_USER:-USER}"
if [ "REAL_USER" = "root" ] || [ -z "REAL_USER" ]; then
REAL_HOME="/root"
else
REAL_HOME=(getent passwd "REAL_USER" 2>/dev/null | cut -d: -f6)
if [ -z "REAL_HOME" ] || [ ! -d "REAL_HOME" ]; then
REAL_HOME="/home/$REAL_USER"
fi
fi
==================== 工具函数 ====================
check_root() {
if [ "$EUID" -ne 0 ]; then
echo "❌ 需要 root 权限来执行 chroot 或读取系统文件"
echo "正在尝试通过 sudo 重新运行..."
使用 exec 替换当前进程,避免双重退出
exec sudo -- "$0" "$@"
如果上面失败(比如用户取消密码输入),脚本会在此处终止
echo "sudo 执行失败,退出。"
exit 1
fi
}
detect_environment() {
if grep -q -E "live|casper|boot=casper" /proc/cmdline 2>/dev/null; then
IS_LIVECD=true
echo "✅ 检测到正在 Live CD 环境中运行"
else
IS_LIVECD=false
echo "✅ 正在原系统中运行"
fi
}
自动探测桌面目录(基于真实用户)
detect_desktop_dir() {
if [ -d "$REAL_HOME/Desktop" ]; then
DESKTOP_DIR="$REAL_HOME/Desktop"
elif [ -d "$REAL_HOME/桌面" ]; then
DESKTOP_DIR="$REAL_HOME/桌面"
else
DESKTOP_DIR="$REAL_HOME"
echo "⚠️ 未找到 Desktop 或 桌面 目录,输出将保存到 $DESKTOP_DIR"
fi
}
setup_paths() {
if [ "$IS_LIVECD" = true ]; then
MOUNTED_SYSTEM_ROOT=""
echo "🔍 正在自动探测原系统根目录..."
# 候选路径:覆盖常见国产系统挂载风格
for candidate in /media/*/* /media/uos/* /mnt; do
# 跳过无效或非目录项
[ -d "$candidate" ] || continue
# 排除 Live 系统自身 overlay(防止误判)
case "$candidate" in
*/run/live/overlay|*/usr/lib/live/mount/*|*/tmp/*|*/dev/*|*/proc/*|*/sys/*)
continue
;;
esac
# 检查是否包含典型 Linux 根目录特征文件
if [ -f "$candidate/etc/passwd" ] && [ -f "$candidate/etc/os-release" ]; then
MOUNTED_SYSTEM_ROOT="$candidate"
echo "✅ 自动检测到原系统根目录: $MOUNTED_SYSTEM_ROOT"
break
fi
done
if [ -z "$MOUNTED_SYSTEM_ROOT" ] || [ ! -d "$MOUNTED_SYSTEM_ROOT/etc" ]; then
echo "❌ 未找到有效的原系统根目录(请确认硬盘已挂载且包含 Linux 系统)"
echo " 尝试检查:ls /media/"
exit 1
fi
CURRENT_ROOT="$MOUNTED_SYSTEM_ROOT"
echo "📁 原系统挂载路径: $CURRENT_ROOT"
else
CURRENT_ROOT="/"
fi
NM_CONNECTIONS_DIR="$CURRENT_ROOT/etc/NetworkManager/system-connections"
SAMBA_USERSHARES_DIR="$CURRENT_ROOT/var/lib/samba/usershares"
SAMBA_CONF_FILE="$CURRENT_ROOT/etc/samba/smb.conf"
detect_desktop_dir
OUTPUT_FILE="$DESKTOP_DIR/本机信息.txt"
echo "📄 输出文件: $OUTPUT_FILE"
}
确保 OUTPUT_FILE 路径有效且可写
ensure_output_file_ready() {
if [ -z "$OUTPUT_FILE" ]; then
echo "❌ 错误:OUTPUT_FILE 未设置!"
exit 1
fi
local output_dir
output_dir="$(dirname "$OUTPUT_FILE")"
if ! mkdir -p "$output_dir" 2>/dev/null; then
echo "❌ 无法创建输出目录: $output_dir"
exit 1
fi
if ! touch "$OUTPUT_FILE" 2>/dev/null || ! [ -w "$OUTPUT_FILE" ]; then
echo "❌ 无法写入输出文件: $OUTPUT_FILE(请检查权限或磁盘空间)"
exit 1
else
# 清空文件内容
> "$OUTPUT_FILE"
fi
}
log() {
if [ "$IS_CHROOTED" = "true" ]; then
cat
else
tee -a "$OUTPUT_FILE"
fi
}
get_actual_mac_by_interface() {
local iface="$1"
if [ -z "$iface" ]; then
echo "N/A"
return 0
fi
local addr_file="/sys/class/net/$iface/address"
if [ ! -f "$addr_file" ]; then
echo "接口不存在"
return 0
fi
安全读取 MAC,转小写,清理空白字符
local mac
mac=(cat "addr_file" 2>/dev/null) || mac=""
if [ -n "$mac" ]; then
echo "$mac" | tr '[:upper:]' '[:lower:]' | tr -d '\r\n\t '
else
echo "无法读取"
fi
}
if [ ! -d "$NM_CONNECTIONS_DIR" ]; then
echo "未找到 NetworkManager 连接配置目录: $NM_CONNECTIONS_DIR" | log
return
fi
# 启用 nullglob 避免空匹配问题
local old_nullglob=$(shopt -p nullglob)
shopt -s nullglob
local connections=("$NM_CONNECTIONS_DIR"/*.nmconnection)
if [ ${#connections[@]} -eq 0 ] || [ ! -e "${connections[0]}" ]; then
echo "未找到任何 NetworkManager 连接配置文件" | log
else
for conn in "${connections[@]}"; do
parse_nm_connection "$conn"
done
fi
# 恢复 nullglob 原始状态
eval "$old_nullglob" 2>/dev/null || shopt -u nullglob
}
get_share_info() {
echo "=== 当前系统所有共享文件夹 ===" | log
local shares_found=0
if [ -d "$SAMBA_USERSHARES_DIR" ]; then
for share_file in "$SAMBA_USERSHARES_DIR"/*; do
if [ -f "$share_file" ]; then
local sharename=""
local path=""
while IFS='=' read -r key value; do
case "$key" in
sharename) sharename="$value" ;;
path) path="$value" ;;
esac
done < "$share_file"
if [ -n "$sharename" ] && [ -n "$path" ]; then
echo "【手动临时共享】$sharename -> $path" | log
shares_found=1
fi
fi
done
fi
if [ -f "$SAMBA_CONF_FILE" ]; then
local section=""
local in_global=0
while IFS= read -r line || [ -n "$line" ]; do
line=$(echo "$line" | sed 's/[[:space:]]*;.*$//' | sed 's/[[:space:]]*#.*$//')
line=$(echo "$line" | xargs)
[ -z "$line" ] && continue
if [[ "$line" == \[*\] ]]; then
section="${line#[}"
section="${section%]}"
section=$(echo "$section" | xargs)
case "$section" in
global|printers|'print$') in_global=1 ;;
*) in_global=0 ;;
esac
continue
fi
if [ "$in_global" -eq 0 ] && [ -n "$section" ]; then
if [[ "$line" == path[[:space:]]*=* ]]; then
local p=$(echo "$line" | cut -d'=' -f2- | xargs)
if [ -n "$p" ]; then
echo "【Samba配置共享】$section -> $p" | log
shares_found=1
fi
fi
fi
done < "$SAMBA_CONF_FILE"
fi
if [ "$shares_found" -eq 0 ]; then
echo "未找到任何共享文件夹" | log
fi
}
get_printer_info() {
echo "已安装打印机:" | log
local printers_conf="$CURRENT_ROOT/etc/cups/printers.conf"
if [ -f "$printers_conf" ]; then
echo "解析CUPS打印机配置:" | log
awk '
/^<[Pp]rinter|^<[Dd]efaultPrinter/ {
line = $0
gsub(/^[<[:space:]]/, "", line)
gsub(/>.$/, "", line)
n = split(line, a, /[[:space:]]+/)
name = (n >= 2) ? a[2] : "unknown"
is_def = (/^<[Dd]efaultPrinter/)
next
}
/^[[:space:]]*DeviceURI[[:space:]]+/ {
sub(/^[[:space:]]*DeviceURI[[:space:]]+/, "")
if (is_def) {
def_name = name; def_uri = $0
} else {
names[++cnt] = name; uris[cnt] = $0
}
}
/^[[:space:]]*Info[[:space:]]+/ {
sub(/^[[:space:]]*Info[[:space:]]+/, "")
if (is_def) {
def_info = $0
} else {
infos[name] = $0
}
}
/^[[:space:]]*State[[:space:]]+/ {
sub(/^[[:space:]]*State[[:space:]]+/, "")
if (is_def) {
def_state = $0
} else {
states[name] = $0
}
}
END {
if (def_name) {
print "默认打印机:"
print " 名称:" def_name
print " 驱动地址:" def_uri
if (def_info) print " 描述:" def_info
if (def_state) print " 状态:" def_state
print ""
}
for (i = 1; i <= cnt; i++) {
print "打印机" i ":"
print " 名称:" names[i]
print " 驱动地址:" uris[i]
if (infos[names[i]]) print " 描述:" infos[names[i]]
if (states[names[i]]) print " 状态:" states[names[i]]
print ""
}
if (!def_name && cnt == 0) {
print "未配置打印机"
}
}' "$printers_conf" | log
else
echo "CUPS打印机配置文件不存在: $printers_conf" | log
fi
}
collect_home_and_usr_info() {
separator
echo "用户数据目录 Home 目录内容:" | log
# 候选 home 路径列表
local home_candidates=(
"$CURRENT_ROOT/home"
"/media/uos/DATA/home"
"/media/uos/data/home"
"/media/uos/_dde_data/home"
"/media/*/*/home"
)
local found_home=""
for candidate in "${home_candidates[@]}"; do
if [[ "$candidate" == */\** ]]; then
shopt -s nullglob
for expanded in $candidate; do
if [ -d "$expanded" ] && [ -n "$(ls -A "$expanded" 2>/dev/null)" ]; then
found_home="$expanded"
break 2
fi
done
shopt -u nullglob
else
if [ -d "$candidate" ] && [ -n "$(ls -A "$candidate" 2>/dev/null)" ]; then
found_home="$candidate"
break
fi
fi
done
if [ -n "$found_home" ]; then
echo "(Home 路径: $found_home)" | log
(
cd "$found_home" || exit 1
for user_dir in *; do
if [ -d "$user_dir" ]; then
# 获取权限(stat 或 ls)
if command -v stat >/dev/null 2>&1; then
perms=$(stat -c "%A" "$user_dir" 2>/dev/null)
else
perms=$(ls -ld "$user_dir" 2>/dev/null | awk '{print $1}')
fi
# 获取磁盘用量(du -sh)
if command -v du >/dev/null 2>&1; then
size=$(du -sh "$user_dir" 2>/dev/null | cut -f1)
else
size="N/A"
fi
printf " %-12s %-6s %s\n" "$perms" "$size" "$user_dir"
fi
done
) | log
else
echo "(未找到有效的非空 Home 目录)" | log
for cand in "$CURRENT_ROOT/home" "/media/uos/DATA/home" "/media/uos/data/home" "/media/uos/_dde_data/home"; do
if [ -d "$cand" ]; then
echo " 检查路径: $cand (存在但为空或不可读)" | log
fi
done
fi
echo | log
echo "/usr 目录权限:" | log
ls -ld "$CURRENT_ROOT/usr" 2>/dev/null | log
local os_release="$CURRENT_ROOT/etc/os-release"
local is_uos=false
if [ -f "$os_release" ]; then
if grep -qiE 'UnionTech|uos' "$os_release"; then
is_uos=true
fi
fi
# 如果不是 UOS,直接跳过
if [ "$is_uos" = false ]; then
echo "跳过:当前系统(或原系统)不是统信 UOS,不收集激活信息。" | log
return 0
fi
separator
echo "统信 UOS 激活与授权信息(静态读取):" | log
local uos_license_dir="$CURRENT_ROOT/etc/uos-license"
local device_id_file="$uos_license_dir/device_id"
local license_file="$uos_license_dir/license.dat"
local serial_files=("$CURRENT_ROOT/etc/.uos_serial" "$CURRENT_ROOT/etc/uos_serial")
# --- 设备 ID ---
if [ -s "$device_id_file" ]; then
local device_id=$(cat "$device_id_file" 2>/dev/null | tr -d '\n\r')
echo "UOS 设备ID:$device_id" | log
else
echo "UOS 设备ID:未找到 $device_id_file" | log
fi
# --- 客户服务号(序列号)---
local found_serial=false
for sf in "${serial_files[@]}"; do
if [ -s "$sf" ]; then
local serial=$(cat "$sf" 2>/dev/null | tr -d '\n\r')
if [ -n "$serial" ]; then
echo "UOS 客户服务号(序列号):$serial" | log
found_serial=true
break
fi
fi
done
if [ "$found_serial" = false ]; then
# 尝试从 license.dat 中提取(部分版本会嵌入)
if [ -s "$license_file" ]; then
local extracted_serial=$(sudo strings "$license_file" 2>/dev/null | grep -Eo 'UOS[0-9]{8,}|[0-9]{10,}' | head -n1)
if [ -n "$extracted_serial" ]; then
echo "UOS 客户服务号(序列号):$extracted_serial(从 license.dat 提取)" | log
found_serial=true
fi
fi
if [ "$found_serial" = false ]; then
echo "UOS 客户服务号(序列号):未找到标准序列号文件" | log
fi
fi
# --- 授权状态与有效期(尝试解析 license.dat)---
if [ -s "$license_file" ]; then
# 尝试提取明文字段
local status_info=$(sudo strings "$license_file" 2>/dev/null | grep -iE 'activated|expired|valid|organization|term' || true)
if [ -n "$status_info" ]; then
echo "UOS 授权信息(从 license.dat 提取):" | log
echo "$status_info" | sed 's/^/ /' | log
else
echo "UOS 授权信息:license.dat 存在但无法提取明文信息(可能为加密二进制)" | log
fi
else
echo "UOS 授权信息:未找到 /etc/uos-license/license.dat" | log
fi
# --- 备份 uos-license 目录 ---
echo "" | log
echo "正在备份 UOS 授权目录..." | log
if [ -d "$uos_license_dir" ]; then
local zip_output="$DESKTOP_DIR/UOS系统授权文件备份.zip"
if command -v zip >/dev/null 2>&1; then
# 使用 sudo 确保能读取受保护文件
if sudo zip -r "$zip_output" "$uos_license_dir" >/dev/null 2>&1; then
sudo chown "$REAL_USER":"$(id -gn "$REAL_USER")" "$zip_output" 2>/dev/null || true
echo "✅ UOS 授权目录已备份至:$zip_output" | log
else
echo "❌ ZIP 压缩失败(权限或磁盘问题)" | log
fi
else
echo "⚠️ zip 命令未安装,跳过压缩备份" | log
fi
else
echo "⚠️ 未找到 UOS 授权目录:$uos_license_dir" | log
fi
local os_release="$CURRENT_ROOT/etc/os-release"
local is_fangde=false
if [ -f "$os_release" ]; then
# 检查 ID 是否为 nfsdesktop(V5.0 典型值)
if grep -q '^ID=nfsdesktop' "$os_release"; then
is_fangde=true
# 或检查 NAME / NAME_EN / HOME_URL 是否包含 FangDe、NFSChina 等关键词
elif grep -qiE 'FangDe|方德|NFSChina|nfschina\.com' "$os_release"; then
is_fangde=true
fi
fi
# 如果不是方德系统,直接跳过
if [ "$is_fangde" = false ]; then
echo "跳过:当前系统(或原系统)不是中科方德(FangDe/NFSChina),不收集激活信息。" | log
return 0
fi
separator
echo "中科方德(FangDe / NFSChina)系统激活与授权信息(静态读取):" | log
# 常见授权文件路径(按优先级)
local candidate_files=(
"$CURRENT_ROOT/etc/.fdinfo"
"$CURRENT_ROOT/etc/fdinfo"
"$CURRENT_ROOT/etc/.fdlicense"
"$CURRENT_ROOT/etc/fdlicense.dat"
"$CURRENT_ROOT/etc/.nfslicense"
"$CURRENT_ROOT/etc/nfslicense.dat"
"$CURRENT_ROOT/var/lib/fd-license/license.dat"
"$CURRENT_ROOT/etc/nfs-info"
"$CURRENT_ROOT/etc/.kyinfo" # 部分早期版本复用 Kylin 文件
"$CURRENT_ROOT/etc/LICENSE" # 通用 LICENSE 文件
)
local found_any=false
# 尝试读取每个候选文件
for file in "${candidate_files[@]}"; do
if [ -s "$file" ]; then
echo "发现授权文件:$file" | log
# 提取可读字符串(避免二进制乱码)
local content
content=$(sudo strings "$file" 2>/dev/null | head -n 30)
if [ -n "$content" ]; then
echo "文件内容(前30行可读字符串):" | log
echo "$content" | sed 's/^/ /' | log
else
echo " (文件存在但无可读内容)" | log
fi
found_any=true
fi
done
if [ "$found_any" = false ]; then
echo "⚠️ 未找到任何已知的方德授权文件(.fdinfo, .nfslicense, etc.)" | log
fi
# --- 尝试提取序列号(客户服务号)---
local serial_candidates=()
for file in "${candidate_files[@]}"; do
if [ -f "$file" ]; then
# 匹配典型序列号:16~32位字母数字(大写为主)
local sn=$(sudo strings "$file" 2>/dev/null | grep -Eo '[A-Z0-9]{16,32}' | head -n1)
if [ -n "$sn" ]; then
serial_candidates+=("$sn")
fi
fi
done
if [ ${#serial_candidates[@]} -gt 0 ]; then
echo "可能的方德序列号(客户服务号):" | log
for sn in "${serial_candidates[@]:0:3}"; do
echo " $sn" | log
done
else
echo "方德序列号:未从授权文件中识别出有效序列号" | log
fi
# --- 备份所有可能的授权文件 ---
echo "" | log
echo "正在备份方德授权相关文件..." | log
local files_to_backup=()
for file in "${candidate_files[@]}"; do
if [ -f "$file" ]; then
files_to_backup+=("$file")
fi
done
if [ ${#files_to_backup[@]} -gt 0 ]; then
local zip_output="$DESKTOP_DIR/方德系统授权文件备份.zip"
if command -v zip >/dev/null 2>&1; then
if sudo zip -j "$zip_output" "${files_to_backup[@]}" >/dev/null 2>&1; then
sudo chown "$REAL_USER":"$(id -gn "$REAL_USER")" "$zip_output" 2>/dev/null || true
echo "✅ 方德授权文件已备份至:$zip_output" | log
else
echo "❌ ZIP 压缩失败(权限或磁盘问题)" | log
fi
else
echo "⚠️ zip 命令未安装,跳过压缩备份" | log
fi
else
echo "⚠️ 无授权文件可备份" | log
fi
支持从当前系统或PE系统下导出系统信息。
请大佬们帮忙完善系统激活信息的获取和导出,我没有已激活的uos系统。
#!/bin/bash
功能:获取当前系统或LiveCD系统下获取原系统信息。计算机名,IP,系统版本,用户账户,免密权限,共享文件夹,已安装打印机。当前电脑硬件信息。 By Wqlsoft
20251127 测试uos,银河麒麟v10 sp1 2403 , 方德系统当前系统下正常。
20251127 测试uos,银河麒麟v10 sp1 2403 , 方德系统在LiveCD系统下获取原系统信息正常。
20251201 增加uos,银河麒麟v10 sp1 2403 , 方德系统的激活信息备份,目前只测试银河麒麟v10 sp1激活信息备份有效。手里无其它激活的系统。
20251202 修改SUDO 密码输入提示。
==================== 全局变量声明 ====================
CURRENT_ROOT="/" # 当前操作的系统根路径
MOUNTED_SYSTEM_ROOT="" # LiveCD 中挂载的原系统路径
DESKTOP_DIR="" # 桌面目录(真实用户)
OUTPUT_FILE="" # 输出文件路径
NM_CONNECTIONS_DIR=""
SAMBA_USERSHARES_DIR=""
SAMBA_CONF_FILE=""
IS_LIVECD=false
IS_CHROOTED=false
==================== 获取原始用户信息(关键修复)====================
REAL_USER="{SUDO_USER:-USER}"
if [ "REAL_USER" = "root" ] || [ -z "REAL_USER" ]; then
REAL_HOME="/root"
else
REAL_HOME=(getent passwd "REAL_USER" 2>/dev/null | cut -d: -f6)
if [ -z "REAL_HOME" ] || [ ! -d "REAL_HOME" ]; then
REAL_HOME="/home/$REAL_USER"
fi
fi
==================== 工具函数 ====================
check_root() {
if [ "$EUID" -ne 0 ]; then
echo "❌ 需要 root 权限来执行 chroot 或读取系统文件"
echo "正在尝试通过 sudo 重新运行..."
使用 exec 替换当前进程,避免双重退出
exec sudo -- "$0" "$@"
如果上面失败(比如用户取消密码输入),脚本会在此处终止
echo "sudo 执行失败,退出。"
exit 1
fi
}
detect_environment() {
if grep -q -E "live|casper|boot=casper" /proc/cmdline 2>/dev/null; then
IS_LIVECD=true
echo "✅ 检测到正在 Live CD 环境中运行"
else
IS_LIVECD=false
echo "✅ 正在原系统中运行"
fi
}
自动探测桌面目录(基于真实用户)
detect_desktop_dir() {
if [ -d "$REAL_HOME/Desktop" ]; then
DESKTOP_DIR="$REAL_HOME/Desktop"
elif [ -d "$REAL_HOME/桌面" ]; then
DESKTOP_DIR="$REAL_HOME/桌面"
else
DESKTOP_DIR="$REAL_HOME"
echo "⚠️ 未找到 Desktop 或 桌面 目录,输出将保存到 $DESKTOP_DIR"
fi
}
setup_paths() {
if [ "$IS_LIVECD" = true ]; then
MOUNTED_SYSTEM_ROOT=""
echo "🔍 正在自动探测原系统根目录..."
}
确保 OUTPUT_FILE 路径有效且可写
ensure_output_file_ready() {
if [ -z "$OUTPUT_FILE" ]; then
echo "❌ 错误:OUTPUT_FILE 未设置!"
exit 1
fi
}
log() {
if [ "$IS_CHROOTED" = "true" ]; then
cat
else
tee -a "$OUTPUT_FILE"
fi
}
separator() {
echo "================================================================" | log
}
==================== 信息采集函数 ====================
获取指定网络接口的实际 MAC 地址(安全版,永不失败)
get_actual_mac_by_interface() {
local iface="$1"
if [ -z "$iface" ]; then
echo "N/A"
return 0
fi
local addr_file="/sys/class/net/$iface/address"
if [ ! -f "$addr_file" ]; then
echo "接口不存在"
return 0
fi
安全读取 MAC,转小写,清理空白字符
local mac
mac=(cat "addr_file" 2>/dev/null) || mac=""
if [ -n "$mac" ]; then
echo "$mac" | tr '[:upper:]' '[:lower:]' | tr -d '\r\n\t '
else
echo "无法读取"
fi
}
parse_nm_connection() {
local file="$1"
[ ! -f "$file" ] && return
}
收集 NetworkManager 网络连接信息
collect_network_info() {
separator
echo "网络连接配置:" | log
}
get_share_info() {
echo "=== 当前系统所有共享文件夹 ===" | log
local shares_found=0
}
get_printer_info() {
echo "已安装打印机:" | log
local printers_conf="$CURRENT_ROOT/etc/cups/printers.conf"
if [ -f "$printers_conf" ]; then
echo "解析CUPS打印机配置:" | log
awk '
/^<[Pp]rinter|^<[Dd]efaultPrinter/ {
line = $0 gsub(/^[<[:space:]]/, "", line)
gsub(/>.$/, "", line)
n = split(line, a, /[[:space:]]+/)
name = (n >= 2) ? a[2] : "unknown"
is_def = (/^<[Dd]efaultPrinter/)
next
}
/^[[:space:]]*DeviceURI[[:space:]]+/ {
sub(/^[[:space:]]*DeviceURI[[:space:]]+/, "")
if (is_def) {
def_name = name; def_uri = $0 } else {
names[++cnt] = name; uris[cnt] = $0 }
}
/^[[:space:]]*Info[[:space:]]+/ {
sub(/^[[:space:]]*Info[[:space:]]+/, "")
if (is_def) {
def_info = $0 } else {
infos[name] = $0 }
}
/^[[:space:]]*State[[:space:]]+/ {
sub(/^[[:space:]]*State[[:space:]]+/, "")
if (is_def) {
def_state = $0 } else {
states[name] = $0 }
}
END {
if (def_name) {
print "默认打印机:"
print " 名称:" def_name
print " 驱动地址:" def_uri
if (def_info) print " 描述:" def_info
if (def_state) print " 状态:" def_state
print ""
}
for (i = 1; i <= cnt; i++) {
print "打印机" i ":"
print " 名称:" names[i]
print " 驱动地址:" uris[i]
if (infos[names[i]]) print " 描述:" infos[names[i]]
if (states[names[i]]) print " 状态:" states[names[i]]
print ""
}
if (!def_name && cnt == 0) {
print "未配置打印机"
}
}' "$printers_conf" | log
else
echo "CUPS打印机配置文件不存在: $printers_conf" | log
fi
}
==================== 收集用户信息 ====================
=====================================================
收集用户信息(基于 /etc/passwd)
collect_user_info() {
separator
echo "用户信息:" | log
}
收集 Home 目录内容和 /usr 权限(支持独立 home 分区)
collect_home_and_usr_info() {
separator
echo "用户数据目录 Home 目录内容:" | log
}
静态分析 sudo 免密配置(不运行 sudo 命令)
collect_sudo_nopasswd_info() {
separator
echo "Sudo 免密权限配置(静态分析):" | log
}
================= 当前机器的硬件信息 =================
=====================================================
收集当前机器的硬件信息(适用于 LiveCD 或原系统)
collect_hardware_info() {
separator
echo "硬件信息:" | log
}
==================== 银河麒麟 V10 激活与硬件信息(仅在 Kylin 系统下执行)====================
collect_kylin_activation_info() {
判断是否为银河麒麟系统:检查 /etc/kylin-release 或 os-release
local kylin_release="$CURRENT_ROOT/etc/kylin-release"
local os_release="$CURRENT_ROOT/etc/os-release"
local is_kylin=false
}
==================== 统信 UOS 激活与授权信息(静态读取)====================
collect_uos_activation_info() {
判断是否为统信 UOS 系统
local os_release="$CURRENT_ROOT/etc/os-release"
local is_uos=false
}
==================== 中科方德(FangDe / NFSChina)系统激活与授权信息(静态读取)====================
collect_fangde_activation_info() {
判断是否为中科方德(FangDe / NFSChina)系统
local os_release="$CURRENT_ROOT/etc/os-release"
local is_fangde=false
}
==================== 主流程 ====================
main() {
check_root
detect_environment
setup_paths # ← 此时 OUTPUT_FILE 已设置
}
==================== 执行 ====================
main