Module: CemAcpt::Utils::SSH

Defined in:
lib/cem_acpt/utils.rb

Overview

SSH-related utilities

Class Method Summary collapse

Class Method Details

.acpt_known_hosts(keydir: default_keydir, file_name: 'acpt_known_hosts', overwrite: true) ⇒ Object



110
111
112
113
114
# File 'lib/cem_acpt/utils.rb', line 110

def self.acpt_known_hosts(keydir: default_keydir, file_name: 'acpt_known_hosts', overwrite: true)
  kh_file = File.join(keydir, file_name)
  File.open(kh_file, 'w') { |f| f.write("\n") } unless File.exist?(kh_file) && !overwrite
  kh_file
end

.default_keydirObject



91
92
93
94
95
96
# File 'lib/cem_acpt/utils.rb', line 91

def self.default_keydir
  ssh_dir = File.join(ENV['HOME'], '.ssh')
  raise "SSH directory at #{ssh_dir} does not exist" unless File.directory?(ssh_dir)

  ssh_dir
end

.ephemeral_ssh_key(type: 'rsa', bits: '4096', comment: nil, keydir: default_keydir) ⇒ Object

Raises:

  • (ArgumentError)


98
99
100
101
102
103
104
105
106
107
108
# File 'lib/cem_acpt/utils.rb', line 98

def self.ephemeral_ssh_key(type: 'rsa', bits: '4096', comment: nil, keydir: default_keydir)
  raise ArgumentError, 'keydir does not exist' unless File.directory?(keydir)

  keyfile = File.join(keydir, SecureRandom.hex(16))
  keygen_cmd = [ssh_keygen, "-t #{type}", "-b #{bits}", "-f #{keyfile}", '-N ""']
  keygen_cmd << "-C \"#{comment}\"" if comment
  _, stderr, status = Open3.capture3(keygen_cmd.join(' '))
  raise "Failed to generate ephemeral SSH key: #{stderr}" unless status.success?

  [keyfile, "#{keyfile}.pub"]
end

.keygenObject



84
85
86
87
88
89
# File 'lib/cem_acpt/utils.rb', line 84

def self.keygen
  bin_path = `command -v ssh-keygen`.chomp
  raise 'Cannot find ssh-keygen! Install it and verify PATH' unless bin_path

  bin_path
end

.set_ssh_file_permissions(priv_key, pub_key, known_hosts) ⇒ Object



116
117
118
# File 'lib/cem_acpt/utils.rb', line 116

def self.set_ssh_file_permissions(priv_key, pub_key, known_hosts)
  CemAcpt::Utils::File.set_permissions(0o600, priv_key, pub_key, known_hosts)
end