У меня очень странное поведение при запуске скрипта, который должен монтировать зашифрованный раздел, когда он выполняется 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()
успешно получил файл, так что здесь не так?
С уважением,