| Server IP : 172.67.149.12 / Your IP : 104.23.243.226 Web Server : Apache System : Linux vm3310.eosdns.net 4.18.0-553.132.1.el8_10.x86_64 #1 SMP Thu Jun 11 14:27:43 UTC 2026 x86_64 User : carnalmedia ( 1000) PHP Version : 7.4.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /mojo/ |
Upload File : |
#!/bin/bash
#
# Script: mjact_ftp
#
# Usage: mjact_ftp -a <action (list/add/remove/changepassword)> -n <FTP username> -u <local username> -f <path> -p
#
# Description: A tool for managing FTP accounts
#
# Author: Nikita Shchetinin
#
# Changelog:
# * 07.04.2023: Nikita Shchetinin
# - Removal function fix
# * 02.03.2021: Nikita Shchetinin
# - Initial write
if [ "$(whoami)" != 'root' ]
then
echo "You must execute this script as the root user!"
exit 1
fi
LIST () {
if [ ! -f /etc/vsftpd/virtual_users.db ]
then
echo "No FTP user is added to this server!"
exit 1
else
echo $'FTP user\tLocal user\tLocal path'
for i in $(db_dump -p /etc/vsftpd/virtual_users.db | sed -n '/HEADER=END/,/DATA=END/{/HEADER=END/b;/DATA=END/b;p}' | sed -n '1~2p' | tr -d ' ')
do
echo -n "$i"
echo -n $'\t\t'
if [ -f /etc/vsftpd/users/$i ]
then
if grep -qoP "(?<=guest_username=).*" /etc/vsftpd/users/$i
then
grep -oP "(?<=guest_username=).*" /etc/vsftpd/users/$i | tr '\n' '\t'
else
grep -oP "(?<=guest_username=).*" /etc/vsftpd/vsftpd.conf | tr '\n' '\t'
fi
echo -n $'\t'
if grep -qoP "(?<=local_root=).*" /etc/vsftpd/users/$i
then
grep -oP "(?<=local_root=).*" /etc/vsftpd/users/$i
else
grep -oP "(?<=local_root=).*" /etc/vsftpd/vsftpd.conf
fi
else
grep -oP "(?<=guest_username=).*" /etc/vsftpd/vsftpd.conf | tr '\n' '\t'
echo -n $'\t'
grep -oP "(?<=local_root=).*" /etc/vsftpd/vsftpd.conf
fi
done
fi
}
ADD () {
if [ -n "$username" ]
then
if ! id -u $username > /dev/null 2>&1
then
echo "The provided local user does not exist!"
exit 1
fi
fi
if [ -n "$path" ]
then
if [ ! -d "$path" ]
then
echo "The provided local path does not exist or is not a directory!"
exit 1
fi
fi
if [ -f /root/virtual_users.txt ]
then
rm -f /root/virtual_users.txt
echo "/root/virtual_users.txt existed and has been deleted"
fi
if [ -z "$name" ]
then
echo "The username is required!"
exit 1
else
if [ -f /etc/vsftpd/virtual_users.db ]
then
if db_dump -p /etc/vsftpd/virtual_users.db | grep -qw "$name"
then
echo "The provided FTP username is already added!"
exit 1
else
db_dump -p /etc/vsftpd/virtual_users.db | sed -n '/HEADER=END/,/DATA=END/{/HEADER=END/b;/DATA=END/b;p}' | tr -d ' ' > /root/virtual_users.txt
fi
fi
echo "$name" >> /root/virtual_users.txt
if [ "$passprompt" == "YES" ]
then
read -p "Enter the password: " password
while [ -z "$password" ]
do
echo "The password is required!"
read -p "Enter the password: " password
done
else
password=$(</dev/urandom tr -dc A-Za-z0-9 | head -c16)
fi
echo "$password" >> /root/virtual_users.txt
rm -f /etc/vsftpd/virtual_users.db
db_load -T -t hash -f /root/virtual_users.txt /etc/vsftpd/virtual_users.db
chmod 600 /etc/vsftpd/virtual_users.db
rm -f /root/virtual_users.txt
if [ -n "$username" ]
then
echo "guest_username=$username" >> /etc/vsftpd/users/$name
fi
if [ -n "$path" ]
then
echo "local_root=$path" >> /etc/vsftpd/users/$name
fi
systemctl restart vsftpd
echo "Hostname: $(hostname)"
echo "Port: 21"
echo "FTP user: $name"
echo "FTP password: $password"
fi
}
REMOVE () {
if [ -f /root/virtual_users.txt ]
then
rm -f /root/virtual_users.txt
echo "/root/virtual_users.txt existed and has been deleted"
fi
if [ -z "$name" ]
then
echo "The username is required!"
exit 1
else
if [ -f /etc/vsftpd/virtual_users.db ]
then
if db_dump -p /etc/vsftpd/virtual_users.db | grep -qw "$name"
then
if [ $(db_dump -p /etc/vsftpd/virtual_users.db | sed -n '/HEADER=END/,/DATA=END/{/HEADER=END/b;/DATA=END/b;p}' | sed -n '1~2p' | wc -l) != 1 ]
then
db_dump -p /etc/vsftpd/virtual_users.db | sed -n '/HEADER=END/,/DATA=END/{/HEADER=END/b;/DATA=END/b;p}' | tr -d ' ' > /root/virtual_users.txt
sed -i "/\<$name\>/,+1 d" /root/virtual_users.txt
rm -f /etc/vsftpd/virtual_users.db
db_load -T -t hash -f /root/virtual_users.txt /etc/vsftpd/virtual_users.db
chmod 600 /etc/vsftpd/virtual_users.db
rm -f /root/virtual_users.txt
rm -f /etc/vsftpd/users/$name
systemctl restart vsftpd
echo "$name has been deleted"
else
rm -f /etc/vsftpd/virtual_users.db
systemctl restart vsftpd
echo "$name has been deleted"
fi
else
echo "The provided FTP username doesn't exist!"
exit 1
fi
else
echo "No FTP user is added to this server!"
exit 1
fi
fi
}
CHANGE () {
if [ -f /root/virtual_users.txt ]
then
rm -f /root/virtual_users.txt
echo "/root/virtual_users.txt existed and has been deleted"
fi
if [ -z "$name" ]
then
echo "The username is required!"
exit 1
else
if [ -f /etc/vsftpd/virtual_users.db ]
then
if db_dump -p /etc/vsftpd/virtual_users.db | grep -qw "$name"
then
if [ "$passprompt" == "YES" ]
then
read -p "Enter the password: " password
while [ -z "$password" ]
do
echo "The password is required!"
read -p "Enter the password: " password
done
else
password=$(</dev/urandom tr -dc A-Za-z0-9 | head -c16)
fi
db_dump -p /etc/vsftpd/virtual_users.db | sed -n '/HEADER=END/,/DATA=END/{/HEADER=END/b;/DATA=END/b;p}' | tr -d ' ' > /root/virtual_users.txt
escaped_password=$(echo -n "$password" | sed -e 's/[\/&]/\\&/g')
sed -i "/\<$name\>/{n;s/.*/$escaped_password/}" /root/virtual_users.txt
rm -f /etc/vsftpd/virtual_users.db
db_load -T -t hash -f /root/virtual_users.txt /etc/vsftpd/virtual_users.db
chmod 600 /etc/vsftpd/virtual_users.db
rm -f /root/virtual_users.txt
systemctl restart vsftpd
echo "Hostname: $(hostname)"
echo "Port: 21"
echo "FTP user: $name"
echo "FTP password: $password"
else
echo "The provided FTP username doesn't exist!"
exit 1
fi
else
echo "No FTP user is added to this server!"
exit 1
fi
fi
}
HELP () {
echo "A tool for managing FTP accounts"
echo "usage: mjact_ftp -a <action (list/add/remove/changepassword)> -n <FTP username> -u <local username> -f <path> -p (to submit password using a password prompt)"
}
if [[ "${1}" == "" ]] || [[ "${1}" == "-h" ]] || [[ "${1}" == "--help" ]]
then
HELP
exit
else
while getopts ":a:n:u:f:p" OPTION
do
case "${OPTION}" in
a)
action="${OPTARG}"
;;
n)
name="${OPTARG}"
;;
u)
username="${OPTARG}"
;;
f)
path="${OPTARG}"
;;
p)
passprompt="YES"
;;
esac
done
fi
case $action in
list)
sleep 1
LIST
;;
add)
sleep 1
ADD
;;
remove)
sleep 1
REMOVE
;;
changepassword)
sleep 1
CHANGE
;;
*)
echo "Invalid action!"
exit 1
;;
esac