#!/usr/bin/env bash # VSFTPD Installer # Min. Requirement : GNU/Linux Ubuntu 18.04 # Last Build : 24/10/2021 # Author : MasEDI.Net (me@masedi.net) # Since Version : 1.0.0 # Include helper functions. if [[ "$(type -t run)" != "function" ]]; then BASE_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) # shellcheck disable=SC1091 . "${BASE_DIR}/helper.sh" fi # Make sure only root can run this installer script. requires_root # Make sure only supported distribution can run this installer script. preflight_system_check ## # Install Vsftpd. ## function init_vsftpd_install() { local SELECTED_INSTALLER="" if [[ "${AUTO_INSTALL}" == true ]]; then if [[ "${INSTALL_VSFTPD}" == true ]]; then DO_INSTALL_VSFTPD="y" SELECTED_INSTALLER=${VSFTPD_INSTALLER:-"repo"} else DO_INSTALL_VSFTPD="n" fi else while [[ "${DO_INSTALL_VSFTPD}" != "y" && "${DO_INSTALL_VSFTPD}" != "n" ]]; do read -rp "Do you want to install FTP server (VSFTPD)? [y/n]: " -i y -e DO_INSTALL_VSFTPD done fi if [[ ${DO_INSTALL_VSFTPD} == y* || ${DO_INSTALL_VSFTPD} == Y* ]]; then echo "Available VSFTPD installation method:" echo " 1). Install from Repository (repo)" echo " 2). Compile from Source (source)" echo "--------------------------------" while [[ ${SELECTED_INSTALLER} != "1" && ${SELECTED_INSTALLER} != "2" && ${SELECTED_INSTALLER} != "none" && \ ${SELECTED_INSTALLER} != "repo" && ${SELECTED_INSTALLER} != "source" ]]; do read -rp "Select an option [1-2]: " -e SELECTED_INSTALLER done case "${SELECTED_INSTALLER}" in 1 | "repo") echo "Installing FTP server (VSFTPD) from repository..." run apt-get install -qq -y vsftpd # Backup original config. run cp /etc/vsftpd.conf /etc/vsftpd.conf.backup ;; 2 | "source") echo "Installing FTP server (VSFTPD) from source..." #https://www.linuxfromscratch.org/blfs/view/svn/server/vsftpd.html DISTRIB_NAME=${DISTRIB_NAME:-$(get_distrib_name)} RELEASE_NAME=${RELEASE_NAME:-$(get_release_name)} # Install libraries. case "${DISTRIB_NAME}" in "debian") case "${RELEASE_NAME}" in "stretch") run apt-get install -qq -y libpam0g libpam0g-dev libcapi20-3 libcapi20-dev \ libcap-dev libcap2 libtirpc-common libtirpc-dev libtirpc1 ;; "buster" | "bullseye") run apt-get install -qq -y libpam0g libpam0g-dev libcapi20-3 libcapi20-dev \ libcap-dev libcap2 libtirpc-common libtirpc-dev libtirpc3 ;; *) fail "Unsupported Debian release: ${RELEASE_NAME^}." ;; esac ;; "ubuntu") case "${RELEASE_NAME}" in "bionic") run apt-get install -qq -y libpam0g libpam0g-dev libcapi20-3 libcapi20-dev \ libcap-dev libcap2 libtirpc-dev libtirpc1 ;; "focal") run apt-get install -qq -y libpam0g libpam0g-dev libcapi20-3 libcapi20-dev \ libcap-dev libcap2 libtirpc-common libtirpc-dev libtirpc3 ;; *) fail "Unsupported Ubuntu release: ${RELEASE_NAME^}." ;; esac ;; *) fail "Unsupported OS distribution: ${DISTRIB_NAME^}." ;; esac # Fix error: sysdeputil.o: In function `vsf_sysdep_has_capabilities' LIB_GNU_DIR="/lib/${ARCH}-linux-gnu" if [[ "${ARCH}" == "x86_64" ]]; then LIB_DIR="/lib64" else LIB_DIR="/lib" fi if [[ -f "${LIB_GNU_DIR}/libcap.so.2" ]]; then run ln -s "${LIB_GNU_DIR}/libcap.so.2" "${LIB_DIR}/libcap.so" elif [[ -f "${LIB_GNU_DIR}/libcap.so.1" ]]; then run ln -s "${LIB_GNU_DIR}/libcap.so.1" "${LIB_DIR}/libcap.so" elif [[ -f "${LIB_GNU_DIR}/libcap.so" ]]; then run ln -s "${LIB_GNU_DIR}/libcap.so" "${LIB_DIR}/libcap.so" else error "Cannot find libcap.so file." fi local CURRENT_DIR && \ CURRENT_DIR=$(pwd) if [[ "${VSFTPD_VERSION}" == "latest" ]]; then VSFTPD_FILENAME="vsftpd-3.0.5.tar.gz" VSFTPD_ZIP_URL="https://security.appspot.com/downloads/${VSFTPD_FILENAME}" else VSFTPD_FILENAME="vsftpd-${VSFTPD_VERSION}.tar.gz" VSFTPD_ZIP_URL="https://security.appspot.com/downloads/${VSFTPD_FILENAME}" fi run cd "${BUILD_DIR}" && \ run wget "${VSFTPD_ZIP_URL}" -q --show-progress && \ run tar -zxf "${VSFTPD_FILENAME}" && \ run cd vsftpd-*/ && \ run make && \ run make install && \ run ldconfig /usr/local/lib && \ run cd "${CURRENT_DIR}" || return 1 ;; *) # Skip installation. error "Installer method not supported. VSFTPD installation skipped." ;; esac # Configure Fal2ban. echo "Configuring FTP server (VSFTPD)..." if [[ "${DRYRUN}" != true ]]; then # Backup default vsftpd conf. [[ -f /etc/vsftpd.conf ]] && \ run mv /etc/vsftpd.conf /etc/vsftpd.conf.bak run touch /etc/vsftpd.conf # Enable jail cat > /etc/vsftpd.conf <