/usr/bin / env: php: нет такого файла или каталога

я хочу использовать .sh-скрипт для развертывания моего приложения. Этот скрипт находится на моем домашнем сервере (Ubuntu 15.10 Server), помечен как исполняемый. Доступ к этому скрипту осуществляется через ssh, используя этой учебник, я установил ssh логин, который запускает этот скрипт. Так что в основном я просто звоню ssh deployer@XXX.com someArguments и он запускает мой скрипт с someArguments как параметры. Пользователь deployer имеет uid=0, поэтому его в основном root (это будет изменено в будущем, я установил его только для устранения разрешения проблемы, пока он не работает нормально).

и вот где все становится сложнее. Скрипт сообщает /usr/bin/env: php: No such file or directory в команде /bin/composer install (через Composer). Чем больше я смотрю на этот сценарий, тем больше странностей. Перед этой строкой также стоит /bin/composer self-update и /bin/composer -V, которое и бежит правильно и показывает правильный выход.

я проверил следующие вещи:

  • /usr/bin/env php -v отображает правильную версию PHP (так же, как /usr/bin/php -v)
  • whereis php выводит php: /usr/bin/php /usr/local/bin/php /usr/share/man/man1/php.1.gz
  • php5-cli пакет установлен и самая новая версия
  • $PATH содержит /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
  • which env выводит /usr/bin/env

я также пробовал следующие вещи:

  • запуск скрипта непосредственно как bash deploy.sh под root (так как он такой же, как этот пользователь) - отлично работает без ошибок
  • запуск неудачных команд напрямую-также отлично без ошибок

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

П. С.: аналогичная ошибка (/usr/bin/env: node: No such file or directory) возникает, когда есть bower install (через Bower), но не при работе npm install (через NPM).

18
задан Tomáš Blatný
25.03.2023 18:49 Количество просмотров материала 2395
Распечатать страницу

6 ответов

убедитесь, что окончания строк и / или невидимые пробелы не вызывают проблему.

удалите пробелы в первой строке скрипта и вставьте новые, не удерживая нажатой клавишу CTRL.

кроме того, убедитесь, что у вас нет окончания строк DOS (CR+LF). См https://stackoverflow.com/questions/82726/convert-dos-line-endings-to-linux-line-endings-in-vim для сведения.

5
отвечен neuhaus 2023-03-27 02:37

самый простой способ.... измените оболочку пользователя как сценарий.

/ etc / passwd

Before:
deploy:x:0:0:,,,:/root:/bin/bash

After:
deploy:x:0:0:,,,:/root:/scripts/deploy.sh

пример скрипта (убедитесь, что установлен бит execute chmod +x)

/scripts/deploy.sh

#!/bin/bash 
PATH=$PATH:/moo etc...
moo.sh

Sample Работает каждый раз! Вы должны даже быть в состоянии использовать скрипт для диагностики/отладки переменных окружения, которые вы можете чувствовать обнуляются и т. д... также аргументы обработки, передаваемые в ssh, будут работать как ну..

Примечание: его лучшая практика всегда полные пути для всех скриптов, исполняемых файлов и т. д.. Выше приведен пример, который позволяет установить путь по умолчанию для вызова moo.sh в папке moo;)

Это было легко.. Спасибо за сообщение..

ссылки: /etc/passwd format

4
отвечен NotAdmin Dave 2023-03-27 04:54

env команда будет смотреть через пользователя $PATH для поиска первого исполняемого файла с заданным именем. Итак,/usr/bin/env php будет искать исполняемый файл с именем php в любом из каталогов в $PATH пользователя, запустившего его.

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

ssh deployer@XXX.com 'echo $PATH'

и сравнивая вывод с тем, что вы получите, если вы ssh deployer@XXX.com и затем run echo $PATH. На моей системе. например:

$ echo $PATH
/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:

$ ssh localhost 'echo $PATH'
/usr/bin:/bin:/usr/sbin:/sbin

