Файл bash выполняется частично после команды awscli [duplicate]

У меня был случай, когда я случайно начал разворачивать каталог файлов в корне. Он добавил файл .htaccess из моей папки с файлами, который блокирует все php

# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
  php_flag engine off
</IfModule>

. Нижняя строка проверяет файл .htaccess на root.

207
задан slm 24 November 2014 в 17:51
поделиться

2 ответа

В ядре встроена функция встроенной команды exec, есть семейство из них на основе execve, которое обычно вызывается из C.

exec заменяет текущую программу в текущем процессе, без fork нового процесса. Это не то, что вы будете использовать в каждом скрипте, который вы пишете, но иногда это пригодится. Вот некоторые сценарии, которые я использовал:

  1. Мы хотим, чтобы пользователь запускал определенную прикладную программу без доступа к оболочке. Мы могли бы изменить программу входа в / etc / passwd, но, возможно, мы хотим, чтобы настройки среды использовались из файлов запуска. Итак, в (скажем) .profile последнее утверждение говорит что-то вроде:
     exec appln-program
    
    , поэтому теперь нет оболочки для возврата. Даже если appln-program выходит из строя, конечный пользователь не может попасть в оболочку, потому что его нет - exec заменил его.
  2. Мы хотим использовать другую оболочку для той, которая находится в / etc / пароль. Как ни странно, некоторые сайты не позволяют пользователям изменять свою панель входа. Один из сайтов, который я знаю, начинал с csh, и все просто вставляли в .login (файл запуска csh) вызов ksh. В то время как это сработало, он оставил запущенный процесс csh, и выход был двухступенчатым, что могло запутать. Поэтому мы изменили его на exec ksh, который только что заменил программу c-shell оболочкой korn, и сделал все проще (есть другие проблемы с этим, например, тот факт, что ksh не является оболочкой входа).
  3. Просто для сохранения процессов. Если мы назовем prog1 -> prog2 -> prog3 -> prog4 и т. Д. И никогда не вернемся, сделайте каждый вызов exec.

Вы, очевидно, видели, что exec используется где-то, возможно, если вы показали код, который прослушивает вас, мы могли бы оправдать его использование.

Изменить: я понял, что мой ответ выше неполный. В оболочках, таких как ksh и bash, используются два варианта использования exec - для открытия дескрипторов файлов. Вот несколько примеров:

exec 3< thisfile          # open "thisfile" for reading on file descriptor 3
exec 4> thatfile          # open "thatfile" for writing on file descriptor 4
exec 8<> tother           # open "tother" for reading and writing on fd 8
exec 6>> other            # open "other" for appending on file descriptor 6
exec 5<&0                 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4                 # copy write file descriptor 4 onto 7
exec 3<&-                 # close the read file descriptor 3
exec 6>&-                 # close the write file descriptor 6

Обратите внимание, что интервал очень важен. Если вы поместили пробел между номером fd и символом перенаправления, то exec вернется к исходному значению:

  exec 3 < thisfile       # oops, overwrite the current program with command "3"

Существует несколько способов использования этих параметров: ksh use read -u или print -u, на bash, например:

read <&3
echo stuff >&4
235
ответ дан Matthias Braun 21 August 2018 в 07:18
поделиться
  • 1
    есть и другое использование, которое я нашел довольно удобным и заслуживающим упоминания здесь, потому что оно относится к веб-приложениям python и кажется чем-то между вашими (удивительными) ответами 2 и 3. Я обычно запускаю wsgi-приложения (например, django или flask) через supervisor , вызвав приложение gunicorn : последнее заведомо требует довольно много переменных окружения, это проще и удобнее обслуживать запуск пушки из сценария оболочки, который устанавливает все, и в конечном итоге exec gunicorn дает правильные pid обратно к супервизору. – gru 8 February 2015 в 18:21
  • 2
    Документы говорят, что exec можно использовать для перенаправления: & gt; Если команда не указана, любые переадресации вступают в силу в текущей оболочке, а статус возврата равен 0. Если есть ошибка перенаправления, статус возврата равен 1. Но как действительно работает exec изменить файловый дескриптор? Почему эта конкретная команда выбрана для этой задачи? (Markdown не работает прямо сейчас?) – Ray 20 March 2015 в 00:34
  • 3
    @Ray: лучше всего я могу это сделать: pubs.opengroup.org/onlinepubs/009604599/utilities/exec.html . Если вам нужно знать, как посмотреть на исходный код оболочки. – cdarke 20 March 2015 в 17:43
  • 4
    Другое использование: Перенаправить все выходные данные скрипта в файл журнала exec >.\logfilename.log 2>&1 – Hogan 15 April 2015 в 18:26
  • 5
    Да, это означает выполнение команды, указанной в командной строке. Посмотрите на переменную @ в man bash. exec заменяет текущую программу новым, опять же, поиском exec на страницах руководства. – cdarke 7 July 2016 в 07:55

