vagrant/plugins/commands/ssh/command.rb
Chris Roberts ea25996b21
Update Vagrant behavior outside of installers
Remove customized require behaviors and modify the bin executable
to check for missing tools that Vagrant expects to exist when
running outside of an installer.
2025-04-02 11:40:17 -07:00

80 lines
2.5 KiB
Ruby

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
require 'optparse'
module VagrantPlugins
module CommandSSH
class Command < Vagrant.plugin("2", :command)
def self.synopsis
"connects to machine via SSH"
end
def execute
options = {}
options[:tty] = true
opts = OptionParser.new do |o|
o.banner = "Usage: vagrant ssh [options] [name|id] [-- extra ssh args]"
o.separator ""
o.separator "Options:"
o.separator ""
o.on("-c", "--command COMMAND", "Execute an SSH command directly") do |c|
options[:command] = c
end
o.on("-p", "--plain", "Plain mode, leaves authentication up to user") do |p|
options[:plain_mode] = p
end
o.on("-t", "--[no-]tty", "Enables tty when executing an ssh command (defaults to true)") do |t|
options[:tty] = t
end
end
# Parse out the extra args to send to SSH, which is everything
# after the "--"
split_index = @argv.index("--")
if split_index
options[:ssh_args] = @argv.drop(split_index + 1)
@argv = @argv.take(split_index)
end
# Parse the options and return if we don't have any target.
argv = parse_options(opts)
return if !argv
# Execute the actual SSH
with_target_vms(argv, single_target: true) do |vm|
ssh_opts = {
plain_mode: options[:plain_mode],
extra_args: options[:ssh_args]
}
if options[:command]
@logger.debug("Executing single command on remote machine: #{options[:command]}")
env = vm.action(:ssh_run,
ssh_opts: ssh_opts,
ssh_run_command: options[:command],
tty: options[:tty],)
# Exit with the exit status of the command or a 0 if we didn't
# get one.
exit_status = env[:ssh_run_exit_status] || 0
return exit_status
else
Vagrant::Bundler.instance.deinit
@logger.debug("Invoking `ssh` action on machine")
vm.action(:ssh, ssh_opts: ssh_opts)
# We should never reach this point, since the point of `ssh`
# is to exec into the proper SSH shell, but we'll just return
# an exit status of 0 anyways.
return 0
end
end
end
end
end
end