-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshellbot.sh
More file actions
executable file
·98 lines (88 loc) · 2.4 KB
/
shellbot.sh
File metadata and controls
executable file
·98 lines (88 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/bin/bash
directory="$(dirname $(realpath $0))"
source $directory/config.sh
last_id=0
reply_to_message() {
curl -s "$tele_url/sendMessage" \
--data-urlencode "chat_id=$1" \
--data-urlencode "reply_to_message_id=$2" \
--data-urlencode "text=$3"
}
send() {
curl -s "$tele_url/sendMessage" \
--data-urlencode "chat_id=$1" \
--data-urlencode "text=$2"
}
check_update() {
updates="$(curl -s "$tele_url/getUpdates" \
--data-urlencode "offset=$(($last_id + 1))" \
--data-urlencode "timeout=5")"
updates_count=$(echo "$updates" | jq -r ".result | length")
last_id=$(echo "$updates" | jq -r ".result[$(( "$updates_count" - 1 ))].update_id")
}
parse_json() {
message="$(echo "$updates" | jq ".result[$i].message")"
chat_id="$(echo "$message" | jq ".chat.id")"
message_text="$(echo "$message" | jq ".text")"
message_id="$(echo "$message" | jq ".message_id")"
reply_id="$(echo "$message" | jq ".reply_to_message.message_id")"
from_id="$(echo "$message" | jq ".from.id")"
}
write_log() {
date +%F-%T >> $directory/shell.log
echo "$updates" | jq ".result[$i]" >> $directory/shell.log
}
alert() {
if [[ "$enable_alert" == "true" ]]; then
for master_id in ${master_ids[*]}; do
send "$master_id" "Message from unauthorized users:
$message"
done
fi
}
admin_log() {
date +%F-%T >> $directory/admin.log
echo "User $1 not in master_ids list. Check your bot privacy settings.
Message:
$message" >> $directory/admin.log
}
bash_command() {
matches=0
for master_id in ${master_ids[*]}; do
if [[ "$from_id" == "$master_id" ]]; then
matches=$(($matches + 1))
fi
done
if [[ $matches == 1 ]]; then
response_text="$(bash -c "$message_text 2>&1")"
while [ ${#response_text} -gt $response_length ]; do
reply_to_message "$chat_id" "$message_id" "${response_text:0:response_length}"
response_text=${response_text:response_length}
done
reply_to_message "$chat_id" "$message_id" "$response_text"
else
admin_log $from_id
alert
fi
}
while true; do
ping -c1 $(echo "$tele_url" | cut -d '/' -f 3) 2>&1 > /dev/null && {
check_update
for ((i=0; i<"$updates_count"; i++)); do
parse_json
write_log
if [[ $message_text == 'null' ]]; then
continue
fi
message_text="$(echo "$message_text" | sed --sandbox 's#\\"#"#g;s#\\\\#\\#g;s/^"//;s/"$//')"
case $message_text in
'ping'*)
reply_to_message "$chat_id" "$message_id" "pong"
;;
*)
bash_command
;;
esac
done
}
done