Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Command-line Google Authenticator (TOTP)
#!/usr/bin/env ruby
# frozen_string_literal: true
# encoding: utf-8
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'rotp'
gem 'thor'
end
class GoogleAuthenticator < Thor
desc 'add', 'add a new account'
def add
print 'New account name: '
acName = STDIN.gets.strip
print 'New account code: '
acCode = STDIN.gets.strip
File.open(File.expand_path('~/.google-authenticator-accounts'), 'a'){|f| f.printf "%-23s %s\n", acName, acCode}
end
desc 'generate', 'generate TOTP codes'
def generate
printf "%-30s %3s (%02ds) %4s\n", 'Account', 'Now', (30 - (Time::now.utc.to_i % 30)), 'Next'
puts '-' * 47
File.read(File.expand_path('~/.google-authenticator-accounts')).split("\n").reject{|l| l.strip == ''}.each do |account|
if account =~ /^(.+) ([\w\d]+)$/
totp = ROTP::TOTP.new($2)
printf "%-30s %06s %06s\n", $1, totp.at(Time::now.utc), totp.at(Time::now.utc + 30)
end
end
end
default_task :generate
end
GoogleAuthenticator.start
@Dan-Q

This comment has been minimized.

Copy link
Owner Author

Dan-Q commented Dec 10, 2018

Run ./google-authenticator.rb add to add new accounts. You'll be asked for a name and a code. Account details are written to ~/.google-authenticator.

Run ./google-authenticator.rb to list 'now' and 'next' TOTP codes for all added accounts.

Further reading: https://danq.me/2018/12/10/second-factor-safety-net/

@sbliven

This comment has been minimized.

Copy link

sbliven commented Mar 8, 2019

Thanks!

Users should note that the account codes should not contain spaces. The last word of ~/.google-authenticator-accounts is used as the code, with everything else taken as the account name. Account codes should be either 16 or 32 letters/digits (e.g. 80 or 160 bits).

It is also a good idea to protect the secret keys somewhat: chmod 600 ~/.google-authenticator-accounts

@sbliven

This comment has been minimized.

Copy link

sbliven commented Mar 8, 2019

BTW, I made some small fixes in my fork if your interested.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.