Skip to content

Commit 26c2de0

Browse files
committed
Initial commit
0 parents  commit 26c2de0

File tree

6 files changed

+230
-0
lines changed

6 files changed

+230
-0
lines changed

.gitattributes

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Auto detect text files and perform LF normalization
2+
* text=auto

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/Release/*

Build.cmd

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
@echo off
2+
3+
set app=TorMon
4+
5+
set GOARCH=amd64
6+
7+
call :Build
8+
9+
set GOARCH=386
10+
11+
call :Build
12+
13+
pause
14+
15+
exit /b
16+
17+
:Build
18+
19+
set GOOS=windows
20+
set file=Release/%app%_%GOOS%_%GOARCH%.exe
21+
echo Building %file%...
22+
go build -o %file% %app%.go
23+
24+
set GOOS=linux
25+
set file=Release/%app%_%GOOS%_%GOARCH%
26+
echo Building %file%...
27+
go build -o %file% %app%.go
28+
29+
set GOOS=darwin
30+
set file=Release/%app%_%GOOS%_%GOARCH%.app
31+
echo Building %file%...
32+
go build -o %file% %app%.go
33+
34+
exit /b

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2021 ScriptTiger
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
[![Say Thanks!](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/thescripttiger%40gmail.com)
2+
3+
# TorMon
4+
Simple Tor controller for those that just want a single simple stand-alone compiled executable rather than needing to go through Python with STEM or other similar overly complex managed scripted projects utilizing countless dependency packages just to open a simple socket connection.
5+
6+
Usage:
7+
8+
TorMon [-host IP] [-port PORT] [-secret PASSWORD] [-cmd COMMAND]
9+
10+
By default, TorMon will connect to 127.0.0.1:9051 and attempt to authenticate to Tor without a password and begin an interactive session.
11+
12+
# More About ScriptTiger
13+
14+
For more ScriptTiger scripts and goodies, check out ScriptTiger's GitHub Pages website:
15+
https://scripttiger.github.io/
16+
17+
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=MZ4FH4G5XHGZ4)
18+
19+
Donate Monero (XMR): 441LBeQpcSbC1kgangHYkW8Tzo8cunWvtVK4M6QYMcAjdkMmfwe8XzDJr1c4kbLLn3NuZKxzpLTVsgFd7Jh28qipR5rXAjx

TorMon.go

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
package main
2+
3+
import "net"
4+
import "fmt"
5+
import "bufio"
6+
import "os"
7+
import "strings"
8+
import "flag"
9+
10+
func main() {
11+
12+
// Catch flags
13+
hostPtr := flag.String("host", "127.0.0.1", "host")
14+
portPtr := flag.String("port", "9051", "port")
15+
secretPtr := flag.String("secret", "", "secret")
16+
cmdPtr := flag.String("cmd", "", "cmd")
17+
18+
// Parse flags
19+
flag.Parse()
20+
21+
// Declare/initialize variables
22+
var text string
23+
console := bufio.NewReader(os.Stdin)
24+
conn, _ := net.Dial("tcp", *hostPtr+":"+*portPtr)
25+
26+
// Authenticate connection to Tor
27+
fmt.Fprintf(conn, "authenticate \""+*secretPtr+"\"\n")
28+
text, _ = bufio.NewReader(conn).ReadString('\n')
29+
if strings.TrimRight(text, "\r\n") != "250 OK" {os.Exit(0)}
30+
31+
// Initialize function for receiving and handling command output
32+
receive := func() {
33+
// Handle responses
34+
text = ""
35+
tor := bufio.NewScanner(conn)
36+
for tor.Scan() {
37+
text = tor.Text()
38+
if text == "250 OK" {
39+
break
40+
} else if text == "." {
41+
break
42+
} else if text == "250 closing connection" {
43+
os.Exit(0)
44+
} else if strings.HasPrefix(text, "250 ") {
45+
fmt.Println(strings.TrimPrefix(text, "250 "))
46+
break
47+
} else if strings.HasPrefix(text, "251 ") {
48+
fmt.Println(strings.TrimPrefix(text, "251 "))
49+
break
50+
} else if strings.HasPrefix(text, "252 ") {
51+
fmt.Println(strings.TrimPrefix(text, "252 "))
52+
break
53+
} else if strings.HasPrefix(text, "451 ") {
54+
fmt.Println(strings.TrimPrefix(text, "451 "))
55+
break
56+
} else if strings.HasPrefix(text, "500 ") {
57+
fmt.Println(strings.TrimPrefix(text, "500 "))
58+
break
59+
} else if strings.HasPrefix(text, "510 ") {
60+
fmt.Println(strings.TrimPrefix(text, "510 "))
61+
break
62+
} else if strings.HasPrefix(text, "511 ") {
63+
fmt.Println(strings.TrimPrefix(text, "511 "))
64+
break
65+
} else if strings.HasPrefix(text, "512 ") {
66+
fmt.Println(strings.TrimPrefix(text, "512 "))
67+
break
68+
} else if strings.HasPrefix(text, "513 ") {
69+
fmt.Println(strings.TrimPrefix(text, "513 "))
70+
break
71+
} else if strings.HasPrefix(text, "514 ") {
72+
fmt.Println(strings.TrimPrefix(text, "514 "))
73+
break
74+
} else if strings.HasPrefix(text, "515 ") {
75+
fmt.Println(strings.TrimPrefix(text, "515 "))
76+
break
77+
} else if strings.HasPrefix(text, "550 ") {
78+
fmt.Println(strings.TrimPrefix(text, "550 "))
79+
break
80+
} else if strings.HasPrefix(text, "551 ") {
81+
fmt.Println(strings.TrimPrefix(text, "551 "))
82+
break
83+
} else if strings.HasPrefix(text, "552 ") {
84+
fmt.Println(strings.TrimPrefix(text, "552 "))
85+
break
86+
} else if strings.HasPrefix(text, "553 ") {
87+
fmt.Println(strings.TrimPrefix(text, "553 "))
88+
break
89+
} else if strings.HasPrefix(text, "554 ") {
90+
fmt.Println(strings.TrimPrefix(text, "554 "))
91+
break
92+
} else if strings.HasPrefix(text, "555 ") {
93+
fmt.Println(strings.TrimPrefix(text, "555 "))
94+
break
95+
} else if strings.HasPrefix(text, "650 ") {
96+
fmt.Println(strings.TrimPrefix(text, "650 "))
97+
break
98+
} else {
99+
fmt.Println(text)
100+
}
101+
}
102+
}
103+
104+
// Send non-interactive command and exit
105+
if *cmdPtr != "" {
106+
fmt.Fprintf(conn, *cmdPtr+"\n")
107+
receive()
108+
fmt.Fprintf(conn, "quit\n")
109+
os.Exit(0)
110+
}
111+
112+
113+
// Announce Tor version as banner
114+
fmt.Fprintf(conn, "getinfo version\n")
115+
text, _ = bufio.NewReader(conn).ReadString('\n')
116+
fmt.Print("Tor "+strings.TrimPrefix(text, "250-version="))
117+
118+
for {
119+
120+
loop:
121+
text = ""
122+
123+
// Command prompt
124+
fmt.Print("> ")
125+
text, _ = console.ReadString('\n')
126+
127+
// Internal TorMon commands
128+
switch strings.ToLower(strings.TrimRight(text, "\r\n")) {
129+
case "help":
130+
fmt.Print("getinfo config/names\ngetinfo signal/names\ngetinfo info/names\nquit\n")
131+
goto loop
132+
}
133+
134+
// Send Tor command
135+
fmt.Fprintf(conn, text)
136+
137+
// Handle special Tor commands
138+
switch strings.ToLower(strings.TrimRight(text, "\r\n")) {
139+
case "signal shutdown":
140+
os.Exit(0)
141+
case "signal halt":
142+
os.Exit(0)
143+
case "signal int":
144+
os.Exit(0)
145+
case "signal term":
146+
os.Exit(0)
147+
}
148+
149+
// Receive command output
150+
receive()
151+
152+
}
153+
}

0 commit comments

Comments
 (0)