WP-CLI 命令行手册

title: "远程运行命令" post_status: publish comment_status: open taxonomy: category: - wp-cli-handbook post_tag: - Guides - Repos - Data


远程运行命令

使用 SSH 连接

WP-CLI 接受 --ssh=[<scheme>:][<user>@]<host>[:<port>][<path>] 全局参数,用于在远程 WordPress 安装上运行命令。该参数的用法类似于 scpgit 等工具中 SSH 连接的参数化方式。

在底层,WP-CLI 将命令代理到 ssh 可执行文件,然后由 ssh 将这些命令传递给远程机器上安装的 WP-CLI。--ssh=[<scheme>:][<user>@]<host>[:<port>][<path>] 的语法根据以下规则解析:

注意:您需要在远程服务器上安装 WP-CLI 副本,且可通过 wp 命令访问。

此外,如果您定义了 shell 别名或扩展了 $PATH 环境变量,--ssh=<host> 将不会加载您的 ~/.bash_profile。如果这对您有影响,这里有一个更详细的解释,说明如何使 wp 可访问。

方案

您可利用 ssh 参数的 scheme 组件,为连接本地容器化或虚拟化机器定义简写方式。

scheme 参数默认设为 ssh,但也接受 vagrantdockerdocker-compose 作为备选方案。

docker

使用 Docker 时,命令为:wp rewrite flush --ssh=docker:<name> 可通过 docker ps 命令查找 Docker 容器的名称。

docker-compose

对于 Docker Compose,命令为:wp option get home_url --ssh=docker-compose:<name> 可在 docker-compose.yml 文件中找到 Docker 容器的名称。

vagrant

使用 Vagrant 时,你可以使用命令:wp rewrite flush --ssh=vagrant:<name>

别名

WP-CLI 别名是你在 wp-cli.ymlconfig.yml 中注册的快捷方式,可以轻松地对任何 WordPress 安装运行命令。

例如,当你在本地工作,注册了一个新的重写规则,并且需要在基于 Vagrant 的虚拟机中刷新重写规则时,你可以运行:

# 在开发环境上运行刷新命令
$ wp @dev rewrite flush
成功:重写规则已刷新。

然后,当代码部署到生产环境后,你可以运行:

# 在生产环境上运行刷新命令
$ wp @prod rewrite flush
成功:重写规则已刷新。

你无需 SSH 进入机器、切换目录,通常也无需花费整整一分钟来访问特定的 WordPress 安装,你只需告诉 WP-CLI 要操作哪台机器,它就知道如何建立实际连接。

它还可以轻松利用 Vagrant 的 ssh 辅助命令来确定 SSH 参数,通过使用 vagrant 方案(如 --ssh=vagrant:default,其中 default 是 Vagrant 机器名称/ID)将 WP-CLI 命令通过管道传递给 vagrant ssh,或者如果像下面的示例一样定义为别名。一些 Vagrant 盒子默认提供此功能,因此你可以直接在主机上使用 WP-CLI。

此外,别名组允许你注册别名组。如果你想对两个配置的示例站点运行命令,可以使用像 @both 这样的组:

# 在两个环境上运行更新检查
$ wp @both core check-update
成功:WordPress 已是最新版本。
成功:WordPress 已是最新版本。

别名可以在项目的 wp-cli.yml 文件或用户的全局 ~/.wp-cli/config.yml 文件中注册:

@prod:
  ssh: dev_user@example.com~/webapps/production
@dev:
  ssh: vagrant@192.168.50.10/srv/www/example.dev
@local:
  ssh: vagrant:default
@both:
  - @prod
  - @dev

你可以在配置部分找到有关如何设置配置文件的更多信息。

Running custom commands remotely

If you want to run a custom command on a remote server, that custom command needs to be installed on the remote server, but it does not have to be installed on the local machine you're launching wp from.

You can use the WP-CLI package manager remotely to install custom commands to remote machines.

Example:

# The command is not installed on either local or remote machine
$ wp db ack
Error: 'ack' is not a registered subcommand of 'db'. See 'wp help db'.
$ wp @dev db ack
Error: 'ack' is not a registered subcommand of 'db'. See 'wp help db'.

