diff --git a/plugins/guests/linux/cap/insert_public_key.rb b/plugins/guests/linux/cap/insert_public_key.rb index f238cd9a1..b7335bdc5 100644 --- a/plugins/guests/linux/cap/insert_public_key.rb +++ b/plugins/guests/linux/cap/insert_public_key.rb @@ -1,19 +1,29 @@ -require "vagrant/util/shell_quote" - module VagrantPlugins module GuestLinux module Cap class InsertPublicKey def self.insert_public_key(machine, contents) + comm = machine.communicate contents = contents.chomp - contents = Vagrant::Util::ShellQuote.escape(contents, "'") - machine.communicate.tap do |comm| - comm.execute("mkdir -p ~/.ssh") - comm.execute("chmod 0700 ~/.ssh") - comm.execute("printf '#{contents}\\n' >> ~/.ssh/authorized_keys") - comm.execute("chmod 0600 ~/.ssh/authorized_keys") + remote_path = "/tmp/vagrant-authorized-keys-#{Time.now.to_i}" + Tempfile.open("vagrant-linux-insert-public-key") do |f| + f.binmode + f.write(contents) + f.fsync + f.close + comm.upload(f.path, remote_path) end + + comm.execute <<-EOH.gsub(/^ {12}/, '') + mkdir -p ~/.ssh + chmod 0700 ~/.ssh + cat '#{remote_path}' >> ~/.ssh/authorized_keys + chmod 0600 ~/.ssh/authorized_keys + + # Remove the temporary file + rm -f '#{remote_path}' + EOH end end end diff --git a/test/unit/plugins/guests/linux/cap/insert_public_key_test.rb b/test/unit/plugins/guests/linux/cap/insert_public_key_test.rb new file mode 100644 index 000000000..704f2161d --- /dev/null +++ b/test/unit/plugins/guests/linux/cap/insert_public_key_test.rb @@ -0,0 +1,32 @@ +require_relative "../../../../base" + +describe "VagrantPlugins::GuestLinux::Cap::InsertPublicKey" do + let(:caps) do + VagrantPlugins::GuestLinux::Plugin + .components + .guest_capabilities[:linux] + end + + let(:machine) { double("machine") } + let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) } + + before do + allow(machine).to receive(:communicate).and_return(comm) + end + + after do + comm.verify_expectations! + end + + describe ".insert_public_key" do + let(:cap) { caps.get(:insert_public_key) } + + it "inserts the public key" do + cap.insert_public_key(machine, "ssh-rsa ...") + expect(comm.received_commands[0]).to match(/mkdir -p ~\/.ssh/) + expect(comm.received_commands[0]).to match(/chmod 0700 ~\/.ssh/) + expect(comm.received_commands[0]).to match(/cat '\/tmp\/vagrant-(.+)' >> ~\/.ssh\/authorized_keys/) + expect(comm.received_commands[0]).to match(/chmod 0600 ~\/.ssh\/authorized_keys/) + end + end +end