Я использую php для выполнения скрипта на моем сервере.
PHP: exec("screen -dmS testingscreen /home/username/otherfolder/test.sh")
Какое-то время я не мог этого сделать, пока я не покопался и не нашел несколько вещей о том, как это сделать. Я также нашел некоторые вещи о других вещах, связанных с экранами / незначительными проблемами, которые у меня были в то же время.
Я покажу каждую проблему, которая была у меня в деталях, до последней, которую, похоже, я не могу исправить.
Проблема первая (решена): Попытка запустить скрипт вне webroot.
Тема: Извините сценарий вне рута с помощью PHP.
Решение: Используется sudo chown www-data:www-data filename.sh
предоставив моему веб-пользователю доступ к сценарию.
Проблема вторая (решена): скрипт ничего не делает, когда php-файл вызывает его.
Решение: сделать скрипт исполняемым с chmod +x filename.sh
Примечания: было до боли очевидно, что я сделал неправильно, когда использовал ls
в моем сценарии реж.
Проблема третья (решено): Невозможно выполнить su для www-data, чтобы проверить, работают ли экраны.
Ошибка: эта учетная запись в настоящее время недоступна.
Проблема: www-data был установлен на /bin/nologin
в /etc/passwd
Решение: chsh -s /bin/bash www-data
чтобы сделать так, чтобы я мог переключиться на него как пользователь.
Вопрос четвертый (решен): в то время как в su www-data
не мог использовать screen -r testingscreen
Ошибка: не удается открыть ваш терминал ‘/ dev / pts / 0’ — проверьте.
Проблема: разрешения, не открывающий экран под учетной записью и пытающийся использовать учетную запись su.
Решение: Использование script /dev/null
в терминале, прежде чем пытаться screen -r testingscreen
,
Проблема пятая (не решена):
Во время выполнения screen -dmS testingscreen /home/username/anotherfolder/filename.sh
С php exec()
делает экран testingscreen
У меня есть строка в файле сценария, которая говорит
screen -dmS scriptscreen mono '/home/username/otherfolder/myprogram.exe' 'programargs1' 'programargs2' 'args3' 'args4'
Этот экран не запускается при выполнении сценария «filename.sh»
Однако выполнение этой же строки как пользователя www-data (Использование sudo su www-data
быть тем пользователем.) отлично работает.
Также примечание: Бег screen -dmS testingscreen /home/username/otherfolder/test.sh
работает абсолютно нормально и запускается как следует scriptscreen
, Это работает при использовании sudo su www-data
но не, если я запускаю скрипт с php.
На более странной стороне этого, используя screen -dmS testingtop top
работает нормально, когда внутри файла скрипта, который запускается php. Я что-то упускаю здесь очевидное?
Я проверил права доступа к файлам, и все в порядке, оно должно работать. Возможность запускать мою программу как www-data означает, что перманент настроен нормально. Просто кажется, что это как-то связано с php или моим сервером в целом. Любая помощь или возможные советы приветствуются, и я надеюсь, что мое подробное описание проблемы и решения может помочь другим в будущем в одном посте.
Поскольку вы вызываете sudo как часть вашего вопроса, я предполагаю, что это попытка заставить PHP выполнить скрипт с правами root?
Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash. Получи это здесь: https://github.com/merlinthemagic/MTS
После загрузки вы просто используете следующий код:
//if I misunderstood your question and the script does not require
//root permissions you can change the
//second argument on getShell() to false. That will return a bash shell
//with permissions from www-data.
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1 = $shell->exeCmd('/home/username/otherfolder/test.sh');
Других решений пока нет …