This WordPress site uses the Google Authenticator plugin to provide two-factor authentication (2FA) when logging-in to the administration area. Occasionally I need to temporarily disable 2FA in order to publish posts from the blogging software I use. Traditionally toggling 2FA is achieved from the WordPress backend. This post looks at two alternative methods of doing this locally from the command line.
Method 1 – Using the MySQL Command Line Client
The Google Authenticator plugin settings are stored on a per-user basis in the *_usermeta table. Before taking a look at these settings from the command prompt of your server’s remote shell you’ll need the following information from your site’s wp-config.php file:
mysql-user-name: DB_USER
mysql-user-password: DB_PASSWORD
database-name: DB_NAME
table-prefix_: $table_prefix
To get the appropriate wp-user-id take a look at How to Find a WordPress User ID but instead of username, hover over the number of posts and look for author=
Armed with this information, use the following command to interrogate the database (you’ll be prompted for the mysql-user-name password):
mysql -u mysql-user-name -p -e "USE database-name; SELECT user_id, meta_key, meta_value FROM table-prefix_usermeta WHERE user_id=wp-user-id AND meta_key LIKE 'googleauthenticator_%';"
+---------+----------------------------------+-----------------------------------------------------------------------+
| user_id | meta_key | meta_value |
+---------+----------------------------------+-----------------------------------------------------------------------+
| 2 | googleauthenticator_description | My Site |
| 2 | googleauthenticator_enabled | enabled |
| 2 | googleauthenticator_lasttimeslot | 52734943 |
| 2 | googleauthenticator_passwords | {"appname":"Default","password":"HCACyh@eH-XnL*ALCJJ3-yrKVBVw2m62jm"} |
| 2 | googleauthenticator_pwdenabled | disabled |
| 2 | googleauthenticator_relaxedmode | disabled |
| 2 | googleauthenticator_secret | 2TXZUABQROZJAH2E |
+---------+----------------------------------+-----------------------------------------------------------------------+
The option we’re interested in is googleauthenticator_enabled which can either have a value of enabled (active) or disabled (inactive). To change the value to disabled use the following command:
mysql -u mysql-user-name -p -e "USE database-name; UPDATE table-prefix_usermeta SET meta_value='disabled' WHERE user_id=wp-user-id AND meta_key='googleauthenticator_enabled';"
To confirm the change is successful and the value is now disabled:
mysql -u mysql-user-name -p -e "USE database-name; SELECT user_id, meta_key, meta_value FROM table-prefix_usermeta WHERE user_id=wp-user-id AND meta_key='googleauthenticator_enabled';"
+---------+----------------------------------+-----------------------------------------------------------------------+ | user_id | meta_key | meta_value | +---------+----------------------------------+-----------------------------------------------------------------------+ | 2 | googleauthenticator_enabled | disabled | +---------+----------------------------------+-----------------------------------------------------------------------+
We could combine the command to update the option with the command to confirm the update was successful, but the resulting command is a little lengthy so we could place the necessary SQL statements into a file named say disable-ga.sql:
USE database-name; UPDATE table-prefix_usermeta SET meta_value='disabled' WHERE user_id=wp-user-id AND meta_key='googleauthenticator_enabled'; SELECT user_id, meta_key, meta_value FROM table-prefix_usermeta WHERE user_id=wp-user-id AND meta_key='googleauthenticator_enabled';
The command to disable 2FA and confirm the change is now:
mysql --table -u mysql-user-name -p < /path/to/disable-ga.sql
+---------+----------------------------------+-----------------------------------------------------------------------+ | user_id | meta_key | meta_value | +---------+----------------------------------+-----------------------------------------------------------------------+ | 2 | googleauthenticator_enabled | disabled | +---------+----------------------------------+-----------------------------------------------------------------------+
Note the addition of the mysql command line option --table which is necessary when running mysql in batch mode to ensure results are displayed in a tabular format.
Similarly, we could create another file named say enable-ga.sql in order to enable 2FA:
USE database-name; UPDATE table-prefix_usermeta SET meta_value='enabled' WHERE user_id=wp-user-id AND meta_key='googleauthenticator_enabled'; SELECT user_id, meta_key, meta_value FROM table-prefix_usermeta WHERE user_id=wp-user-id AND meta_key='googleauthenticator_enabled';
Now, to enable 2FA:
mysql --table -u mysql-user-name -p < /path/to/enable-ga.sql
+---------+----------------------------------+-----------------------------------------------------------------------+ | user_id | meta_key | meta_value | +---------+----------------------------------+-----------------------------------------------------------------------+ | 2 | googleauthenticator_enabled | enabled | +---------+----------------------------------+-----------------------------------------------------------------------+
We now have a way of disabling/enabling 2FA from the command line, but this is being actioned server-side remotely. On a Unix-like OS such as Linux or macOS the same can be achieved from a local shell:
ssh -p 22 user@12.34.56.789 "mysql --table -u mysql-user-name -p < /path/to/disable-ga.sql"
Enter password: ERROR 1045 (28000): Access denied for user 'mysql-user-name'@'localhost' (using password: YES)
We're simply placing our command in double-quotes and prefixing it with the SSH credentials required to login to the server. However, this will cause an error as we're unable to enter the password for mysql-user-name. To avoid this error amend or create the file .my.cnf in your home directory on the server:
[client-database-name] user=mysql-user-name password='mysql-user-password'
This provides mysql with the password for the MySQL user mysql-user-name. Note the group name in square brackets: client-database-name. It must begin with the word client, but can be followed with any string. I chose - followed by the database-name.
Now, to disable 2FA from a local shell:
ssh -p 22 user@12.34.56.789 "mysql --defaults-group-suffix=-database-name --table -u mysql-user-name < /path/to/disable-ga.sql"
+---------+----------------------------------+-----------------------------------------------------------------------+ | user_id | meta_key | meta_value | +---------+----------------------------------+-----------------------------------------------------------------------+ | 2 | googleauthenticator_enabled | disabled | +---------+----------------------------------+-----------------------------------------------------------------------+
Note the addition of the mysql command line option --defaults-group-suffix= and its value -database-name which instructs mysql to use the settings associated with the group named client-database-name in the ~/.my.cnf file.
Optionally, create shell aliases to each of these commands by adding the following code to your user profile. For bash, this file is either ~/.bashrc or ~/.bash_profile. For zsh this is ~/.zshrc.
To create an alias named disga:
alias disga='ssh -p 22 user@12.34.56.789 "mysql --defaults-group-suffix=-database-name --table -u mysql-user-name < /path/to/disable-ga.sql"'
To create an alias named enga:
alias enga='ssh -p 22 user@12.34.56.789 "mysql --defaults-group-suffix=-database-name --table -u mysql-user-name < /path/to/enable-ga.sql"'
Now, to disable or enable 2FA simply type disga or enga respectively at the local command prompt:
enga
+---------+----------------------------------+-----------------------------------------------------------------------+ | user_id | meta_key | meta_value | +---------+----------------------------------+-----------------------------------------------------------------------+ | 2 | googleauthenticator_enabled | enabled | +---------+----------------------------------+-----------------------------------------------------------------------+
Method 2 - Using WP-CLI
The second method uses WP-CLI, the command line interface for WordPress and requires WP-CLI to be installed both locally and remotely with some configuration required for the local install. However, once installed it can be used for not only toggling 2FA. See Installing and Configuring WP-CLI on macOS for details.
The following commands use the WP-CLI user meta get and user meta update commands.
To check the status of 2FA provided by the Google Authenticator plugin using WP-CLI locally:
wp @production user meta get "wp-user-id" googleauthenticator_enabled
enabled
To disable 2FA using WP-CLI locally:
wp @production user meta update "wp-user-id" googleauthenticator_enabled "disabled"
Success: Updated custom field 'googleauthenticator_enabled'.
To enable 2FA using WP-CLI locally:
wp @production user meta update "wp-user-id" googleauthenticator_enabled "enabled"
Success: Updated custom field 'googleauthenticator_enabled'.
These commands can also be aliased. To create an alias named disgawp:
alias disgawp='wp @production user meta update "wp-user-id" googleauthenticator_enabled "disabled"'
To create an alias named engawp:
alias engawp='wp @production user meta update "wp-user-id" googleauthenticator_enabled "enabled"'