63 lines
1.1 KiB
Ruby
63 lines
1.1 KiB
Ruby
# -*- coding: binary -*-
|
|
module Rex
|
|
module Ui
|
|
module Text
|
|
|
|
###
|
|
#
|
|
# This class wraps the creation of an IRB shell.
|
|
#
|
|
###
|
|
class IrbShell
|
|
|
|
@@IrbInitialized = false
|
|
|
|
def initialize(binding)
|
|
@binding_ctx = binding
|
|
end
|
|
|
|
#
|
|
# Runs the IRB shell until completion. The binding parameter initializes
|
|
# IRB to the appropriate binding context.
|
|
#
|
|
def run
|
|
# Initialize IRB by setting up its internal configuration hash and
|
|
# stuff.
|
|
if (@@IrbInitialized == false)
|
|
load('irb.rb')
|
|
|
|
IRB.setup(nil)
|
|
IRB.conf[:PROMPT_MODE] = :SIMPLE
|
|
|
|
@@IrbInitialized = true
|
|
end
|
|
|
|
# Create a new IRB instance
|
|
irb = IRB::Irb.new(IRB::WorkSpace.new(@binding_ctx))
|
|
|
|
# Set the primary irb context so that exit and other intrinsic
|
|
# commands will work.
|
|
IRB.conf[:MAIN_CONTEXT] = irb.context
|
|
|
|
# Trap interrupt
|
|
old_sigint = trap("SIGINT") do
|
|
begin
|
|
irb.signal_handle
|
|
rescue RubyLex::TerminateLineInput
|
|
irb.eval_input
|
|
end
|
|
end
|
|
|
|
# Keep processing input until the cows come home...
|
|
catch(:IRB_EXIT) do
|
|
irb.eval_input
|
|
end
|
|
|
|
trap("SIGINT", old_sigint)
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|