kscript 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c190f7d80e71baae5ec95db4f903cdc3ef98ea7403d5025eb9fcda0c4be18cc
4
- data.tar.gz: f3150fac2025ac947c4e24b0dda29dee0e08f8cf4b2528322a64cfd6296f8e4b
3
+ metadata.gz: 812d19779e0fadd4fc72f94999c3d8776a2391147c467c14067d203050c94c01
4
+ data.tar.gz: adad5fb5f74798030650f6595f8e90fc86eacfb490a4b7bb5c2fefca1d4552d7
5
5
  SHA512:
6
- metadata.gz: 2b522f1d8c390648132e3419e7ad186aa6acb4fdec572f37428f0697a076bde0f330bf0f035c08b833f60e5fbd31424b36bd2c3830973f72051b9aad9553e2b0
7
- data.tar.gz: c3428e2286edec3f3a5a75208c37803660fb7a0f47047e5c6e122d7f4c547dfc64a046cada3ad8a1aafbfaeccb6374bdcd3bfbf2e749bf7ffe453396f59be645
6
+ metadata.gz: e2fff6ee0202f526fb11452d3848ce5d2c0f872bb6c457ebbf8dec4f55e45c0532fbd1b8daddc0d58133814c83553ef6a9f8e063c1ef4812bdf9bd4c869ec364
7
+ data.tar.gz: 6866406cb4c5fd9c74b079c636d778171099db330309f38e13dcfd85f2adbdcd3aa2d96a453b8ad46f46fc505353d4c175b0c40a41732743da7073ce386f2c43
data/Rakefile CHANGED
@@ -33,3 +33,10 @@ task :dev do
33
33
  kscript version
34
34
  SHELL
35
35
  end
36
+
37
+ task :install do
38
+ sh <<-SHELL
39
+ gem uninstall kscript -aIx
40
+ gem install kscript
41
+ SHELL
42
+ end
data/kscript.gemspec CHANGED
@@ -27,7 +27,9 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ['lib']
28
28
 
29
29
  # Runtime dependencies
30
+ spec.add_dependency 'bcrypt', '>= 3.1', '< 4.0'
30
31
  spec.add_dependency 'http', '>= 4.0', '< 6.0'
32
+ spec.add_dependency 'nokogiri', '>= 1.13', '< 2.0'
31
33
  spec.add_dependency 'thor', '1.3.2'
32
34
 
33
35
  # Development dependencies
@@ -35,11 +37,4 @@ Gem::Specification.new do |spec|
35
37
  spec.metadata['rubygems_mfa_required'] = 'true'
36
38
 
37
39
  # spec.extensions = ['ext/install.rb'] # 已移除,防止 native extension build 错误
38
-
39
- spec.post_install_message = <<~MSG
40
- [kscript] Shell completion is available!
41
- To enable shell completion for your shell, please run:
42
- ruby ext/install.rb
43
- Or see README for more details.
44
- MSG
45
40
  end
data/lib/kscript/base.rb CHANGED
@@ -7,11 +7,9 @@ module Kscript
7
7
  class Base
8
8
  attr_reader :logger
9
9
 
10
- def initialize(service: nil, log_level: nil, trace_id: nil)
10
+ def initialize(service: nil, log_level: nil)
11
11
  config = defined?(Kscript::Utils::Config) ? Kscript::Utils::Config.load : nil
12
12
  log_level ||= config&.log_level || ENV['KSCRIPT_LOG_LEVEL'] || :info
13
- trace_id ||= config&.trace_id || ENV['KSCRIPT_TRACE_ID']
14
- @trace_id = trace_id
15
13
  @logger = Kscript::Logger.new(service: service || self.class.name, level: log_level)
16
14
  @logger.set_human_output(human_output?)
17
15
  end
@@ -24,12 +22,6 @@ module Kscript
24
22
  exit(1)
25
23
  end
26
24
 
27
- # 提供 trace_id 给 logger
28
- def logger
29
- @logger.define_singleton_method(:default_trace_id) { @trace_id } if @trace_id
30
- @logger
31
- end
32
-
33
25
  # 自动注册所有 Kscript::Base 的子类为插件
34
26
  def self.inherited(subclass)
35
27
  name = subclass.name.split('::').last
data/lib/kscript/cli.rb CHANGED
@@ -1,9 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'kscript'
4
- require 'io/console'
5
4
  require 'kscript/banner'
6
- require 'thor'
7
5
 
8
6
  module Kscript
9
7
  class CLI < Thor
@@ -45,19 +45,17 @@ module Kscript
45
45
  end
46
46
 
47
47
  def log(level, message, context = {})
48
- trace_id = context[:trace_id] || (respond_to?(:default_trace_id) ? default_trace_id : nil) || SecureRandom.hex(8)
49
48
  entry = {
50
49
  timestamp: Time.now.utc.iso8601,
51
50
  level: level.to_s.upcase,
52
51
  service: @service,
53
52
  message: message,
54
- trace_id: trace_id,
55
- context: context.reject { |k, _| k == :trace_id }
53
+ context: context
56
54
  }