# To make the command work on the remote machine, we can install it remotely
# through the WP-CLI package manager
$ wp @dev package install runcommand/db-ack
Installing package runcommand/db-ack (dev-master)
Updating /home/vagrant/.wp-cli/packages/composer.json to require the package...
Using Composer to install the package...
---
Loading composer repositories with package information
Updating dependencies
Resolving dependencies through SAT
Dependency resolution completed in 0.311 seconds
Analyzed 4726 packages to resolve dependencies
Analyzed 162199 rules to resolve dependencies
Package operations: 1 install, 0 updates, 0 removals
Installs: runcommand/db-ack:dev-master aff8ccc
 - Installing runcommand/db-ack (dev-master aff8ccc)
Writing lock file
Generating autoload files
---
Success: Package installed.

# Now we can run the command remotely, even though it is not installed locally
$ wp @dev db ack test_email@example.com
wp_users:user_email
9:test_email@example.com

在 Windows Powershell 中运行

Windows Powershell 对 @ 符号有特殊含义,这意味着不进行引号包裹或转义就无法使用它。 要远程运行命令,你需要使用以下表示法之一。

$ wp `@dev core version
$ wp "@dev" core version

在远程服务器上使 WP-CLI 可访问

通过 SSH 远程运行命令需要在远程服务器的 $PATH 中可访问 wp。由于 SSH 连接不会加载 ~/.bashrc~/.zshrc,使用 wp --ssh=<host> 时可能需要指定自定义的 $PATH。使 wp 在远程服务器上可用的几种方法包括:

将 WP-CLI 二进制文件复制到 $HOME/bin 目录

在许多 Linux 发行版中,$HOME/bin 默认已包含在 $PATH 环境变量中。因此,一种让 wp 命令可用的方法是:如果 $HOME/bin 目录不存在则创建它,然后将 WP-CLI 二进制文件移动到 $HOME/bin/wp

mkdir -p ~/bin
cd ~/bin
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar wp

如果 $HOME/bin 尚未包含在您的路径中,可以在 ~/.bashrc 文件(或远程服务器对应 shell 的等效配置文件)中定义:

#.bashrc
PATH="$HOME/bin:$PATH"

在 $HOME/.ssh/environment 中指定 $PATH

另一种实现方式是在远程机器用户的 ~/.ssh/environment 文件中指定 $PATH,前提是该机器的 sshd 已配置 PermitUserEnvironment=yes(参见 OpenSSH 文档)。

远程非交互式 Shell 解析别名并以别名方式运行 wp 与 php

某些虚拟主机配置限制非常严格: - 不允许执行自定义 shell 脚本,因此WP-CLI 二进制文件方法完全失效。 - sshd 配置为 PermitUserEnvironment=no,导致自定义~/.ssh/environment 无效且同样失败。 - 即使在客户端使用 before_ssh 钩子也无济于事,因为所有情况下都无法在远程主机运行 wp

解决方案:在远程主机按如下方式配置 ~/.bashrc

配置远程非交互式 Shell 以解析别名

将 wp 别名指向运行 WP-CLI 二进制文件的 php 命令

在客户端使用 before_ssh 钩子

或者,如果您无法在服务器端使其正常工作,可以通过挂载 before_ssh 钩子并定义一个包含您要运行的命令的环境变量来实现相同的效果:

WP_CLI::add_hook( 'before_ssh', function() {

    $host = WP_CLI\Utils\parse_ssh_url(
        WP_CLI::get_runner()->config['ssh'],
        PHP_URL_HOST
    );

    switch( $host ) {
        case 'example.com':
            putenv( 'WP_CLI_SSH_PRE_CMD=export PATH=$HOME/bin:$PATH' );
            break;
    }
} );

如果您将上述代码放入 pre-ssh.php 文件中,可以通过在 ~/.wp-cli/config.yml 文件中引入该文件,从而为整个环境加载它:

require:
  - pre-ssh.php