web-dev-qa-db-fra.com

Pourquoi WordPress exige-t-il qu'un serveur FTP s'exécute sur le serveur Web pour transférer des plugins?

J'avais posé une question liée au super utilisateur:

Un cas d'utilisation d'un système "recevant" des fichiers via FTP serait, par exemple, la façon dont les plugins WordPress sont installés en un clic lorsque WordPress initie un transfert de fichier vers la machine Linux locale à partir du référentiel de plugins WordPress distant en utilisant ftp (s)

Plus spécifiquement cet écran:

WP asking for ftp info during plugin install

Ma compréhension initiale que WordPress transférerait les fichiers du référentiel de plugins WordPress, comme le ferait un client FTP. Mais d'autres discussions sur le chat m'ont laissé confus quant à la raison pour laquelle WordPress aurait besoin des détails FTP du serveur Web.

Qu'est-ce que j'oublie ici?

3
Sathyajith Bhat

Lorsque vous effectuez une opération nécessitant l'écriture de WordPress sur le système de fichiers, une vérification est effectuée pour déterminer si ce dernier est autorisé à le faire en écrivant un fichier temporaire. Si cette vérification échoue, elle vous demandera les détails FTP afin d'écrire les fichiers sur votre serveur.

MODIFIER

cherchez dans wp-admin/includes/file.php, ligne 843, la fonction get_filesystem_method qui effectue cette vérification.

2
Milo

Le wp-admin/includes/file.php ** get_filesystem_method () ** utilise un test erroné pour déterminer s’il peut écrire un fichier. À la ligne 853:

if ( getmyuid() == @fileowner($temp_file_name) )

L'utilisation de getmyuid () est incorrecte pour unix - cela devrait plutôt être posix_getuid () . Le problème est que getmyuid () renverra le propriétaire du fichier de script et non l'utilisateur qui exécute le script. Sous Unix, cela signifie que si le fichier a été installé par root et que le serveur Web est exécuté en tant qu'utilisateur www-data, le test échouera même si le fichier est écrit pendant le test.

Donc, pour résoudre ce problème, changez la ligne avec getmyuid () en:

if ( posix_getuid() == @fileowner($temp_file_name) )
2
a9k

Le réponse de Milo est correct. Je voulais juste ajouter quelques détails sur la façon dont la vérification est effectuée (parce que get_filesystem_method() a un peu changé depuis 2011).

Premièrement, vous pouvez annuler complètement cette vérification en définissant FS_METHOD dans votre wp-config.php comme étant 'direct', 'ssh2', 'ftpext' ou 'ftpsockets'.

Si cette constante n'est pas définie, alors WP tente de déterminer la méthode à utiliser. Pour ce faire, essayez de créer un fichier temporaire appelé wp-content/temp-write-test-1434788954 (ce numéro à la fin correspond simplement à l'horodatage actuel). Si ce fichier ne peut pas être créé, il utilise la méthode ssh2, ftpext ou ftpsockets (c’est-à-dire les gênants qui nécessitent des informations d’authentification).

Si le fichier can peut être créé, WP continue de comparer le propriétaire de ce fichier avec le propriétaire de wp-admin/includes/file.php. Si ce sont les mêmes, alors tout va bien et la méthode direct peut être utilisée.


TL; DR:L'utilisateur du serveur Web doit être autorisé à écrire dans wp-content/ et être le propriétaire de wp-admin/includes/file.php.

0
Sam Wilson