57
55
  @logger.send(level, entry.to_json)
58
56
  end
59
57
 
60
- # 极客风格终端输出
58
+ # 终端输出
61
59
  def klog(level, message, context = {})
62
60
  if human_output?
63
61
  puts "[#{level.to_s.upcase}] #{message} #{context.map { |k, v| "#{k}=#{v}" }.join(' ')}".strip
@@ -67,7 +65,7 @@ module Kscript
67
65
  svc = @service || 'kscript'
68
66
  trace = context[:trace_id] || (respond_to?(:default_trace_id) ? default_trace_id : nil) || '-'
69
67
  color = COLORS[level] || COLORS[:info]
70
- ctx_str = context.reject { |k, _| k == :trace_id }.map { |k, v| "#{k}=#{v}" }.join(' ')
68
+ ctx_str = context.map { |k, v| "#{k}=#{v}" }.join(' ')
71
69
  line = "[#{ts}] [#{lvl}] [#{svc}] [#{trace}] #{message}"
72
70
  line += " | #{ctx_str}" unless ctx_str.empty?
73
71
  $stdout.puts "#{color}#{line}#{COLORS[:reset]}"
@@ -7,9 +7,6 @@
7
7
 
8
8
  require 'kscript'
9
9
 
10
- require 'http'
11
- require 'json'
12
-
13
10
  module Kscript
14
11
  class KkIpUtils < Base
15
12
  IP_API_BASE_URL = 'http://ip-api.com/json'
@@ -6,12 +6,6 @@
6
6
  # https://opensource.org/licenses/MIT
7
7
 
8
8
  require 'kscript'
9
- require 'http'
10
- require 'base64'
11
- require 'rexml/document'
12
- require 'json'
13
- require 'fileutils'
14
- require 'kscript/base'
15
9
 
16
10
  module Kscript
17
11
  class KkJenkinsUtils < Base
@@ -6,7 +6,6 @@
6
6
  # https://opensource.org/licenses/MIT
7
7
 
8
8
  require 'kscript'
9
- require 'securerandom'
10
9
 
11
10
  module Kscript
12
11
  class KkKibanaUtils < Base
@@ -6,7 +6,6 @@
6
6
  # https://opensource.org/licenses/MIT
7
7
 
8
8
  require 'kscript'
9
- require 'open3'
10
9
 
11
10
  module Kscript
12
11
  class KkOptimizeUtils < Base
@@ -6,8 +6,6 @@
6
6
  # https://opensource.org/licenses/MIT
7
7
 
8
8
  require 'kscript'
9
- require 'socket'
10
- require 'timeout'
11
9
 
12
10
  module Kscript
13
11
  class KkPortscanUtils < Base
@@ -17,10 +15,11 @@ module Kscript
17
15
  # @param host [String] target host to scan
18
16
  # @param ports [Array<Integer>] list of ports to scan
19
17
  # @param thread_count [Integer] number of concurrent threads
20
- def initialize(target = nil, ports = (1..1024), *_args, **opts)
18
+ def initialize(target = nil, ports = (1..1024), thread_count = 50, *_args, **opts)
21
19
  super(**opts.merge(service: 'kk_port_scanner'))
22
20
  @target = target
23
- @ports = ports.is_a?(Range) ? ports : (1..1024)
21
+ @ports = parse_ports(ports)
22
+ @thread_count = (opts[:thread_count] || thread_count || 50).to_i
24
23
  end
25
24
 
26
25
  def run
@@ -31,23 +30,62 @@ module Kscript
31
30
 
32
31
  # Execute port scanning using multiple threads
33
32
  def scan
34
- msg = "Scanning #{@target} ports #{@ports}"
33
+ msg = "Scanning #{@target} ports #{@ports} with concurrency=#{@thread_count}"
35
34
  if human_output?
36
35
  puts msg
37
36
  else
38
37
  logger.kinfo(msg)
39
38
  end
40
- @ports.each do |port|
41
- Socket.tcp(@target, port, connect_timeout: 0.5) do |_sock|
42
- if human_output?
43
- puts "Port #{port} is open"
44
- else
45
- logger.kinfo('Port open', port: port)
46
- logger.kinfo("Port #{port} is open")
39
+ queue = Queue.new
40
+ @ports.each { |port| queue << port }
41
+ threads = []
42
+ @thread_count.times do
43
+ threads << Thread.new do
44
+ until queue.empty?
45
+ port = nil
46
+ begin
47
+ port = queue.pop(true)
48
+ rescue ThreadError
49
+ break
50
+ end
51
+ begin
52
+ Socket.tcp(@target, port, connect_timeout: 0.5) do |_sock|
53
+ if human_output?
54
+ puts "Port #{port} is open"
55
+ else
56
+ logger.kinfo('Port open', port: port)
57
+ logger.kinfo("Port #{port} is open")
58
+ end
59
+ end
60
+ rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT, SocketError
61
+ # closed or filtered
62
+ end
47
63
  end
