Akhirnya saya menyelesaikannya. Terima kasih kepada @JimB, karena dalam komentarnya dia menunjukkan SUEXEC, yang tidak saya ketahui (atau diabaikan begitu saja sampai sekarang).
Setelah membaca sedikit dokumentasi suEXEC, saya mengerti bahwa masalahnya ada di sana. Jadi, saya melihat konfigurasinya:
# suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=1000
-D AP_HTTPD_USER="apache"
-D AP_LOG_SYSLOG
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=1000
-D AP_USERDIR_SUFFIX="public_html"
dan semuanya tampak Ok (uid/gid bagus untuk pengguna saya, userdir_suffix baik-baik saja, dll). Jadi saya melihat log sistem:
# journalctl -b | grep "suexec"
May 22 11:43:12 caladan suexec[5397]: uid: (1000/user) gid: (1000/user) cmd: test.cgi
May 22 11:43:12 caladan suexec[5397]: directory is writable by others: (/home/user/public_html/cgi-bin)
dan itu masalahnya:cgi-bin
saya direktori dapat ditulis oleh orang lain .
Saya memperbaikinya hanya dengan mengubah izin menjadi 755
.
Ini terkadang muncul ketika Anda mencoba memanggil metode modul Python lain dari cgi Anda di mana Anda mungkin telah meninggalkan beberapa pernyataan 'cetak' (mungkin untuk debugging). Jadi, pindai kode Anda untuk menemukan pernyataan 'cetak' apa pun, terkadang ini menyelesaikan masalah dengan mudah.
Bagi saya, itu berhasil ketika saya mengubah garis shebang (#!/usr/bin/sh
) ke #!/usr/bin/env sh
. Saya menemukan bahwa ada garis shebang dari Apa yang disukai Bash shebang? tampaknya berfungsi (namun perhatikan bahwa sh
berbeda dengan bash
jadi jika Anda ingin menggunakan sh
tetap dengan itu).
Jadi kode ini bekerja untuk saya:
#!/usr/bin/env sh
echo "Content-type: text/plain"
echo ""
echo "Hello"
Juga, menurut posting yang disebutkan di atas, sepertinya /usr/bin/env sh
tampaknya lebih disukai daripada /bin/sh
. Saya tidak tahu tentang hal-hal per direktori.