이 스크립트는 실제로 새 사용자의 디렉터리 구조를 어떻게 생성합니까?

이 스크립트는 실제로 새 사용자의 디렉터리 구조를 어떻게 생성합니까?

아래에 포함된 bash 스크립트를 보고 있습니다. 여러 명령줄 인수를 허용하고 .deb 패키지를 생성합니다. sudo dpkg -i created-file.deb이 명령을 사용하여 패키지를 실행하면 새 사용자가 생성되고 새 사용자의 홈 디렉터리에 .ssh파일authorized_keys 이 두 개로 제출된 디렉터리가 있는 것을 볼 수 있습니다. 매개변수. 그러면 .ssh디렉토리와 authorized_keys파일은 어떻게 생성됩니까? 명령어 는 보이는데 useradd실제로 파일을 새 사용자의 홈 디렉터리로 이동하라는 명령어 없이 .deb 파일이 생성된 것 같습니다.

다음은 스크립트에서 실행하는 명령입니다.

sudo ./gvm-lsc-deb-creator.sh newuser some_file.pub /home/currentuser /home/currentuser [email protected]

전체 스크립트는 다음과 같습니다.

# Command line parameters
USERNAME="$1"
PUBKEY_FILE="$2"
TEMP_DIR="$3"
OUTPUT_PATH=$4
MAINTAINER_EMAIL="$5"

if [ -z "${USERNAME}" ]
then
  echo "No username given" >&2
  exit 1
fi

if [ -z "${PUBKEY_FILE}" ]
then
  echo "No pubkey path given" >&2
  exit 1
fi

if [ -z "${TEMP_DIR}" ]
then
  echo "No temp dir path given" >&2
  exit 1
fi

if [ -z "${OUTPUT_PATH}" ]
then
  echo "No output path given" >&2
  exit 1
fi

if [ -z "${MAINTAINER_EMAIL}" ]
then
  MAINTAINER_HOSTNAME="$(hostname)"
  if [ -z "$HOSTNAME" ]
  then
    MAINTAINER_HOSTNAME="localhost"
  fi
  MAINTAINER_EMAIL="admin@${MAINTAINER_HOSTNAME}"
fi

# Constants
# Package data
PACKAGE_NAME="gvm-lsc-target-${USERNAME}"
PACKAGE_VERSION="0.5-1"
PACKAGE_NAME_VERSION="${PACKAGE_NAME}_${PACKAGE_VERSION}"
MAINTAINER="Greenbone Vulnerability Manager  <${MAINTAINER_EMAIL}>"
PACKAGE_DATE=$(date "+%a, %d %b %Y %H:%M:%S %z")

USER_COMMENT="GVM Local Security Checks"
USER_COMMENT_GREP="GVM\\ Local\\ Security\\ Checks"

# Paths
PACKAGE_BASE_DIR="${TEMP_DIR}/${PACKAGE_NAME_VERSION}"

# Data paths
DATA_DIR="${PACKAGE_BASE_DIR}"
HOME_SUBDIR="home/${USERNAME}"
HOME_DATA_DIR="${DATA_DIR}/${HOME_SUBDIR}"
SSH_DATA_DIR="${HOME_DATA_DIR}/.ssh"
DOC_SUBDIR="usr/share/doc/${PACKAGE_NAME}"
DOC_DATA_DIR="${DATA_DIR}/${DOC_SUBDIR}"

# Control file path
CONTROL_DIR="${PACKAGE_BASE_DIR}/DEBIAN"

#
# Test dependencies
#
if [ -z "$(which dpkg)" ]
then
  echo "dpkg not found" >&2
  exit 1
fi

if [ -z "$(which fakeroot)" ]
then
  echo "fakeroot not found" >&2
  exit 1
fi

if [ -z "$(which md5sum)" ]
then
  echo "md5sum not found" >&2
  exit 1
fi

#
# Set up error handling
#
handle_error() {
  echo "DEB package generation failed" >&2
  exit 1
}
trap handle_error ERR

#
# Create data files
#