Чтобы увеличить принятый ответ с кратким кратким ответом на новичок, вам, вероятно, не понадобится exec.

Если вы все еще здесь, следующее обсуждение должно, мы надеемся, объяснить, почему. Когда вы запустите, скажем,

sh -c 'command'

, вы запустите экземпляр sh, а затем запустите command в качестве дочернего экземпляра этого экземпляра sh. Когда command заканчивается, экземпляр sh также заканчивается.

sh -c 'exec command'

запускает экземпляр sh, затем заменяет , что экземпляр sh с command бинарный, и вместо этого выполняется.

Конечно, обе эти функции бесполезны в этом ограниченном контексте; вы просто хотите

command

. Есть некоторые ситуации, в которых вы хотите, чтобы оболочка считывала свой файл конфигурации или каким-то иным образом настраивала среду в качестве подготовки к запуску command. Это в значительной степени единственная ситуация, когда полезен exec command.

#!/bin/sh
ENVIRONMENT=$(some complex task)
exec command

Это делает некоторые вещи для подготовки среды, чтобы она содержала то, что необходимо. Как только это будет сделано, экземпляр sh больше не нужен, и поэтому (небольшая) оптимизация просто заменит экземпляр sh на процесс command, а не sh запустит его как дочерний процесс и дождитесь его, а затем выйдите, как только он закончится.

Точно так же, если вы хотите высвободить как можно больше ресурсов для тяжелой команды в конце скрипта оболочки, вы можете захотеть exec, что команда в качестве оптимизации.

Если что-то заставляет вас запускать sh, но вы действительно хотели запустить что-то еще, exec something else, конечно, обходным путем для замены нежелательного экземпляра sh (например, например, если вы действительно хотели запустить свой собственный spiffy gosh вместо sh, но ваш не указан в /etc/shells, поэтому вы не можете указать его как свою оболочку входа.)

Второе использование exec для управления файловыми дескрипторами - отдельная тема. В принятом ответе это хорошо сказано; чтобы сохранить это самодостаточным, я просто отнесусь к руководству для чего-либо, где за exec следует перенаправление вместо имени команды.

27
ответ дан tripleee 21 August 2018 в 07:18
поделиться
  • 1
    Сопротивление соблазну называть ваш собственный spiffy shell bush. Конечно, это относится к bash или вообще к любой популярной оболочке Unix; хотя как @anishsane отмечает , Баш тайно оптимизирует bash -c 'command', фактически делая exec command. – tripleee 26 July 2016 в 05:21
  • 2
    Код выхода оболочки обычно является кодом выхода последней выполненной команды. Конечно, если оболочка не запускается или для выполнения команды, статус выхода оболочки будет отражать это с подходящим кодом ошибки. – tripleee 26 July 2016 в 05:25
  • 3
    @JonathanLeffler Я намеренно документирую антипаттерн, который я вижу в вопросах новичков. Это было вызвано этим дубликатом , но я видел это раньше, поэтому я хотел особо рассмотреть это. – tripleee 26 July 2016 в 06:07
  • 4
    @JonathanLeffler Незначительная формулировка настроек; это достаточно, как вы думаете? Спасибо за ответ. – tripleee 26 July 2016 в 06:12
  • 5
    Спасибо. Я добавил еще один краткий параграф об этой оптимизации. Для меня это не совсем понятно, если у вас есть другие возражения, или если вы просто хотите объяснить вещи под другим углом. – tripleee 26 July 2016 в 06:30
Другие вопросы по тегам:

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