远程运行命令

使用 SSH 连接

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

在后台,WP-CLI 将命令代理到 ssh 可执行文件,然后将其传递给远程计算机上安装的 WP-CLI。的语法根据以下规则进行解释:--ssh=[<scheme>][<user>@]<host>[:<port>][<path>]

  • 方案参数默认为 ,并交替接受 和 的选项。ssh``vagrant``docker``docker-compose
  • 如果您只提供主机(例如),则用户将从您当前的系统用户推断出来,端口将是默认的 SSH 端口 (22),路径将是 SSH 用户的主目录。wp --ssh=example.com
  • 您可以通过将用户添加为以 at 符号结尾的前缀来覆盖用户(例如 )。wp --ssh=admin_user@example.com
  • 您可以通过将端口添加为前缀为冒号的后缀来覆盖端口(例如 )。wp --ssh=example.com:2222
  • 您可以通过将其添加为后缀来覆盖路径(例如 )。路径紧跟在端口之后,或者如果您未显式设置端口,则位于主机的 TLD 之后。wp --ssh=example.com~/webapps/production
  • 您也可以提供一个已知的别名,存储在(例如 作为别名)。~/.ssh/config``wp --ssh=rc``@rc

注意:您需要在远程服务器上安装WP-CLI的副本,可作为wp访问。

此外,如果您定义了 shell 别名或正在扩展环境变量,则不会加载您的。如果这影响了您,以下是有关如何使可访问性的更详尽的说明--ssh=<host>``~/.bash_profile``$PATH``wp

别名

WP-CLI别名是您在OR中注册的快捷方式,可以毫不费力地针对任何WordPress安装运行命令。wp-cli.yml``config.yml

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

# Run the flush command on the development environment
$ wp @dev rewrite flush
Success: Rewrite rules flushed.

然后,一旦代码投入生产,就可以运行:

# Run the flush command on the production environment
$ wp @prod rewrite flush
Success: Rewrite rules flushed.

您不需要通过SSH连接到计算机,更改目录,并且通常花费整整一分钟来安装给定的WordPress,您只需让WP-CLI知道要使用什么机器,并且它知道如何进行实际连接。

它还可以轻松利用 Vagrant 的 ssh 助手命令来确定 SSH 参数,方法是将 WP-CLI 命令通过管道连接到使用方案,例如 Vagrant 机器名称/ID 在哪里,或者如果定义为别名,如以下示例所示。一些 Vagrant 盒子默认提供此功能,因此您可以从主机开箱即用地使用 WP-CLI。vagrant ssh``vagrant``--ssh=vagrant:default``default

此外,别名组允许您注册别名组。如果要对两个配置的示例站点运行命令,可以使用类似 :@both

# Run the update check on both environments
$ wp @both core check-update
Success: WordPress is at the latest version.
Success: WordPress is at the latest version.

可以在项目文件或用户的全局文件中注册别名: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

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

远程运行自定义命令

如果要在远程服务器上运行自定义命令,则需要在远程服务器上安装该自定义命令,但不必将其安装在要从中启动的本地计算机上。wp

您可以远程使用 WP-CLI 包管理器将自定义命令安装到远程计算机。

例:

# 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

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

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

将WP-CLI二进制文件复制到$HOME/箱

在许多 Linux 发行版中,默认情况下是 ,因此一种可访问的方法是创建一个目录(如果它尚不存在),并将 WP-CLI 二进制文件移动到 :$HOME/bin``$PATH``wp``$HOME/bin``$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

如果尚未在您的路径中,则可以在文件中或远程服务器的特定 shell 的等效项中定义它:$HOME/bin``~/.bashrc

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

在$HOME / .ssh/ 环境中指定$PATH

实现此目的的另一种方法是在远程计算机用户的文件中指定 ,前提是该计算机的 已配置 (请参阅 OpenSSH 文档)。$PATH``~/.ssh/environment``sshd``PermitUserEnvironment=yes

远程非交互式 shell 解析别名并使用 php 将 wp 作为别名运行

一些虚拟主机的配置非常严格:
– 它们不允许您执行自己的 shellscript,因此方法 WP-CLI 二进制文件中的所有内容都失败。
– 配置了 ,因此自定义 ~/.ssh/环境不起作用,也会失败。
– 此外,在客户端计算机上使用 before_ssh 挂钩也无济于事,因为在所有情况下您都无法在遥控器上运行。sshd``PermitUserEnvironment=no``wp

解决方案:在远程配置上,如下所示:~/.bashrc

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

  • 默认情况下,不会解析非交互式 shell 中的别名,但您可以更改它:

    • 在您的顶部(当然在第一个别名定义之前)插入的某个地方:~/.bashrc
    shopt -s expand_aliases
    
    • 还要确保没有过早退出非交互式 shell 的机制!如果你在上面有类似以下结构的东西(例如 Ubuntu 是这样配置的),那么 outcomment 或删除该结构的所有行:
    # If not running interactively, don't do anything
    [ -z "$PS1" ] && return
    

别名 wp 到 php 运行 WP-CLI 二进制文件

  • 行插入后的某处:shopt -s expand_aliases
    • alias wp="php ~/bin/wp"
    • alias wp="php ~/bin/wp-cli.phar"
  • 换句话说:你有一个别名“wp”,它是一个单行,php通过声明文件的路径来运行WP-CLI二进制文件,无论它在哪里,无论它有什么名称。wpi-cli.phar
    • php基本上任何虚拟主机都允许。
    • 并且文件本身甚至不能设置执行标志(=“可以完全被动”),因为文件的形式由 .**注意:**当然,可执行文件(使用执行标志重命名)最终也会由解释器运行。但是 shell 中的调用在形式上是不同的。这就是这里的关键区别。wp-cli.phar``php``~/bin/wp``wp-cli.phar``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