# Create .ssh directory
mkdir -p "${SSH_DATA_DIR}"

# Copy public key
AUTH_KEYS_FILE="${SSH_DATA_DIR}/authorized_keys"
cp "${PUBKEY_FILE}" "${AUTH_KEYS_FILE}"

# Create doc directory
mkdir -p "${DOC_DATA_DIR}"

# Create Changelog
cd "${DOC_DATA_DIR}"
CHANGELOG_FILE="${DOC_DATA_DIR}/changelog.Debian"
{
  echo "${PACKAGE_NAME} (${PACKAGE_VERSION}) experimental; urgency=low"
  echo ""
  echo "  * Automatically generated local security check credential package"
  echo "  "
  echo ""
  echo " -- ${MAINTAINER}  ${PACKAGE_DATE}"
} > "${CHANGELOG_FILE}"

# Compress Changelog
gzip -f --best "${CHANGELOG_FILE}"
CHANGELOG_FILE="${CHANGELOG_FILE}.gz"

# Create Copyright info
COPYRIGHT_FILE="${DOC_DATA_DIR}/copyright"
{
  echo "Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/"
  echo ""
  echo "Files: *"
  echo "Copyright: 2018-2020 Greenbone AG"
  echo "License: GPL-2+ (/usr/share/common-licenses/GPL-2)"
} > "${COPYRIGHT_FILE}"

# Create data archive
cd "${DATA_DIR}"
tar -C "${DATA_DIR}" -z -cf "../data.tar.gz" "${HOME_SUBDIR}" "${DOC_SUBDIR}"


#
# Create control files
#

# Create directory
mkdir -p "${CONTROL_DIR}"
chmod "0755" "${CONTROL_DIR}"

# Create "control" file
CONTROL_FILE="${CONTROL_DIR}/control"
{
  echo "Package: ${PACKAGE_NAME}"
  echo "Version: ${PACKAGE_VERSION}"
  echo "Maintainer: ${MAINTAINER}"
  echo "Priority: optional"
  echo "Architecture: all"
  echo "Description: GVM local security check preparation"
  echo " This package prepares a system for GVM local security checks."
  echo " A user is created with a specific SSH authorized key."
  echo " The corresponding private key is located at the respective"
  echo " GVM installation."
} > "${CONTROL_FILE}"

# Create "preinst" file run before installation
PREINST_FILE="${CONTROL_DIR}/preinst"
touch "${PREINST_FILE}"
chmod "0755" "${PREINST_FILE}"
{
  echo "#!/bin/sh"
  echo "set -e  # abort on errors"
  echo "useradd -c \"${USER_COMMENT}\" -d /home/${USERNAME} -m -s /bin/bash ${USERNAME}"
} > "${PREINST_FILE}"

# Create "postinst" file run after installation
POSTINST_FILE="${CONTROL_DIR}/postinst"
touch "${POSTINST_FILE}"
chmod "0755" "${POSTINST_FILE}"
{
  echo "#!/bin/sh"
  echo "set -e  # abort on errors"
  echo "chown -R ${USERNAME}:${USERNAME} /home/${USERNAME}"
  echo "chmod 500 /home/${USERNAME}/.ssh"
  echo "chmod 400 /home/${USERNAME}/.ssh/authorized_keys"
} > "${POSTINST_FILE}"

# Create "postinst" file run after removal or on error
POSTRM_FILE="${CONTROL_DIR}/postrm"
touch "${POSTRM_FILE}"
chmod "0755" "${POSTRM_FILE}"
{
  echo "#!/bin/sh"
  echo "# Remove user only if it was created by this package."
  echo "# The debian package will run the postun script in case of errors"
  echo "# (e.g. user already existed)."
  echo "# Delete the user only if /etc/passwd lists content that suggests"
  echo "# that the user was created by this package."
  # echo "set -e  # abort on errors"
  echo "grep \"${USERNAME}.*${USER_COMMENT_GREP}\" /etc/passwd && userdel -fr ${USERNAME}"
} > "${POSTRM_FILE}"