таким образом,$PATH что ваш скрипт имеет доступ к При запуске с ssh deployer@XXX.com не то же самое, что при входе в систему, чтобы проверить его.

в любом случае, самое простое решение-использовать полный путь к интерпретатору, а не env. Оба env и полные пути у их преимущества и недостатки но, в данном случае, путь безопаснее:

#!/usr/bin/php
4
отвечен terdon 2023-03-27 07:11

возможно bash необходимо сбросить его хэш-таблицу?

если да, попробуйте добавить hash -r где-то в вашем скрипте, который заставляет оболочку просматривать $PATH опять же, вместо того, чтобы полагаться на (возможно, устаревшую) информацию из хэш-таблицы.

при необходимости hash также может позволить оболочке запоминать пути к исполняемым файлам, установленным в нестандартных местах, используя -p вариант, или забыть пути с -d опцион.

источники:

https://unix.stackexchange.com/a/86017/121251

https://stackoverflow.com/a/22543353/2146843

2
отвечен flyingfinger 2023-03-27 09:28

Похоже, вам нужно добавить php в свой путь. Попробуйте:

vim ~/.bashrc
PATH=$PATH:/usr/local/bin/php
export PATH

вы также можете проверить, где живет ваш php, чтобы убедиться, что путь правильный. Попробуйте:

which php
1
отвечен Jeramy 2023-03-27 11:45

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

Первое, что нужно сделать, чтобы подтвердить, что у вас есть проблема с путем, - это обновить сценарий развертывания для регистрации вывода env или хотя бы echo $PATH. Я предполагаю, что способ, которым вызывается ваш сценарий развертывания, $PATH не задан так, как вы ожидали бы. Этот отладочный вывод подтвердит / опровергнет мою теорию.

Я посмотрел на учебник вы следовали. Вероятно, вы должны убедиться в обновлении command= на command="/bin/sh /path/to/your/script..." если вы еще не убедились, что ваш скрипт запущен правильной оболочкой.

если у вас есть проблема с путем, быстрое/грязное исправление-это просто явно задать путь в начале сценария развертывания.

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

подробное объяснение и дополнительные опции...

в Linux при выполнении команд они наследуют окружение своих родителей процесс.

когда вы входите в систему как обычный пользователь через SSH, есть вещи, которые происходят (например, запуск /etc /bashrc/etc /profile~/.файл ~/.bashrc и т. д.). В этот момент Вы, возможно, обновили среду вашего процесса, выполнив такие действия, как export PATH="$PATH:~/mybin" в эти скрипты. Теперь все будущие процессы, которые вы запускаете, наследуют вашу текущую среду.

выполнение команды вместо получения оболочки входа означает, что команда выполняется демоном ssh и наследует среды процесса СШ...что, скорее всего, отличается от вашей среды в качестве зарегистрированного пользователя.

страница man для авторизованных ключей охватывает то, что происходит после аутентификации. Относительно окружающей среды:

  1. считывает файл ~/.ssh/среда, если она существует, и пользователи разрешено менять свое окружение. Увидеть Опция PermitUserEnvironment в sshd_config(5).

Итак, подходящее место, чтобы настроить среду для процесса ~/.ssh/environment здесь ~ - домашний каталог пользователя, прошедшего проверку подлинности для выполнения команды. Вам также необходимо проверить sshd_config, чтобы убедиться, что PermitUserEnvironment разрешен.

~/.ssh/environment формат также указан в man-странице, конечно.

         This file is read into the environment at login (if it exists).
         It can only contain empty lines, comment lines (that start with
         '#'), and assignment lines of the form name=value.  The file
         should be writable only by the user; it need not be readable by
         directory becomes accessible.  This file should be writable only
         by the user, and need not be readable by anyone else.

альтернативный способ указать окружение без использования вышеуказанного упомянутый метод заключается в использовании environment="NAME=value" опция в файле authorized_keys. Подробнее см. man-страницу, которую я связал выше.

1
отвечен mattpr 2023-03-27 14:02

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

bash
linux
php
ssh
ubuntu
Вверх