本文目录导读:

我来教你编写自动挂载网络存储(如 NFS、SMB/CIFS)的脚本。
NFS 自动挂载脚本
基础版本
#!/bin/bash
# NFS 自动挂载脚本
# 使用前请修改变量
# 配置参数
NFS_SERVER="192.168.1.100"
NFS_SHARE="/shared/path"
MOUNT_POINT="/mnt/nfs_share"
CRED_FILE="/etc/nfs_credentials"
# 检查是否为 root 用户
if [[ $EUID -ne 0 ]]; then
echo "此脚本需要 root 权限运行"
exit 1
fi
# 创建挂载点
mkdir -p $MOUNT_POINT
# 检查是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
echo "目录 $MOUNT_POINT 已经挂载"
exit 0
fi
# 检测网络连通性
ping -c 2 $NFS_SERVER > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "无法连接到 NFS 服务器 $NFS_SERVER"
exit 1
fi
# 安装 nfs-common(如果未安装)
if ! command -v mount.nfs &> /dev/null; then
apt-get update && apt-get install -y nfs-common
# 对于 CentOS/RHEL: yum install -y nfs-utils
fi
# 挂载 NFS 共享
mount -t nfs -o vers=4,hard,intr,rsize=1048576,wsize=1048576 \
$NFS_SERVER:$NFS_SHARE $MOUNT_POINT
if [ $? -eq 0 ]; then
echo "NFS 挂载成功: $MOUNT_POINT"
else
echo "NFS 挂载失败"
exit 1
fi
SMB/CIFS 自动挂载脚本
支持密码文件
#!/bin/bash
# SMB/CIFS 自动挂载脚本
# 配置参数
SMB_SERVER="//192.168.1.100"
SMB_SHARE="/shared_folder"
MOUNT_POINT="/mnt/smb_share"
USERNAME="your_username"
PASSWORD="your_password"
DOMAIN="WORKGROUP" # 可选
# 检查 root 权限
if [[ $EUID -ne 0 ]]; then
echo "此脚本需要 root 权限运行"
exit 1
fi
# 创建凭据文件(提高安全性)
create_credentials() {
local cred_file="/etc/smb_credentials"
cat > $cred_file << EOF
username=$USERNAME
password=$PASSWORD
domain=$DOMAIN
EOF
chmod 600 $cred_file
echo $cred_file
}
# 创建挂载点
mkdir -p $MOUNT_POINT
# 检查是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
echo "目录 $MOUNT_POINT 已经挂载"
exit 0
fi
# 安装 cifs-utils
if ! command -v mount.cifs &> /dev/null; then
apt-get update && apt-get install -y cifs-utils
fi
# 创建凭据文件
CRED_FILE=$(create_credentials)
# 挂载 SMB 共享
mount -t cifs -o credentials=$CRED_FILE,vers=3.0,uid=$(id -u),gid=$(id -g),file_mode=0755,dir_mode=0755 \
"$SMB_SERVER$SMB_SHARE" "$MOUNT_POINT"
if [ $? -eq 0 ]; then
echo "SMB 挂载成功: $MOUNT_POINT"
else
echo "SMB 挂载失败"
exit 1
fi
智能自动挂载脚本(支持多种协议)
#!/bin/bash
# 智能网络存储自动挂载脚本
# 支持 NFS、SMB/CIFS、SSHFS
set -e
# 配置函数
load_config() {
# 从配置文件读取
if [ -f "/etc/network-mount.conf" ]; then
source "/etc/network-mount.conf"
else
# 默认配置
NETWORK_SHARES=(
"nfs|192.168.1.100:/shared/data|/mnt/data"
"smb|//192.168.1.100/shared/docs|/mnt/docs|user|pass"
"sshfs|user@192.168.1.100:/home/shared|/mnt/remote"
)
fi
}
# 检查依赖
check_dependencies() {
local type=$1
case $type in
nfs)
command -v mount.nfs &> /dev/null || \
install_package "nfs-common" "nfs-utils"
;;
smb)
command -v mount.cifs &> /dev/null || \
install_package "cifs-utils"
;;
sshfs)
command -v sshfs &> /dev/null || \
install_package "sshfs"
;;
esac
}
# 安装软件包
install_package() {
local deb_pkg=$1
local rpm_pkg=$2
if command -v apt-get &> /dev/null; then
apt-get update && apt-get install -y $deb_pkg
elif command -v yum &> /dev/null; then
yum install -y $rpm_pkg
elif command -v dnf &> /dev/null; then
dnf install -y $rpm_pkg
else
echo "未支持的包管理器"
exit 1
fi
}
# 挂载单个共享
mount_share() {
local share_type=$1
local share_source=$2
local mount_point=$3
local credentials=$4
# 创建挂载点
mkdir -p "$mount_point"
# 检查是否已挂载
if mount | grep -q "$mount_point"; then
echo "跳过 $mount_point:已经挂载"
return 0
fi
# 检查网络
local server=$(echo $share_source | grep -oP '(\d{1,3}\.){3}\d{1,3}')
if [ -z "$server" ]; then
server=$(echo $share_source | cut -d'@' -f2 | cut -d':' -f1)
fi
ping -c 1 -W 2 $server &> /dev/null || {
echo "无法连接到 $server,跳过 $mount_point"
return 1
}
# 执行挂载
case $share_type in
nfs)
check_dependencies "nfs"
mount -t nfs -o vers=4,hard,intr "$share_source" "$mount_point"
;;
smb)
check_dependencies "smb"
if [ -n "$credentials" ]; then
echo "$credentials" > /tmp/smb_cred_$$
mount -t cifs -o credentials=/tmp/smb_cred_$$ \
"$share_source" "$mount_point"
rm -f /tmp/smb_cred_$$
else
mount -t cifs "$share_source" "$mount_point"
fi
;;
sshfs)
check_dependencies "sshfs"
sshfs -o allow_other,default_permissions \
"$share_source" "$mount_point"
;;
esac
if [ $? -eq 0 ]; then
echo "成功挂载 $share_type: $mount_point"
else
echo "挂载失败: $share_type $share_source"
return 1
fi
}
# 主函数
main() {
# 检查 root 权限
if [[ $EUID -ne 0 ]]; then
echo "请以 root 权限运行此脚本"
exit 1
fi
# 加载配置
load_config
# 遍历并挂载所有共享
for share in "${NETWORK_SHARES[@]}"; do
IFS='|' read -r type source mount cred <<< "$share"
mount_share "$type" "$source" "$mount" "$cred" || true
done
}
# 执行主函数
main "$@"
配置文件示例
创建 /etc/network-mount.conf:
# 网络存储挂载配置
# 格式: type|source|mount_point|credentials(可选)
# NFS 共享
NETWORK_SHARES+=(
"nfs|192.168.1.100:/srv/nfs/data|/mnt/data"
"nfs|192.168.1.101:/exports/backup|/mnt/backup"
)
# SMB 共享
NETWORK_SHARES+=(
"smb|//192.168.1.100/shared|/mnt/shared|username=admin\npassword=secret\ndomain=WORKGROUP"
)
# SSHFS 共享
NETWORK_SHARES+=(
"sshfs|user@192.168.1.200:/home/shared|/mnt/sshfs"
)
系统自启动设置
创建 systemd 服务
# /etc/systemd/system/network-mount.service [Unit] Description=Network Storage Auto Mount After=network-online.target Wants=network-online.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/auto-mount.sh ExecStop=/usr/local/bin/auto-umount.sh User=root [Install] WantedBy=multi-user.target
启用服务
# 保存脚本到 /usr/local/bin/ sudo chmod +x /usr/local/bin/auto-mount.sh # 启用服务 sudo systemctl daemon-reload sudo systemctl enable network-mount.service sudo systemctl start network-mount.service
使用说明
- 脚本权限:
chmod +x script.sh - 运行脚本:
sudo ./auto-mount.sh - 配置文件路径:
/etc/network-mount.conf - 日志检查:使用
journalctl -u network-mount.service查看日志
这些脚本会根据网络状态自动判断是否尝试挂载,支持多种协议,并会自动处理依赖安装。