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 +4 -4
- data/Rakefile +7 -0
- data/kscript.gemspec +2 -7
- data/lib/kscript/base.rb +1 -9
- data/lib/kscript/cli.rb +0 -2
- data/lib/kscript/logger.rb +3 -5
- data/lib/kscript/plugins/kk_ip_utils.rb +0 -3
- data/lib/kscript/plugins/kk_jenkins_utils.rb +0 -6
- data/lib/kscript/plugins/kk_kibana_utils.rb +0 -1
- data/lib/kscript/plugins/kk_optimize_utils.rb +0 -1
- data/lib/kscript/plugins/kk_portscan_utils.rb +54 -16
- data/lib/kscript/plugins/kk_projscan_utils.rb +0 -1
- data/lib/kscript/plugins/kk_sh_utils.rb +0 -1
- data/lib/kscript/plugins/kk_wg_pass_utils.rb +0 -1
- data/lib/kscript/utils.rb +0 -7
- data/lib/kscript/version.rb +1 -1
- data/lib/kscript.rb +17 -0
- metadata +42 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 812d19779e0fadd4fc72f94999c3d8776a2391147c467c14067d203050c94c01
|
4
|
+
data.tar.gz: adad5fb5f74798030650f6595f8e90fc86eacfb490a4b7bb5c2fefca1d4552d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2fff6ee0202f526fb11452d3848ce5d2c0f872bb6c457ebbf8dec4f55e45c0532fbd1b8daddc0d58133814c83553ef6a9f8e063c1ef4812bdf9bd4c869ec364
|
7
|
+
data.tar.gz: 6866406cb4c5fd9c74b079c636d778171099db330309f38e13dcfd85f2adbdcd3aa2d96a453b8ad46f46fc505353d4c175b0c40a41732743da7073ce386f2c43
|
data/Rakefile
CHANGED
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
|
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
data/lib/kscript/logger.rb
CHANGED
@@ -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
|
-
|
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.
|
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]}"
|
@@ -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 =
|
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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
-
|
50
|
-
|
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
|
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
|
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']
|
data/lib/kscript/version.rb
CHANGED
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.
|
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
|