Nakonec jsem to vyřešil. Děkuji @JimB, protože ve svém komentáři upozornil na SUEXEC, o kterém jsem nevěděl (nebo jsem ho doteď prostě ignoroval).
Po přečtení dokumentace suEXEC jsem pochopil, že problém tam musí být. Tak jsem se podíval na konfiguraci:
# 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"
a vše vypadalo v pořádku (dobré uid/gid pro mého uživatele, userdir_suffix je v pořádku atd.). Tak jsem se podíval na systémové protokoly:
# 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)
a to je problém:můj cgi-bin
do adresáře mohli zapisovat ostatní .
Opravil jsem jednoduchou změnou oprávnění na 755
.
To se někdy objeví, když se pokusíte volat jiné metody modulu Python z vašeho cgi, kde jste možná nechali nějaké příkazy 'print' (možná pro ladění). Naskenujte tedy svůj kód, abyste našli jakýkoli příkaz „vytisknout“, někdy to problém snadno vyřeší.
Pro mě to fungovalo, když jsem změnil řádek shebang (#!/usr/bin/sh
) až #!/usr/bin/env sh
. Zjistil jsem, že všechny linie shebang z What is the prefered Bash shebang? zdálo se, že to funguje (avšak všimněte si, že sh
se liší od bash
takže pokud chcete použít sh
držte se toho).
Takže tento kód fungoval pro mě:
#!/usr/bin/env sh
echo "Content-type: text/plain"
echo ""
echo "Hello"
Také podle výše uvedeného příspěvku to vypadá na /usr/bin/env sh
se zdá být preferován před /bin/sh
. Nemám ponětí o věcech podle adresáře.