-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtask4_1.sh
More file actions
executable file
·109 lines (90 loc) · 3.59 KB
/
task4_1.sh
File metadata and controls
executable file
·109 lines (90 loc) · 3.59 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
99
100
101
102
103
104
105
106
107
108
109
#!/bin/bash
# Install dmidecode if not present (required for hardware fields)
if ! command -v dmidecode &>/dev/null; then
apt-get update -qq
apt-get install -y -qq dmidecode
fi
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
OUTPUT_FILE="$SCRIPT_DIR/task4_1.out"
# Returns a DMI string value, or empty string when the value is not available
dmi_get() {
local val
val=$(dmidecode -s "$1" 2>/dev/null | grep -v "^#" | head -1 \
| sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
case "$val" in
"" | "Not Specified" | "Not Present" | "Unknown" \
| "To Be Filled By O.E.M." | "Default string")
echo "" ;;
*)
echo "$val" ;;
esac
}
{
# ------------------------------------------------------------------ Hardware
echo "--- Hardware ---"
cpu=$(grep -m1 "model name" /proc/cpuinfo \
| cut -d: -f2 | sed 's/^[[:space:]]*//')
echo "CPU: ${cpu:-Unknown}"
ram=$(awk '/MemTotal/ { printf "%d MB", $2/1024 }' /proc/meminfo)
echo "RAM: ${ram:-Unknown}"
mb_mfr=$(dmi_get baseboard-manufacturer)
mb_prod=$(dmi_get baseboard-product-name)
[ -z "$mb_prod" ] && mb_prod="Unknown"
if [ -n "$mb_mfr" ]; then
echo "Motherboard: $mb_mfr $mb_prod"
else
echo "Motherboard: $mb_prod"
fi
serial=$(dmi_get system-serial-number)
echo "System Serial Number: ${serial:-Unknown}"
# ------------------------------------------------------------------- System
echo "--- System ---"
os=$(lsb_release -d --short 2>/dev/null \
|| awk -F'"' '/PRETTY_NAME/ {print $2}' /etc/os-release 2>/dev/null \
|| echo "Unknown")
echo "OS Distribution: $os"
echo "Kernel version: $(uname -r)"
# Use tune2fs on the root device; fall back to /lost+found ctime
root_dev=$(df / | awk 'NR==2 {print $1}')
inst_date=$(tune2fs -l "$root_dev" 2>/dev/null \
| grep "Filesystem created:" \
| sed 's/.*Filesystem created:[[:space:]]*//')
if [ -z "$inst_date" ]; then
inst_date=$(stat -c %z /lost+found 2>/dev/null \
| awk '{print $1, $2}' \
| xargs -I{} date -d "{}" "+%a %b %d %T UTC %Y" 2>/dev/null \
|| echo "Unknown")
fi
echo "Installation date: $inst_date"
echo "Hostname: $(hostname)"
# Build uptime string using only allowed words: weeks days hours minutes
total_secs=$(awk '{print int($1)}' /proc/uptime)
total_mins=$((total_secs / 60))
up_w=$((total_mins / 10080))
up_d=$(( (total_mins % 10080) / 1440 ))
up_h=$(( (total_mins % 1440) / 60 ))
up_m=$((total_mins % 60))
up_parts=()
[ "$up_w" -gt 0 ] && up_parts+=("$up_w weeks")
[ "$up_d" -gt 0 ] && up_parts+=("$up_d days")
[ "$up_h" -gt 0 ] && up_parts+=("$up_h hours")
[ "$up_m" -gt 0 ] && up_parts+=("$up_m minutes")
[ "${#up_parts[@]}" -eq 0 ] && up_parts=("0 minutes")
up_str=""
for part in "${up_parts[@]}"; do
up_str="${up_str:+$up_str, }$part"
done
echo "Uptime: $up_str"
echo "Processes running: $(ps --no-headers -e | wc -l)"
echo "Users logged in: $(who | wc -l)"
# ------------------------------------------------------------------ Network
echo "--- Network ---"
# List all interfaces (including loopback, VLANs, TAP, etc.)
ip link show \
| awk '/^[0-9]+:/ { gsub(/:$/, "", $2); gsub(/@.*/, "", $2); print $2 }' \
| while IFS= read -r iface; do
ips=$(ip -o -4 addr show dev "$iface" 2>/dev/null \
| awk '{print $4}' | paste -sd ', ')
echo "$iface: ${ips:--}"
done
} > "$OUTPUT_FILE"