added an edit command

git-svn-id: file:///home/svn/incoming/trunk@3217 4d416f70-5f16-0410-b530-b9f4589650da
unstable
Matt Miller 2005-12-13 15:25:24 +00:00
parent 2190d94a7c
commit 255f149799
2 changed files with 66 additions and 20 deletions

View File

@ -78,17 +78,27 @@ Separator = "\\"
dest += File::SEPARATOR + ::File.basename(src)
end
# Open the file on the remote side for writing and read
# all of the contents of the local file
dest_fd = client.fs.file.new(dest, "wb")
src_buf = ::IO.readlines(src).join
dest_fd.write(src_buf)
dest_fd.close
upload_file(dest, src)
stat.call('uploaded', src, dest) if (stat)
}
end
#
# Upload a single file.
#
def File.upload_file(dest_file, src_file)
# Open the file on the remote side for writing and read
# all of the contents of the local file
dest_fd = client.fs.file.new(dest_file, "wb")
src_buf = ::IO.readlines(src_file).join
begin
dest_fd.write(src_buf)
ensure
dest_fd.close
end
end
#
# Download one or more files from the remote computer to the local
# directory supplied in destination.
@ -103,24 +113,30 @@ Separator = "\\"
dest += ::File::SEPARATOR + File.basename(src)
end
src_fd = client.fs.file.new(src, "rb")
dst_fd = ::File.new(dest, "wb")
# Keep transferring until EOF is reached...
begin
while ((data = src_fd.read) != nil)
dst_fd.write(data)
end
rescue EOFError
end
src_fd.close
dst_fd.close
download_file(dest, src)
stat.call('downloaded', src, dest) if (stat)
}
end
#
# Download a single file.
#
def File.download_file(dest_file, src_file)
src_fd = client.fs.file.new(src_file, "rb")
dst_fd = ::File.new(dest_file, "wb")
# Keep transferring until EOF is reached...
begin
while ((data = src_fd.read) != nil)
dst_fd.write(data)
end
rescue EOFError
ensure
src_fd.close
dst_fd.close
end
end
##
#

View File

@ -1,3 +1,4 @@
require 'tempfile'
require 'rex/post/meterpreter'
module Rex
@ -35,6 +36,7 @@ class Console::CommandDispatcher::Stdapi::Fs
"cat" => "Read the contents of a file to the screen",
"cd" => "Change directory",
"download" => "Download a file or directory",
"edit" => "Edit a file",
"getwd" => "Print working directory",
"ls" => "List files",
"mkdir" => "Make directory",
@ -141,6 +143,34 @@ class Console::CommandDispatcher::Stdapi::Fs
return true
end
#
# Downloads a file to a temporary file, spawns and editor, and then uploads
# the contents to the remote machine after completion.
#
def cmd_edit(*args)
if (args.length == 0)
print_line("Usage: edit file")
return true
end
# Get a temporary file path
temp_path = Tempfile.new('meterp').path
# Download the remote file to the temporary file
client.fs.file.download_file(temp_path, args[0])
# Spawn the editor
editor = ENV['EDITOR'] || 'vi'
# If it succeeds, upload it to the remote side.
if (system("#{editor} #{temp_path}") == true)
client.fs.file.upload_file(args[0], temp_path)
end
# Get rid of that pesky temporary file
::File.unlink(temp_path)
end
#
# Lists files
#