Я использую Mac OS X и использую Launchd для автоматического запуска XAMPP. Я установил, что пользователь apache настроен так же, как имя моей учетной записи в httpd.conf

User cwd
Group nogroup

Что ж, если я просто позволю компьютеру загрузиться, и если я выполню скрипт php с этими командами, вот что я получу:

echo exec('whoami'); //cwd
exec('echo 1234 | pbcopy');
echo exec('pbpaste'); // (nothing)

Однако, если я остановлю XAMPP и перезапущу его (используя элемент управления XAMPP), он будет работать, как и ожидалось, и результат третьей строки будет 1234.

echo exec('pbpaste'); // 1234

У меня также есть подобный опыт запуска других системных команд с exec или shell_exec таких как ssh . Кажется, они не работают, пока я не перезапущу apache вручную. У кого-нибудь есть мысли по этому поводу?

Вот мой конфигурационный файл запуска:

/Library/LaunchDaemons/xampp.sql.startapache.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnableTransactions</key>
<true/>
<key>Label</key>
<string>xampp.startapache.mysql</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/XAMPP/xamppfiles/xampp</string>
<string>startmysql</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/Applications/XAMPP/xamppfiles</string>
<key>KeepAlive</key>
<false/>
<key>AbandonProcessGroup</key>
<true/>
</dict>
</plist>

1 ответ1

2

Это не привилегия, это потому, что pbcopy и pbpaste нужен сервер для монтажа (обычно это фоновая программа, которая содержит монтажный стол), и он запускается как часть сеанса входа пользователя в систему. launchd запускает apache в системном контексте, поэтому нет доступного сервера монтажа (обратите внимание, что хотя apache переключает пользователей на cwd, это не то же самое, что присоединение к сеансу входа в систему).

Может быть способ присоединиться к определенному сеансу входа в систему (включая launchctl bsexec), но для веб-службы это было бы плохой идеей. Во-первых, потому что он не сможет присоединиться, пока вы не войдете в систему, и сломается, как только вы выйдете из системы; веб-сервис действительно должен работать независимо от того, кто вошел в систему в данный момент. Во-вторых, потому что это означало бы, что ваши php-скрипты делят монтажную панель с вашим пользовательским сеансом - вы захотите скопировать что-то из одной программы в другую и обнаружите, что вставляете что-то из веб-скрипта, а не то, что копировали. , И то же самое может произойти со сценарием - он копирует что-то, а затем вставляет обратно что-то совершенно другое, потому что вы случайно использовали копию из GUI. И если бы выполнялось несколько копий сценария, они могли бы наступить друг на друга ... это было бы полным беспорядком. Я не уверен, что вы пытаетесь достичь с помощью pbcopy и pbpaste, но я уверен, что это неправильный способ сделать это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .