Module: Rex::Post::Sql::Ui::Console
- Included in:
- MSSQL::Ui::Console, MySQL::Ui::Console, PostgreSQL::Ui::Console
- Defined in:
- lib/rex/post/sql/ui/console.rb,
lib/rex/post/sql/ui/console/command_dispatcher.rb,
lib/rex/post/sql/ui/console/interactive_sql_client.rb,
lib/rex/post/sql/ui/console/command_dispatcher/core.rb,
lib/rex/post/sql/ui/console/command_dispatcher/client.rb
Overview
Base console class for Generic SQL consoles
Defined Under Namespace
Modules: CommandDispatcher, InteractiveSqlClient
Instance Attribute Summary
Attributes included from Ui::Text::DispatcherShell
#blocked, #busy, #dispatcher_stack
Attributes included from Ui::Text::Shell
#cont_flag, #cont_prompt, #disable_output, #framework, #hist_last_saved, #histfile, #history_manager, #input, #local_hostname, #local_username, #log_source, #name, #on_command_proc, #on_print_proc, #output, #prompt, #prompt_char, #stop_count, #stop_flag, #tab_complete_proc
Instance Method Summary collapse
- #current_database ⇒ Object
- #format_prompt(val) ⇒ String
- #help_to_s(opts = {}) ⇒ String
-
#interact(&block) ⇒ Integer
Called when someone wants to interact with an SQL client.
-
#interact_with_client(client_dispatcher: nil) ⇒ Object
Interacts with the supplied client.
-
#interact_with_client_notification ⇒ String
Notification to display when initially interacting with the client via the query_interactive command.
-
#log_error(msg) ⇒ Object
Log that an error occurred.
-
#queue_cmd(cmd) ⇒ Object
Queues a command to be run when the interactive loop is entered.
-
#run_command(dispatcher, method, arguments) ⇒ FalseClass
Runs the specified command wrapper in something to catch meterpreter exceptions.
-
#sql_prompt ⇒ String
Create prompt via client and session data.
Methods included from Rex::Post::SessionCompatibleModules
#format_session_compatible_modules, #session_compatible_modules
Methods included from Ui::Text::DispatcherShell
#append_dispatcher, #block_command, #blocked_command?, #current_dispatcher, #destack_dispatcher, #enstack_dispatcher, #initialize, #remove_dispatcher, #run_single, #shellsplitex, #tab_complete, #tab_complete_helper, #tab_complete_stub, #unblock_command, #unknown_command
Methods included from Ui::Text::Shell
#_print_prompt, #get_input_line, #init_tab_complete, #init_ui, #initialize, #log_input, #log_output, #parse_line, #print, #print_error, #print_good, #print_line, #print_status, #print_warning, #prompt_yesno, #reset_ui, #run, #set_log_source, #stop, #stopped?, #supports_color?, #tab_complete, #unset_log_source, #update_prompt, #with_history_manager_context
Methods included from Ui::Text::Resource
Instance Method Details
#current_database ⇒ Object
132 133 134 |
# File 'lib/rex/post/sql/ui/console.rb', line 132 def current_database client.current_database end |
#format_prompt(val) ⇒ String
117 118 119 |
# File 'lib/rex/post/sql/ui/console.rb', line 117 def format_prompt(val) substitute_colors("%und#{sql_prompt}%clr > ", true) end |
#help_to_s(opts = {}) ⇒ String
76 77 78 |
# File 'lib/rex/post/sql/ui/console.rb', line 76 def help_to_s(opts = {}) super + format_session_compatible_modules end |
#interact(&block) ⇒ Integer
Called when someone wants to interact with an SQL client. It’s assumed that init_ui has been called prior.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/rex/post/sql/ui/console.rb', line 23 def interact(&block) # Run queued commands commands.delete_if do |ent| run_single(ent) true end # Run the interactive loop run do |line| # Run the command run_single(line) # If a block was supplied, call it, otherwise return false if block block.call else false end end end |
#interact_with_client(client_dispatcher: nil) ⇒ Object
Interacts with the supplied client.
101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/rex/post/sql/ui/console.rb', line 101 def interact_with_client(client_dispatcher: nil) return unless client_dispatcher interact_with_client_notification client.extend(InteractiveSqlClient) unless client.is_a?(InteractiveSqlClient) client.on_command_proc = self.on_command_proc if self.on_command_proc && client.respond_to?(:on_command_proc) client.on_print_proc = self.on_print_proc if self.on_print_proc && client.respond_to?(:on_print_proc) client.on_log_proc = method(:log_output) if self.respond_to?(:log_output, true) && client.respond_to?(:on_log_proc) client.client_dispatcher = client_dispatcher client.interact(input, output) client.reset_ui end |
#interact_with_client_notification ⇒ String
Notification to display when initially interacting with the client via the query_interactive command
84 85 86 87 88 |
# File 'lib/rex/post/sql/ui/console.rb', line 84 def interact_with_client_notification print_status("Starting interactive SQL shell for #{sql_prompt}") print_status('SQL commands ending with ; will be executed on the remote server. Use the %grnexit%clr command to exit.') print_line end |
#log_error(msg) ⇒ Object
Log that an error occurred.
124 125 126 127 128 129 130 |
# File 'lib/rex/post/sql/ui/console.rb', line 124 def log_error(msg) print_error(msg) elog(msg, session.type) dlog("Call stack:\n#{$ERROR_POSITION.join("\n")}", session.type) end |
#queue_cmd(cmd) ⇒ Object
Queues a command to be run when the interactive loop is entered.
48 49 50 |
# File 'lib/rex/post/sql/ui/console.rb', line 48 def queue_cmd(cmd) self.commands << cmd end |
#run_command(dispatcher, method, arguments) ⇒ FalseClass
Runs the specified command wrapper in something to catch meterpreter exceptions.
59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/rex/post/sql/ui/console.rb', line 59 def run_command(dispatcher, method, arguments) begin super rescue ::Timeout::Error log_error('Operation timed out.') rescue ::Rex::InvalidDestination => e log_error(e.) rescue ::Errno::EPIPE, ::OpenSSL::SSL::SSLError, ::IOError self.session.kill rescue ::StandardError => e log_error("Error running command #{method}: #{e.class} #{e}") elog(e) end end |
#sql_prompt ⇒ String
Create prompt via client and session data
94 95 96 |
# File 'lib/rex/post/sql/ui/console.rb', line 94 def sql_prompt "#{session.type} @ #{client.peerinfo}#{current_database.blank? ? '' : " (#{current_database})"}" end |