# Calculate md5 checksums
MD5SUMS_FILE="${CONTROL_DIR}/md5sums"
cd "${DATA_DIR}"
{
  md5sum "${HOME_SUBDIR}/.ssh/authorized_keys"
  md5sum "${DOC_SUBDIR}/changelog.Debian.gz"
  md5sum "${DOC_SUBDIR}/copyright"
} > "${MD5SUMS_FILE}"

#
# Build package
#

# Combine into .deb file
cd "${TEMP_DIR}"
fakeroot -- dpkg --build "${PACKAGE_NAME_VERSION}" "${OUTPUT_PATH}"

스크립트가 디렉토리를 생성 PACKAGE_BASE_DIR하고 두 번째 명령 인수의 파일을 해당 디렉토리로 이동한 후 압축되어 .deb 패키지로 컴파일된다는 것을 알고 있습니다. 그러나 .deb 패키지에는 "preinst", ".deb" postinstpostrm".deb"의 세 가지 실행 파일이 있습니다. 이 파일의 내용은 다음과 같습니다.

사전 설치됨:

#!/bin/sh
set -e  # abort on errors
useradd -c "GVM Local Security Checks" -d /home/testing -m -s /bin/bash testing

뒤쪽

#!/bin/sh
set -e  # abort on errors
chown -R testing:testing /home/testing
chmod 500 /home/testing/.ssh
chmod 400 /home/testing/.ssh/authorized_keys

그러나 이러한 명령 중 어느 것도 실제로 .deb 패키지에 포함된 파일을 새 사용자의 홈 디렉터리로 이동하지 않습니다. 맨페이지를 살펴봤지만 adduser이를 허용하는 기능을 볼 수 없습니다. 이는 단순히 프레임을 만드는 것이 아니라 실제로 파일을 이동하는 것입니다.

이것을 읽어보세요대답은 이 작업을 자동으로 수행하는 일부 기능을 가리키기를 바랐지만 그런 기능은 없습니다.

내 질문은 이러한 파일이 어떻게 이동되는지입니다. 새 사용자를 생성할 때 실제로 이동하는 명령은 없는 것 같지만 그렇습니다. 이 스크립트를 실행하면 사용자 또는 사용자 홈 디렉터리가 생성되지 않습니다. .deb 패키지만 출력합니다. .deb 패키지 스크립트에는 파일을 이동하는 명확한 방법이 없습니다.

PS 이 파일은 ChatGPT를 방해합니다. 계속해서 컴파일하고 실행하며 계속해서 충격을 받았습니다. 파일은 새 사용자의 홈 디렉터리로 이동됩니다.

답변1

@muru의 의견 덕분에 .deb 패키지가 Linux 파일 구조를 패키지 파일로 채우는 방법을 빠르게 이해할 수 있었습니다.

preinst스크립트 사이에서 postinst데비안 패키지 관리 시스템은 패키지 파일을 파일 시스템으로 추출하고, 패키지 구성 파일을 설정하고, 시스템의 패키지 관리 데이터베이스에 패키지를 등록하는 등 여러 작업을 수행합니다.

다음은 데비안 패키지를 설치할 때 발생하는 단계에 대한 일반적인 개요입니다:

  • 패키지가 임시 디렉터리에 추출됩니다. 스크립트 preinst가 실행되어 필요한 사전 설치 작업이 수행됩니다.
  • 패키지의 파일은 파일 시스템의 최종 위치에 복사됩니다.
  • 스크립트 postinst가 실행되어 필요한 설치 후 작업이 수행됩니다.
  • 패키지는 시스템의 패키지 관리 데이터베이스에 등록됩니다.
  • 시스템의 패키지 관리 데이터베이스가 새 패키지 설치를 반영하도록 업데이트되었습니다.
  • 패키지의 구성 파일이 설정되었습니다.

또는 패키지가 성공적으로 설치되면 시스템의 패키지 관리 도구를 사용하여 제거할 수 있습니다. 이 도구는 파일 시스템에서 패키지 파일을 제거하기 전후에 스크립트를 실행합니다 prerm.postrm

관련 정보