Support environment variable forwarding, fixes #4131
Signed-off-by: Eli Skeggs <eskeggs@globesherpa.com>
This commit is contained in:
parent
6a147e1146
commit
2b9173e15a
@ -442,6 +442,7 @@ module Vagrant
|
|||||||
# We also set some fields that are purely controlled by Varant
|
# We also set some fields that are purely controlled by Varant
|
||||||
info[:forward_agent] = @config.ssh.forward_agent
|
info[:forward_agent] = @config.ssh.forward_agent
|
||||||
info[:forward_x11] = @config.ssh.forward_x11
|
info[:forward_x11] = @config.ssh.forward_x11
|
||||||
|
info[:forward_env] = @config.ssh.forward_env
|
||||||
|
|
||||||
info[:ssh_command] = @config.ssh.ssh_command if @config.ssh.ssh_command
|
info[:ssh_command] = @config.ssh.ssh_command if @config.ssh.ssh_command
|
||||||
|
|
||||||
|
|||||||
@ -138,6 +138,10 @@ module Vagrant
|
|||||||
command_options += ["-o", "ProxyCommand=#{ssh_info[:proxy_command]}"]
|
command_options += ["-o", "ProxyCommand=#{ssh_info[:proxy_command]}"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if ssh_info[:forward_env]
|
||||||
|
command_options += ["-o", "SendEnv=" + ssh_info[:forward_env].keys().join(" ")]
|
||||||
|
end
|
||||||
|
|
||||||
# Configurables -- extra_args should always be last due to the way the
|
# Configurables -- extra_args should always be last due to the way the
|
||||||
# ssh args parser works. e.g. if the user wants to use the -t option,
|
# ssh args parser works. e.g. if the user wants to use the -t option,
|
||||||
# any shell command(s) she'd like to run on the remote server would
|
# any shell command(s) she'd like to run on the remote server would
|
||||||
@ -172,6 +176,14 @@ module Vagrant
|
|||||||
LOGGER.info("Executing SSH in subprocess: #{ssh} #{command_options.inspect}")
|
LOGGER.info("Executing SSH in subprocess: #{ssh} #{command_options.inspect}")
|
||||||
process = ChildProcess.build(ssh, *command_options)
|
process = ChildProcess.build(ssh, *command_options)
|
||||||
process.io.inherit!
|
process.io.inherit!
|
||||||
|
|
||||||
|
# Forward configured environment variables.
|
||||||
|
if ssh_info[:forward_env]
|
||||||
|
ssh_info[:forward_env].each do |host_var, guest_var|
|
||||||
|
process.environment[guest_var] = ENV[guest_var]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
process.start
|
process.start
|
||||||
process.wait
|
process.wait
|
||||||
return process.exit_code
|
return process.exit_code
|
||||||
|
|||||||
@ -41,7 +41,8 @@ module VagrantPlugins
|
|||||||
forward_agent: ssh_info[:forward_agent],
|
forward_agent: ssh_info[:forward_agent],
|
||||||
forward_x11: ssh_info[:forward_x11],
|
forward_x11: ssh_info[:forward_x11],
|
||||||
proxy_command: ssh_info[:proxy_command],
|
proxy_command: ssh_info[:proxy_command],
|
||||||
ssh_command: ssh_info[:ssh_command]
|
ssh_command: ssh_info[:ssh_command],
|
||||||
|
forward_env: ssh_info[:forward_env],
|
||||||
}
|
}
|
||||||
|
|
||||||
# Render the template and output directly to STDOUT
|
# Render the template and output directly to STDOUT
|
||||||
|
|||||||
@ -328,6 +328,17 @@ module VagrantPlugins
|
|||||||
auth_methods << "publickey" if ssh_info[:private_key_path]
|
auth_methods << "publickey" if ssh_info[:private_key_path]
|
||||||
auth_methods << "password" if ssh_info[:password]
|
auth_methods << "password" if ssh_info[:password]
|
||||||
|
|
||||||
|
# Build the environment
|
||||||
|
env_revert = {}
|
||||||
|
send_env_array = nil
|
||||||
|
if ssh_info[:forward_agent]
|
||||||
|
send_env_array = ssh_info[:forward_env].values()
|
||||||
|
ssh_info[:forward_env].each do |host_var, guest_var|
|
||||||
|
env_revert[guest_var] = ENV[guest_var]
|
||||||
|
ENV[guest_var] = ENV[host_var]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Build the options we'll use to initiate the connection via Net::SSH
|
# Build the options we'll use to initiate the connection via Net::SSH
|
||||||
common_connect_opts = {
|
common_connect_opts = {
|
||||||
auth_methods: auth_methods,
|
auth_methods: auth_methods,
|
||||||
@ -338,6 +349,7 @@ module VagrantPlugins
|
|||||||
paranoid: false,
|
paranoid: false,
|
||||||
password: ssh_info[:password],
|
password: ssh_info[:password],
|
||||||
port: ssh_info[:port],
|
port: ssh_info[:port],
|
||||||
|
send_env: send_env_array,
|
||||||
timeout: 15,
|
timeout: 15,
|
||||||
user_known_hosts_file: [],
|
user_known_hosts_file: [],
|
||||||
verbose: :debug,
|
verbose: :debug,
|
||||||
@ -430,6 +442,11 @@ module VagrantPlugins
|
|||||||
# This is raised if a private key type that Net-SSH doesn't support
|
# This is raised if a private key type that Net-SSH doesn't support
|
||||||
# is used. Show a nicer error.
|
# is used. Show a nicer error.
|
||||||
raise Vagrant::Errors::SSHKeyTypeNotSupported
|
raise Vagrant::Errors::SSHKeyTypeNotSupported
|
||||||
|
ensure
|
||||||
|
# TODO: will this leak?
|
||||||
|
env_revert.each do |guest_var, guest_value|
|
||||||
|
ENV[guest_var] = guest_value
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@connection = connection
|
@connection = connection
|
||||||
|
|||||||
@ -13,6 +13,7 @@ module VagrantPlugins
|
|||||||
attr_accessor :private_key_path
|
attr_accessor :private_key_path
|
||||||
attr_accessor :forward_agent
|
attr_accessor :forward_agent
|
||||||
attr_accessor :forward_x11
|
attr_accessor :forward_x11
|
||||||
|
attr_accessor :forward_env
|
||||||
attr_accessor :shell
|
attr_accessor :shell
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@ -26,6 +27,7 @@ module VagrantPlugins
|
|||||||
@private_key_path = UNSET_VALUE
|
@private_key_path = UNSET_VALUE
|
||||||
@forward_agent = UNSET_VALUE
|
@forward_agent = UNSET_VALUE
|
||||||
@forward_x11 = UNSET_VALUE
|
@forward_x11 = UNSET_VALUE
|
||||||
|
@forward_env = UNSET_VALUE
|
||||||
@shell = UNSET_VALUE
|
@shell = UNSET_VALUE
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -37,6 +39,7 @@ module VagrantPlugins
|
|||||||
new.ssh.private_key_path = @private_key_path if @private_key_path != UNSET_VALUE
|
new.ssh.private_key_path = @private_key_path if @private_key_path != UNSET_VALUE
|
||||||
new.ssh.forward_agent = @forward_agent if @forward_agent != UNSET_VALUE
|
new.ssh.forward_agent = @forward_agent if @forward_agent != UNSET_VALUE
|
||||||
new.ssh.forward_x11 = @forward_x11 if @forward_x11 != UNSET_VALUE
|
new.ssh.forward_x11 = @forward_x11 if @forward_x11 != UNSET_VALUE
|
||||||
|
new.ssh.forward_env = @forward_env if @forward_env != UNSET_VALUE
|
||||||
new.ssh.shell = @shell if @shell != UNSET_VALUE
|
new.ssh.shell = @shell if @shell != UNSET_VALUE
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -7,6 +7,7 @@ module VagrantPlugins
|
|||||||
class SSHConfig < SSHConnectConfig
|
class SSHConfig < SSHConnectConfig
|
||||||
attr_accessor :forward_agent
|
attr_accessor :forward_agent
|
||||||
attr_accessor :forward_x11
|
attr_accessor :forward_x11
|
||||||
|
attr_accessor :forward_env
|
||||||
attr_accessor :guest_port
|
attr_accessor :guest_port
|
||||||
attr_accessor :keep_alive
|
attr_accessor :keep_alive
|
||||||
attr_accessor :shell
|
attr_accessor :shell
|
||||||
@ -22,6 +23,7 @@ module VagrantPlugins
|
|||||||
|
|
||||||
@forward_agent = UNSET_VALUE
|
@forward_agent = UNSET_VALUE
|
||||||
@forward_x11 = UNSET_VALUE
|
@forward_x11 = UNSET_VALUE
|
||||||
|
@forward_env = UNSET_VALUE
|
||||||
@guest_port = UNSET_VALUE
|
@guest_port = UNSET_VALUE
|
||||||
@keep_alive = UNSET_VALUE
|
@keep_alive = UNSET_VALUE
|
||||||
@proxy_command = UNSET_VALUE
|
@proxy_command = UNSET_VALUE
|
||||||
@ -45,6 +47,7 @@ module VagrantPlugins
|
|||||||
|
|
||||||
@forward_agent = false if @forward_agent == UNSET_VALUE
|
@forward_agent = false if @forward_agent == UNSET_VALUE
|
||||||
@forward_x11 = false if @forward_x11 == UNSET_VALUE
|
@forward_x11 = false if @forward_x11 == UNSET_VALUE
|
||||||
|
@forward_env = false if @forward_env == UNSET_VALUE
|
||||||
@guest_port = 22 if @guest_port == UNSET_VALUE
|
@guest_port = 22 if @guest_port == UNSET_VALUE
|
||||||
@keep_alive = true if @keep_alive == UNSET_VALUE
|
@keep_alive = true if @keep_alive == UNSET_VALUE
|
||||||
@proxy_command = nil if @proxy_command == UNSET_VALUE
|
@proxy_command = nil if @proxy_command == UNSET_VALUE
|
||||||
|
|||||||
@ -67,6 +67,11 @@ is enabled. Defaults to false.
|
|||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
`config.ssh.forward_env` - A hash of host environment variable names to guest
|
||||||
|
environment variable names.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
`config.ssh.insert_key` - If `true`, Vagrant will automatically insert
|
`config.ssh.insert_key` - If `true`, Vagrant will automatically insert
|
||||||
a keypair to use for SSH, replacing Vagrant's default insecure key
|
a keypair to use for SSH, replacing Vagrant's default insecure key
|
||||||
inside the machine if detected. By default, this is true.
|
inside the machine if detected. By default, this is true.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user