Skip to content

Instantly share code, notes, and snippets.

@gotnix
Last active December 23, 2019 16:27
Show Gist options
  • Select an option

  • Save gotnix/4d6b7606c03495df82fb to your computer and use it in GitHub Desktop.

Select an option

Save gotnix/4d6b7606c03495df82fb to your computer and use it in GitHub Desktop.
增、删、查 vsftpd 虚拟用户(基于Berkeley DB)
#!/bin/bash
#
# add Vsfptd Virtual User via Berkeley DB
#
vu_home='/data/ftp/'
#vu_home='/tmp/ftp/'
conf_dir='/etc/vsftpd/'
#conf_dir='/tmp/vsftpd/'
vu_conf="${conf_dir}vsftpd_user_conf/"
bdb_dir="${conf_dir}bdb/"
################################################################
# DEFINE FUNCTIONS HERE
################################################################
usage () {
cat << EOF
Usage: $(basename ${0}) -<a|d|i> <user_name>
-a Add a user.
-d Delete a user.
-i Query user information.
EOF
exit 1
}
query_user () {
local name=${1}
if db_dump -p ${bdb_dir}vsftpd_login.db \
| grep -E "\<${name}\>$" 2>&1 > /dev/null ; then
return 0
else
return 1
fi
}
user_info () {
local name=${1}
if query_user ${name} ; then
echo -e "The information about user <${name}> : "
db_dump -p ${bdb_dir}vsftpd_login.db | /bin/grep -A 1 -E "\<${name}\>"
#db_dump -p ${bdb_dir}vsftpd_login.db | sed -n "/\<"${name}"\>/{n;s/\ //;p;}"
awk -F '=' '{print " "$2}' "${vu_conf}""${name}"
else
echo 'User is not exists.'
fi
}
del_user () {
local name=${1}
local pw_rand=$(tr -dc '[:alnum:]' < /dev/urandom | head --bytes=4)
# 删除用户
if query_user ${name}; then
sed -i'_bak' "/^"${name}"$/{N;d}" ${bdb_dir}vsftpd_login.txt \
&& mv ${bdb_dir}vsftpd_login.db{,_bak} \
&& db_load -T -t hash -f ${bdb_dir}vsftpd_login.txt ${bdb_dir}vsftpd_login.db
else
echo "User is not exists."
fi
# 删除配置文件
if [[ -f "${vu_conf}${name}" ]]; then
mv "${vu_conf}${name}"{,_bak}
else
echo "${vu_conf}${name} is not exists."
fi
# 删除目录
if [[ -d "${vu_home}${name}/" ]]; then
mv "${vu_home}${name}"{,_bak}/
else
echo "${vu_home}${name}/ is not exists."
fi
}
add_user () {
local name=${1}
local pw_rand=$(tr -dc '[:alnum:]' < /dev/urandom | head --bytes=4)
# 创建目录
if [[ -d "${vu_home}${name}/" ]]; then
echo "Home_dir is exists."
user_info "${name}"
exit 4
else
mkdir -p "${vu_home}${name}/image/" && chown -R daemon. "${vu_home}${name}/"
fi
# 创建配置文件
if [[ -f "${vu_conf}${name}" ]]; then
echo "User is exists."
user_info "${name}"
exit 5
else
echo "local_root=${vu_home}${name}/" > "${vu_conf}""${name}"
fi
# 添加用户
if ! query_user ${name} ; then
cp -f "${bdb_dir}"vsftpd_login.txt{,_bak} \
&& echo -ne "${name}\n${name}-${pw_rand}\n" >> ${bdb_dir}vsftpd_login.txt
mv "${bdb_dir}"vsftpd_login.db{,_bak} \
&& db_load -T -t hash -f ${bdb_dir}vsftpd_login.txt ${bdb_dir}vsftpd_login.db
fi
user_info "${name}"
}
################################################################
# BEGINNING OF MAIN
################################################################
while getopts "a:d:i:h?" opt ; do
case ${opt} in
"|+")
;;
a|+a)
add_user "${OPTARG}"
;;
d|+d)
del_user "${OPTARG}"
;;
i|+i)
user_info "${OPTARG}"
;;
"|+")
;;
h|?|*)
usage
;;
esac
done
shift `expr $OPTIND - 1`
OPTIND=1
exit $?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment