WordPress要求FTP登录凭据的原因以及绕过

11月份听老司机小伙伴说Linode东京第二机房开放beta以后就冲去抢了个beta权限,简单迁移完站点之后现在网站已经跑在Linode上了。

插件和主题更新之前使用wp-config.php手动添加FTP用户名密码方式完美升级,也就没去管了。

前几天(?)收到了Wordpress 4.7更新,更新就更新咯,结果又要我输入FTP用户名密码……嗨呀,全家爆炸。

FTP Credential应该是每个wordpress站长都会遇到的问题……(而且应该每个站长都乖乖输入过三四遍FTP凭证后无奈google)既然这功能这么鸡肋为什么不去掉呢!冷静下来想一想应该是为了照顾hosting的用户吧……(据说)虚拟空间用户似乎只能用FTP方式上传网页内容,哪有我等VPS党烧银子自由。

其实原因并不是FTP的锅,而是目录权限的问题。

正常情况下/var/www给644权限足够,然而wordpress更新插件时需要写入(4+2=6)权限,更新主程序还需要追加一个执行(4+2+1=7)权限。

1. 更改权限

上文提到/var/www目录没有足够权限,那就临时把权限改成774好了。

sudo chmod 774 /var/www/* -R

正常运行时775权限太高了!正常运行时775权限太高了!正常运行时775权限太高了!重要的话说三遍!

虽然WordPress更新并不是非常频繁,但是每一次更新都需要改动目录权限再改回来不觉得麻烦吗?

2. FS_METHOD

WordPress Codex中对于FS_METHOD有如下解释:

FS_METHOD forces the filesystem method. It should only be “direct”, “ssh2”, “ftpext”, or “ftpsockets”. Generally, you should only change this if you are experiencing update problems. If you change it and it doesn’t help, change it back/remove it. Under most circumstances, setting it to ‘ftpsockets’ will work if the automatically chosen method does not. Note that your selection here has serious security implications. If you are not familiar with them, you should seek help before making a change.

  • (Primary Preference) “direct” forces it to use Direct File I/O requests from within PHP. It is the option chosen by default.
  • (Secondary Preference) “ssh2″ is to force the usage of the SSH PHP Extension if installed
  • (3rd Preference) “ftpext” is to force the usage of the FTP PHP Extension for FTP Access, and finally
  • (4th Preference) “ftpsockets” utilises the PHP Sockets Class for FTP Access.

(虽然我读起来没有难度但是要翻译还真是苦手……)

从这段描述文档来看,FS_METHOD定义了四个选项:direct, ssh2, ftpext, ftpsockets。其中direct强制文件系统直接使用PHP的读写请求,是WordPress的默认模式(反正我不信)。第二三四个挺少用的,分别是用SSH PHP拓展、FTP PHP拓展、PHP Socket类来取得FTP连接。

这样的话,我们就找到了第二种方式:使用FS_METHOD强制WordPress直接写目录。

!如果共享主机设置不完善(PHP不作为单独用户运行),此方式很可能导致网站被入侵(就是上文的… has serious security implications)。

首先进入wordpress所在的目录,编辑wp-config.php。在wp-config.php的最后一行,加上:

define('FS_METHOD','direct');

保存,然后就可以回到WordPress更新页面正常更新。

2 条评论

有什么想法说出来听听?

  • 看看是已谁来运行的 php
    如果是php-fpm

    ps -ef | grep php

    可以看到用户 可能是 apache 或者nginx (修改启用服务器权限在 php-fpm.d/www.conf,差不多对应的位置 )
    把相应的目录是设置成对应的用户
    例如
    chown -R apache:apache /home/test

    php的 session 权限 如果不对的也需要修改,可能会登陆不上

    设置774的权限太大了 目录一般是755 权限 文件一般是644权限