Launchd tidak memberikan apache (XAMPP) semua hak istimewa saat startup

0

Saya menggunakan Mac OS X dan menggunakan Launchd untuk secara otomatis memulai XAMPP. Saya telah menetapkan pengguna apache disetel sama dengan nama akun saya di httpd.conf

User cwd
Group nogroup

Nah, jika saya membiarkan komputer hidup, dan jika saya menjalankan skrip php dengan perintah ini, berikut adalah yang saya dapat

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

Namun, jika saya menghentikan XAMPP dan memulai kembali (menggunakan Kontrol XAMPP), maka itu berfungsi seperti yang diharapkan dan hasil baris ketiga adalah 1234.

echo exec('pbpaste'); // 1234

Saya juga memiliki pengalaman serupa dengan menjalankan perintah sistem lainnya exec atau shell_exec seperti ssh. Tampaknya tidak berfungsi sampai saya me-restart apache secara manual. Apakah ada yang punya pemikiran tentang ini?

Ini file konfigurasi peluncuran saya:

/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>
cwd
sumber

Jawaban:

2

Ini bukan hal yang istimewa, itu karena pbcopy dan pbpaste memerlukan server pasteboard (pada dasarnya, program latar belakang yang memegang pasteboard), dan itu dijalankan sebagai bagian dari sesi login pengguna. launchd menjalankan apache dalam konteks sistem, jadi tidak ada server pasteboard yang tersedia (perhatikan bahwa meskipun apache mengalihkan pengguna ke cwd, itu tidak sama dengan bergabung dengan sesi login Anda).

Mungkin ada cara untuk bergabung dengan sesi login tertentu (melibatkan launchctl bsexec ), tetapi untuk layanan web ini akan menjadi ide yang buruk. Pertama, karena itu tidak akan dapat bergabung sampai Anda masuk, dan akan pecah segera setelah Anda keluar; layanan web benar-benar harus berjalan secara independen dari siapa yang masuk pada saat itu. Kedua, karena itu berarti skrip php Anda berbagi papan tulis dengan sesi pengguna Anda - Anda akan menyalin sesuatu dari satu program ke program lain, dan menemukan Anda menempelkan sesuatu dari skrip web, bukan apa yang Anda salin . Dan hal yang sama dapat terjadi pada skrip - itu membuat sesuatu, lalu mengembalikan sesuatu yang sama sekali berbeda karena Anda menggunakan salinan dari GUI. Dan jika banyak salinan skrip berjalan, mereka bisa saling menginjak ... itu akan berantakan total. Saya tidak yakin apa yang ingin Anda capai dengan pbcopy dan pbpaste, tapi saya cukup yakin itu cara yang salah untuk melakukannya.

Gordon Davisson
sumber
Saya menjalankan XAMPP di laptop saya sebagai mesin pengembangan. Ini tidak dapat diakses oleh dunia dan jadi tidak ada masalah keamanan. Saya juga tidak peduli jika tidak tersedia setelah saya keluar. Saya benar-benar menggunakan pengaturan ini sehingga saya bisa meminta pbcopy mengatur clipboard ke output dari skrip PHP, jadi saya kemudian dapat menggunakan data sendiri. Saya akan sangat tertarik mengetahui cara menggunakan opsi bsexec untuk menjalankannya sesuai kebutuhan :)
cwd
Ini tidak akan menjadi sangat mudah, karena Anda harus menjalankan sebagai root untuk menggunakan launchctl bsexec, dan pada saat skrip PHP Anda dijalankan itu sudah dihapus root dan berjalan sebagai cwd. Jadi, Anda harus meluncurkan seluruh server apache dalam konteks sesi login Anda. Saya pikir Anda harus menulis skrip pembungkus yang menunggu Anda untuk masuk, kemudian jalankan `launchctl bsexec $ (ps ax | grep [l] oginwindow | cut -c 1-5) / Aplikasi / XAMPP / xamppfiles / xampp startmysql ', dan modifikasi launchd.plist untuk menjalankan skrip itu alih-alih menjalankan xampp secara langsung.
Gordon Davisson
Terima kasih, Gordon. Meskipun rumit, ini menjelaskan fenomena yang saya alami dan membantu mengarahkan saya ke arah yang benar untuk menemukan solusi yang tepat. Untuk saat ini saya telah menggunakan applescript yang berjalan saat startup ( withoutink.com/technology/howto-autostart-xampp-mac-osx ) untuk meluncurkan XAMPP. Ini bukan cara yang tepat untuk melakukannya, dan downside adalah bahwa password saya dikodekan dengan keras di dalam skrip, tetapi tampaknya berhasil. Ini jauh lebih mudah daripada menghentikan dan memulai ulang XAMPP menggunakan aplikasi Kontrol XAMPP setiap kali (berfungsi dengan baik ketika saya melakukannya). Saya akan melihat menggunakan bsexec.
cwd