Last active 1780647122

挂载飞牛Nas的smb

mount-smb.sh Raw
1#!/bin/bash
2
3# 颜色定义
4RED='\033[0;31m'
5GREEN='\033[0;32m'
6YELLOW='\033[1;33m'
7BLUE='\033[0;34m'
8NC='\033[0m' # No Color
9
10# 打印带颜色的消息
11print_info() {
12 echo -e "${BLUE}[INFO]${NC} $1"
13}
14
15print_success() {
16 echo -e "${GREEN}[SUCCESS]${NC} $1"
17}
18
19print_warning() {
20 echo -e "${YELLOW}[WARNING]${NC} $1"
21}
22
23print_error() {
24 echo -e "${RED}[ERROR]${NC} $1"
25}
26
27# 检查是否以 root 运行
28check_root() {
29 if [ "$EUID" -ne 0 ]; then
30 print_error "请使用 sudo 运行此脚本"
31 echo "示例: sudo ./mount_fnnas.sh"
32 exit 1
33 fi
34}
35
36# 检查 cifs 支持
37check_cifs_support() {
38 print_info "检查系统是否支持 CIFS/SMB..."
39
40 # 检查内核是否支持 cifs
41 if lsmod | grep -q cifs; then
42 print_success "CIFS 模块已加载"
43 return 0
44 fi
45
46 # 尝试加载 cifs 模块
47 print_info "尝试加载 CIFS 内核模块..."
48 if modprobe cifs 2>/dev/null; then
49 print_success "CIFS 模块加载成功"
50 return 0
51 fi
52
53 print_error "系统不支持 CIFS/SMB 文件系统"
54 print_info "请确保内核支持 cifs,或安装 cifs-utils 包"
55 return 1
56}
57
58# 检查并安装必要软件包
59check_packages() {
60 print_info "检查必要软件包..."
61
62 # 检查是否安装了 cifs-utils
63 if ! command -v mount.cifs &> /dev/null; then
64 print_warning "cifs-utils 未安装,正在安装..."
65 apt update -qq
66 apt install -y cifs-utils
67 if [ $? -eq 0 ]; then
68 print_success "cifs-utils 安装成功"
69 else
70 print_error "cifs-utils 安装失败"
71 return 1
72 fi
73 else
74 print_success "cifs-utils 已安装"
75 fi
76 return 0
77}
78
79# 获取挂载信息
80get_mount_info() {
81 echo ""
82 echo "========================================="
83 echo " 飞牛 NAS SMB 挂载工具"
84 echo "========================================="
85 echo ""
86
87 # 获取 NAS IP 地址
88 read -p "请输入飞牛 NAS 的 IP 地址 (例如: 192.168.1.100): " nas_ip
89 while [[ -z $nas_ip ]]; do
90 print_error "IP 地址不能为空"
91 read -p "请输入飞牛 NAS 的 IP 地址: " nas_ip
92 done
93
94 # 获取共享文件夹名称
95 read -p "请输入共享文件夹名称 (例如: myshare): " share_name
96 while [[ -z $share_name ]]; do
97 print_error "共享文件夹名称不能为空"
98 read -p "请输入共享文件夹名称: " share_name
99 done
100
101 # 获取用户名
102 read -p "请输入 SMB 用户名 [默认: guest]: " username
103 username=${username:-guest}
104
105 # 获取密码
106 read -s -p "请输入密码 (留空则为无密码): " password
107 echo ""
108
109 # 挂载点
110 read -p "请输入本地挂载点路径 [默认: /mnt/fnnas]: " mount_point
111 mount_point=${mount_point:-/mnt/fnnas}
112
113 # 询问是否开机自动挂载
114 echo ""
115 read -p "是否配置开机自动挂载?(y/n) [默认: n]: " auto_mount
116 auto_mount=${auto_mount:-n}
117}
118
119# 测试连接
120test_connection() {
121 print_info "测试与 NAS 的连接..."
122 if ping -c 3 -W 2 "$nas_ip" > /dev/null 2>&1; then
123 print_success "网络连接正常"
124 return 0
125 else
126 print_error "无法 ping 通 $nas_ip"
127 read -p "是否继续尝试挂载?(y/n): " continue_anyway
128 if [[ $continue_anyway != "y" ]]; then
129 return 1
130 fi
131 fi
132}
133
134# 创建挂载点
135create_mount_point() {
136 if [ ! -d "$mount_point" ]; then
137 print_info "创建挂载点: $mount_point"
138 mkdir -p "$mount_point"
139 if [ $? -eq 0 ]; then
140 print_success "挂载点创建成功"
141 else
142 print_error "挂载点创建失败"
143 return 1
144 fi
145 else
146 print_info "挂载点已存在: $mount_point"
147 fi
148 return 0
149}
150
151# 执行挂载
152do_mount() {
153 local source="//$nas_ip/$share_name"
154
155 print_info "正在挂载 $source$mount_point"
156
157 # 构建挂载选项
158 local mount_options="uid=$(logname 2>/dev/null || echo 1000),gid=$(logname 2>/dev/null || echo 1000),iocharset=utf8,vers=3.0"
159
160 if [ -n "$password" ]; then
161 # 有密码的情况
162 mount -t cifs "$source" "$mount_point" -o username="$username",password="$password",$mount_options
163 else
164 # 无密码(guest)的情况
165 mount -t cifs "$source" "$mount_point" -o username="$username",password="",$mount_options
166 fi
167
168 if [ $? -eq 0 ]; then
169 print_success "挂载成功!"
170 print_info "挂载点: $mount_point"
171 return 0
172 else
173 print_error "挂载失败"
174 print_info "可能的原因:"
175 echo " 1. SMB 协议版本不匹配(尝试 vers=2.0 或 vers=1.0)"
176 echo " 2. 用户名或密码错误"
177 echo " 3. 共享文件夹名称不正确"
178 echo " 4. 防火墙阻止了连接"
179 return 1
180 fi
181}
182
183# 配置开机自动挂载
184setup_auto_mount() {
185 if [[ $auto_mount != "y" ]]; then
186 print_info "跳过开机自动挂载配置"
187 return 0
188 fi
189
190 print_info "配置开机自动挂载..."
191
192 # 创建凭据文件
193 local cred_file="/etc/samba/fnnas_credentials"
194 echo "username=$username" > "$cred_file"
195 if [ -n "$password" ]; then
196 echo "password=$password" >> "$cred_file"
197 else
198 echo "password=" >> "$cred_file"
199 fi
200 chmod 600 "$cred_file"
201 print_success "凭据文件已创建: $cred_file"
202
203 # 备份 fstab
204 cp /etc/fstab /etc/fstab.backup
205 print_info "已备份 /etc/fstab 到 /etc/fstab.backup"
206
207 # 添加到 fstab
208 local source="//$nas_ip/$share_name"
209 local uid=$(logname 2>/dev/null | xargs id -u 2>/dev/null || echo 1000)
210 local gid=$(logname 2>/dev/null | xargs id -g 2>/dev/null || echo 1000)
211 local fstab_entry="$source $mount_point cifs credentials=$cred_file,uid=$uid,gid=$gid,iocharset=utf8,vers=3.0,_netdev 0 0"
212
213 echo "$fstab_entry" >> /etc/fstab
214
215 print_success "已添加到 /etc/fstab"
216 print_info "现在可以运行 'mount -a' 测试自动挂载配置"
217}
218
219# 显示挂载信息
220show_mount_info() {
221 echo ""
222 echo "========================================="
223 echo " 挂载信息总结"
224 echo "========================================="
225 echo -e "NAS 地址: ${GREEN}$nas_ip${NC}"
226 echo -e "共享名称: ${GREEN}$share_name${NC}"
227 echo -e "用户名: ${GREEN}$username${NC}"
228 echo -e "挂载点: ${GREEN}$mount_point${NC}"
229 echo -e "开机自动挂载: ${GREEN}$([[ $auto_mount == "y" ]] && echo "是" || echo "否")${NC}"
230 echo "========================================="
231
232 # 显示当前挂载情况
233 echo ""
234 print_info "当前挂载的文件系统:"
235 df -h | grep -E "Filesystem|$mount_point" || echo " 未找到挂载点"
236}
237
238# 主函数
239main() {
240 check_root
241 check_cifs_support
242 if [ $? -ne 0 ]; then
243 exit 1
244 fi
245
246 check_packages
247 if [ $? -ne 0 ]; then
248 exit 1
249 fi
250
251 get_mount_info
252 test_connection
253 if [ $? -ne 0 ]; then
254 print_error "连接测试失败,退出"
255 exit 1
256 fi
257
258 create_mount_point
259 if [ $? -ne 0 ]; then
260 exit 1
261 fi
262
263 do_mount
264 if [ $? -eq 0 ]; then
265 setup_auto_mount
266 show_mount_info
267
268 # 询问是否测试写入
269 echo ""
270 read -p "是否在挂载点创建测试文件?(y/n) [默认: n]: " test_write
271 if [[ $test_write == "y" ]]; then
272 touch "$mount_point/test_$(date +%s).txt" 2>/dev/null
273 if [ $? -eq 0 ]; then
274 print_success "测试文件创建成功,挂载点可写"
275 else
276 print_warning "无法创建测试文件,请检查权限"
277 fi
278 fi
279 else
280 # 尝试不同的 SMB 版本
281 echo ""
282 read -p "是否尝试使用 SMB 2.0 协议重试?(y/n): " retry_v2
283 if [[ $retry_v2 == "y" ]]; then
284 print_info "尝试使用 SMB 2.0 协议..."
285 local source="//$nas_ip/$share_name"
286 local mount_options="uid=$(logname 2>/dev/null || echo 1000),gid=$(logname 2>/dev/null || echo 1000),iocharset=utf8,vers=2.0"
287
288 if [ -n "$password" ]; then
289 mount -t cifs "$source" "$mount_point" -o username="$username",password="$password",$mount_options
290 else
291 mount -t cifs "$source" "$mount_point" -o username="$username",password="",$mount_options
292 fi
293
294 if [ $? -eq 0 ]; then
295 print_success "使用 SMB 2.0 挂载成功!"
296 else
297 print_error "仍然失败,请检查网络和共享设置"
298 fi
299 fi
300 fi
301}
302
303# 运行主函数
304main