48
64
  end
49
- rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT, SocketError
50
- # closed or filtered
65
+ end
66
+ threads.each(&:join)
67
+ end
68
+
69
+ # 支持多种端口参数格式: 22,80,443 或 1..1024
70
+ def parse_ports(ports)
71
+ return ports.to_a if ports.is_a?(Range)
72
+
73
+ if ports.is_a?(String)
74
+ if ports.include?(',')
75
+ ports.split(',').map(&:to_i)
76
+ elsif ports.include?('..')
77
+ begin
78
+ eval(ports).to_a
79
+ rescue StandardError
80
+ (1..1024).to_a
81
+ end
82
+ else
83
+ [ports.to_i]
84
+ end
85
+ elsif ports.is_a?(Array)
86
+ ports.map(&:to_i)
87
+ else
88
+ (1..1024).to_a
51
89
  end
52
90
  end
53
91
 
@@ -56,11 +94,11 @@ module Kscript
56
94
  end
57
95
 
58
96
  def self.arguments
59
- '<target_host>'
97
+ '<target_host> [ports] [thread_count]'
60
98
  end
61
99
 
62
100
  def self.usage
63
- "kscript portscan 192.168.1.1\nkscript portscan example.com --ports=22,80,443"
101
+ "kscript portscan 192.168.1.1\nkscript portscan example.com 22,80,443 100\nkscript portscan 192.168.1.1 1..1024 200"
64
102
  end
65
103
 
66
104
  def self.group
@@ -6,7 +6,6 @@
6
6
  # https://opensource.org/licenses/MIT
7
7
 
8
8
  require 'kscript'
9
- require 'json'
10
9
 
11
10
  module Kscript
12
11
  class KkProjscanUtils < Base
@@ -6,7 +6,6 @@
6
6
  # https://opensource.org/licenses/MIT
7
7
 
8
8
  require 'kscript'
9
- require 'nokogiri'
10
9
 
11
10
  module Kscript
12
11
  class KkShUtils < Base
@@ -6,7 +6,6 @@
6
6
  # https://opensource.org/licenses/MIT
7
7
 
8
8
  require 'kscript'
9
- require 'bcrypt'
10
9
 
11
10
  module Kscript
12
11
  class KkWgPassUtils < Base
data/lib/kscript/utils.rb CHANGED
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'yaml'
4
- require 'fileutils'
5
-
6
3
  module Kscript
7
4
  module Utils
8
5
  class Config
@@ -24,10 +21,6 @@ module Kscript
24
21
  self['log_level']
25
22
  end
26
23
 
27
- def trace_id
28
- self['trace_id']
29
- end
30
-
31
24
  # 自动检测并安装 shell 补全脚本
32
25
  def self.ensure_completion_installed(shell = nil)
33
26
  shell ||= ENV['SHELL']
@@ -6,5 +6,5 @@
6
6
  # https://opensource.org/licenses/MIT
7
7
 
8
8
  module Kscript
9
- VERSION = '1.0.0'
9
+ VERSION = '1.0.2'
10
10
  end
data/lib/kscript.rb CHANGED
@@ -5,9 +5,26 @@
5
5
  # This software is released under the MIT License.
6
6
  # https://opensource.org/licenses/MIT
7
7
 
8
+ # Ruby 标准库
8
9
  require 'json'
9
10
  require 'logger'
10
11
  require 'securerandom'
12
+ require 'yaml'
13
+ require 'fileutils'
14
+ require 'base64'
15
+ require 'rexml/document'
16
+ require 'net/http'
17
+ require 'timeout'
18
+ require 'socket'
19
+ require 'open3'
20
+ require 'openssl'
21
+
22
+ # 第三方 gem
23
+ require 'http'
24
+ require 'bcrypt'
25
+ require 'nokogiri'
26
+ require 'thor'
27
+
11
28
  require 'kscript/plugins'
12
29
  require 'kscript/base'
13
30
  require 'kscript/logger'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kscript
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kk
@@ -10,6 +10,26 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2025-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bcrypt
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '4.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '4.0'
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: http
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -30,6 +50,26 @@ dependencies:
30
50
  - - "<"
31
51
  - !ruby/object:Gem::Version
32
52
  version: '6.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: nokogiri
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '1.13'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '2.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '1.13'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '2.0'
33
73
  - !ruby/object:Gem::Dependency
34
74
  name: thor
35
75
  requirement: !ruby/object:Gem::Requirement
@@ -104,11 +144,7 @@ licenses:
104
144
  - MIT
105
145
  metadata:
106
146
  rubygems_mfa_required: 'true'
107
- post_install_message: |
108
- [kscript] Shell completion is available!
109
- To enable shell completion for your shell, please run:
110
- ruby ext/install.rb
111
- Or see README for more details.
147
+ post_install_message:
112
148
  rdoc_options: []
113
149
  require_paths:
114
150
  - lib