Скрипт Bash вызывается из дома, но не из каталога скриптов

У меня очень странная ошибка при попытке сделать скрипт вызываемым. У меня есть каталог скриптов в / srv / projectname / scripts, где я храню известные вам скрипты, которые будут называться заданиями cron для разных проектов. Я пытаюсь добавить новый и вижу очень странное поведение. При отладке я воспроизвожу его с помощью этого набора команд

из / srv / projectname / scripts создать файл создать файл

vi helloworld.sh

вставить текст точно:

#!/usr/bin/env bash

echo "Hello World!"

Сделайте скрипт исполняемым и попробуйте вызвать его:

chmod +x helloworld.sh
./helloworld.sh

, что дает:

-bash: ./helloworld.sh: Permission denied

Убедитесь, что нет ошибки кода:

bash helloworld.sh

Что дает:

Hello World!

Скопируйте сценарий на дом и назовите его:

cp helloworld.sh ~/helloword.sh
~/helloword.sh

Что дает:

Hello World!

Я понятия не имею, что происходит на. Я перепробовал множество вариантов, в которых я указываю полный путь, ту же ошибку, или если я sudo, который не выдает ошибку, но также не выводит «Hello World!».

Другие подробности: Работа на: Ubuntu 12.04.4 LTS Я также заметил, что не могу завершить табуляции до полного имени скрипта, который выдает мне эту ошибку, но я могу это сделать, как только переместил его. Каталог / srv / projectname является git-репозиторием, но этот скрипт еще не добавлен в него, потому что я обычно делаю это только один раз, когда он работает.

Строки ls -l для каталога script и scripts:

-rwxrwxr-x 1 ubuntu ubuntu     41 Apr 21 20:25 helloworld.sh
drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 21 20:25 scripts

соответственно

Любая помощь будет отличной.

РЕДАКТИРОВАТЬ: Жиль был ответ. Чтобы спасти любого, у кого есть эта проблема, поиск в Google.

sudo mount /srv/projectname/ -o remount

перезагружает отредактированный fstab, и все снова работает.

4
задан 22 April 2014 в 07:02

1 ответ

В полномочиях файла говорится, что это - исполняемый файл, все же файл не является исполняемым файлом. Существует три причины, почему это может произойти.

  • Вы не вырыли достаточно глубоко в полномочия файла — существует список управления доступом, который делает неисполняемый файл файла Вам. Вы видите ACL файла с командой getfacl /path/to/file. Дело обстоит не так здесь с тех пор ls -l шоу, что нет никакого ACL на файле (был бы a + в конце полномочий, например. -rwxr-xr-x+).
  • Файл хранится на объеме, который смонтирован с noexec опция. Эта опция подразумевается при наличии users в fstab строка (если Вы хотите сделать файловую систему монтируемой пользователем и позволить пользователям выполнять файлы на нем, использовать noauto,users,exec). Эта опция монтирования заставляет все регулярные файлы быть неисполняемым файлом независимо от своих полномочий.
  • Файл является сценарием, который ссылается на интерпретатор, который не является исполняемым файлом в его строке хижины или динамично связанным двоичным файлом, который ссылается на динамический загрузчик, который не является исполняемым файлом. Это не имеет место здесь, учитывая, что копирование файла приводит к файлу, который можно выполнить (и /usr/bin/env исполняемый файл так или иначе).

Процессом устранения файл находится на объеме, смонтированном с noexec опция.

Единственные обходные решения:

  • Не монтируйте объем с noexec опция. Эта опция не имеет никаких последствий безопасности (в отличие от этого, nosuid и nodev, которые делают). Это главным образом полезно для файловых систем без понятия, выполняют полномочия, где Вы добираетесь для выбора между созданием всего исполняемого файла или ничего.
  • Скопируйте файл прежде, чем выполнить его.
  • Использование, которое связывание монтирует или bindfs для создания представления файловой системы, где исполняемые файлы являются исполняемым файлом.
  • Вызовите интерпретатор или динамический загрузчик явно, например, здесь bash helloworld.sh. Это не выполняется helloworld.sh, это выполняется /bin/bash который читает из helloworld.sh.
5
ответ дан 22 April 2014 в 07:02

Другие вопросы по тегам:

Похожие вопросы: