このスクリプトは実際に新しいユーザーのディレクトリ構造をどのように生成しますか?

このスクリプトは実際に新しいユーザーのディレクトリ構造をどのように生成しますか?

以下に含まれるbashスクリプトを見ています。複数のコマンドライン引数を受け入れ、.debパッケージを生成します。sudo dpkg -i created-file.debこのコマンドを使用してパッケージを実行すると、新しいユーザーが作成され、新しいユーザーのホームディレクトリに2つのファイルが送信されたディレクトリが.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し、2番目のコマンド引数のファイルをそのディレクトリに移動した後、圧縮されて.debパッケージにコンパイルされることがわかります。ただし、.debパッケージには、「preinst」、「.deb」、postinstおよびpostrm「.deb」の3つの実行可能ファイルがあります。このファイルの内容は次のとおりです。

プレインストール済み:

#!/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スクリプト間で、postinstDebian パッケージ管理システムは、パッケージファイルをファイルシステムに抽出し、パッケージ構成ファイルを設定し、システムのパッケージ管理データベースにパッケージを登録するなど、いくつかのタスクを実行します。

以下は、Debianパッケージをインストールするときに発生する手順の一般的な概要です。

  • パッケージが一時ディレクトリに抽出されます。スクリプトpreinstが実行され、必要なプレインストール操作が実行されます。
  • パッケージ内のファイルはファイルシステムの最終位置にコピーされます。
  • スクリプトpostinstが実行され、必要なインストール後のタスクが実行されます。
  • パッケージはシステムのパッケージ管理データベースに登録されます。
  • システムのパッケージ管理データベースが新しいパッケージのインストールを反映するように更新されました。
  • パッケージの構成ファイルが設定されました。

または、パッケージが正常にインストールされたら、システムのパッケージ管理ツールを使用して削除できます。このツールは、ファイルシステムからパッケージファイルを削除する前後にスクリプトを実行しますprermpostrm

関連情報