#bash #chmod #permission-denied
#bash #chmod #отказано в разрешении
Вопрос:
Я пытаюсь имитировать процесс обновления с помощью скрипта.
Меня интересует только код выхода скрипта обновления ( 0
для успеха и любое другое значение для сбоя).
Я создал простой скрипт с именем update.sh
для имитации обновления:
#!/bin/bash
# 1=true, 0=false
success=1
if [ $success -eq 1 ] ; then
# Success.
exit 0
else
# Failure.
exit 1
fi
Чтобы имитировать загруженное обновление, я заархивировал update.sh
в файл с именем update-file.zip
.
Мой основной скрипт извлекает update-file.zip
и запускает update.sh
:
#!/bin/bash
# Create a fresh update folder.
rm -rfv /test/update amp;amp; mkdir /test/update
# Simulate download by copying zip file to that folder.
cp -rf /update-file.zip /test/update/
cd /test/update
unzip -o update-file.zip
# Make the update script executable.
updateFile="/test/update/update.sh"
chmod a x $updateFile
# Run the update.
/test/update/update.sh
if [ $? -ne 0 ] ; then
echo "update failed"
else
echo "update success"
fi
# Delete update folder.
rm -rfv /test/update
Однако, когда я запускаю свой основной скрипт (даже с sudo
), я получаю следующее сообщение об ошибке:
/test/update/update.sh: Permission denied
Даже использование сервиса (который использует root
для выполнения всего) не помогло, так как я все еще получал то же сообщение об ошибке.
Кажется, что chmod a x
не работает при запуске внутри скриптов, потому что, если я запускаю chmod a x /test/update/update.sh
на терминале, все работает нормально.
Всякий раз, когда chmod a x
запускается из скрипта, я получаю ошибки «Отказано в разрешении» при попытке запустить затронутый скрипт.
Что меня озадачивает, так это то, что при запуске ls -l /test/update/update.sh
я получаю следующее:
-rwxrwxrwx 1 root root 131 Sep 9 2020 /test/update/update.sh
Результат один и тот же, независимо от того, chmod a x
выполняется из терминала или скрипта.
Я включен Ubuntu Server 20.04.1 LTS (Focal Fossa)
.
Комментарии:
1. Пожалуйста, попробуйте
cat -v /test/update/update.sh
из вашего скрипта раньше/test/update/update.sh
и подтвердите, что это действительно содержимое вашего скрипта?2. Хорошо, дай мне несколько минут.
3. Также, пожалуйста, проверьте, нет ли в вашем файле окончаний строк dos. Работает ли явный запуск
bash /test/update/update.sh
?4. Также проверю ваш второй комментарий и вернусь с результатами. 🙂
5. @KamilCuk Я немного смущен результатами. Добавление
cat -v /test/update/update.sh
по какой-то причине решило проблему. Затем я удалил это и попробовалbash /test/update/update.sh
, что также решило проблему. Я выберу этотbash
вариант, потому что это имеет больше смысла, но мне интересно, почему он сработал, несмотря на то, что#!/bin/bash
уже присутствует вupdate.sh
. Также, пожалуйста, добавьте это в качестве ответа, чтобы я мог его принять. 🙂
Ответ №1:
Вы можете явно запустить интерпретатор для файла:
bash /test/update/update.sh
Тогда нет необходимости делать файл исполняемым.
Ответ №2:
Не могли бы вы использовать
/bin/bash /test/update/update.sh
вместо
/test/update/update.sh
в скрипте.
Не могли бы вы также один раз предоставить вывод приведенной ниже команды.
ls -ld / тест / обновление
Комментарии:
1. Привет, спасибо за ваш ответ! Это тоже должно сработать, но я уже принял предыдущий ответ ранее. Большое спасибо, что поделились! 🙂