Не удается правильно смонтировать зашифрованный раздел из сценария оболочки, выполняемого php - PullRequest
0 голосов
/ 18 октября 2019

У меня очень странное поведение при запуске скрипта, который должен монтировать зашифрованный раздел, когда он выполняется php (5.6). (И Fat-free Framework, но это не проблема)

Во-первых, чтобы избежать проблем с разрешениями, я добавил следующую строку в visudo:

www-data ALL=(ALL) NOPASSWD:ALL

Мой сценарий оболочкивот это:

#!/bin/sh


# Verify the command line args number (only one is admitted).
if [ $# -ne 1 ]; then
    echo "usage: $0 <passphrase>" >&2
    exit 1
fi

# If we run as root, ignore 'sudo' prefix.
if [ $(id -u) -eq 0 ]
then
    SUDO=""
else
    SUDO="sudo"
fi
echo $SUDO
# Get the block device name.
block_dev=$(dmesg | grep 'Attached SCSI' | tail -n1 | tr -d '[]'| awk '{print $4}')
if [ "$block_dev" = "" ]
then
    echo "Unable to find a USB key" >&2
    echo "KO"
    exit 1
fi

# Umount already mounted USB mass storage partition if any.
${SUDO} umount "/dev/${block_dev}"? >/dev/null 2>&1

# Check the block device is really here.
if [ ! -b "/dev/$block_dev" ]
then
    echo "USB key removed." >&2
    echo "KO"
    exit 1
fi

# Check the second partition exists.
if [ ! -b "/dev/${block_dev}2" ]
then
    echo "Invalid USB key partitionning." >&2
    echo "KO"
    exit 1
fi

# Default value for the mapping name if not provided as environment parameter.
MAPPING_NAME="${MAPPING_NAME-cryptoblock}"
echo $MAPPING_NAME
# Umount already mounted mapper if any.
${SUDO} umount "/dev/mapper/$MAPPING_NAME" >/dev/null 2>&1

# Check if the mapper already exists.
if [ -b "/dev/mapper/$MAPPING_NAME" ]
then
    # Remove the crypto loopback.
    ${SUDO} cryptsetup  close  "$MAPPING_NAME"  
fi
echo crypto lock
# Establish the crypto loopback.
printf "$1" | ${SUDO} cryptsetup  --key-file=- --cipher aes-cbc-plain  open  "/dev/${block_dev}2" --type=plain  "$MAPPING_NAME"
if [ $? -ne 0 ]
then
    echo "Invalid encryption" >&2
    echo "KO"
    exit 1
fi

# Default value for the mount point if not provided as environment parameter.
MOUNT_POINT="${MOUNT_POINT-/mnt/usb}"
echo $MOUNT_POINT
# Mount the second (encrypted) partition.
${SUDO} mount -t vfat /dev/mapper/"$MAPPING_NAME" "${MOUNT_POINT}" -o "rw,nosuid,nodev,shortname=mixed,uid=1000"
if [ $? -ne 0 ]
then
    ${SUDO} cryptsetup close "$MAPPING_NAME"
    echo "Invalid passphrase" >&2
    echo "KO"
    exit 1
fi

# Everything seems correct.
sleep 0.5
echo "OK"
exit 0

И это прекрасно работает, когда я запускаю его прямо из оболочки. ls /mnt/usb/ дает мне содержимое папки, и я могу читать файлы и записывать в них.

Теперь у меня есть скрипт php, который содержит следующее:

    $cmd = './mount_usb_lock.sh ' . $this->f3->get('badge.AES') .' 2>&1';
    $ret = exec($cmd, $output);
    $badge = file_get_contents('/mnt/usb/file.lck');
    $this->console_log($badge);

И результат - мой файлcontent.

Позже я пытаюсь обновить содержимое файла с php:

                $badge = '\rmember_id: '. $member_id;
                file_put_contents('/mnt/usb/file.lck', $badge, FILE_APPEND);

И получаю следующую ошибку:

Internal Server Error
file_put_contents(/mnt/usb/file.lck): failed to open stream: Permission denied

Я также пытался написатьэто из сценария оболочки, выполняемого php, но результат тот же.

Странно то, что когда я выполняю ls /mnt/usb в оболочке, я не вижу ничего похожего, если раздел не был смонтирован.
Но file_get_contents() успешно получил файл, так что здесь не так?
С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...