Compare commits

...
Author SHA1 Message Date
Robby RussellandClaude Fable 5.1 beea7648bd fix(systemadmin): make the netstat fallback reachable
Six helpers were written as `ss ... | awk ... || netstat ... | awk ...`.
A pipeline exits with its last command's status, so a missing ss still
ended in awk exiting 0 and the netstat branch never ran. On systems
without ss, sortcons, sortconip, req20, timewait20, syn20 and port_pro
printed nothing.

Each helper now picks ss or netstat by whether ss is installed. con80
gets the same shape so the file has one idiom and no longer prints
"command not found: ss" on the way to netstat. Where both backends
share the same columns, the awk program is written once.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 13:45:11 -07:00
Robby RussellandClaude Fable 5.1 e92273d8b6 feat(systemadmin)!: match ports 80 and 443 in con80, req20 and http20
The three helpers hard-coded port 80. Most web traffic is HTTPS now, so
counting port 80 alone misses most of it. With no argument they now
match 80 and 443 together; passing one or more ports narrows them to
those (`con80 8080 8443`).

http20 also moves -c before the filter expression, since BSD getopt
stops at the first non-option argument.

BREAKING CHANGE: con80, req20 and http20 now include port 443 by
default. Pass the port explicitly (`con80 80`) to get the old behavior.

Closes #14114

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 13:38:08 -07:00
Erik Huizinga e0d3557e14 fix(gradle): remove echo when running gradlew (#12893) 2026-09-21 13:28:03 -07:00
mattmc3 b6830a53d5 feat(otp): honour OTP_HOME and XDG_DATA_HOME (#12953) 2026-09-21 13:27:12 -07:00
manysuqandmanysuq fa82d8a3eb fix(frontend-search): use fallback search for dead dartlang docs URL (#14112)
Co-authored-by: manysuq <manysuq@users.noreply.github.com>
2026-09-21 13:14:56 -07:00
6 changed files with 60 additions and 36 deletions
@@ -57,7 +57,7 @@ function frontend() {
codepen 'https://codepen.io/search/pens?q='
compassdoc 'http://compass-style.org/search?q='
cssflow 'http://www.cssflow.com/search?q='
dartlang 'https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:'
dartlang $(_frontend_fallback 'dart.dev')
emberjs $(_frontend_fallback 'emberjs.com/')
flowtype $(_frontend_fallback 'flow.org/en/docs/')
fontello 'http://fontello.com/#search='
-1
View File
@@ -15,7 +15,6 @@ function gradle-or-gradlew() {
# if gradlew found, run it instead of gradle
if [[ -f "$project_root/gradlew" ]]; then
echo "executing gradlew instead of gradle"
"$project_root/gradlew" "$@"
else
command gradle "$@"
+3 -1
View File
@@ -19,4 +19,6 @@ Provided aliases:
- `ot`: generates a MFA code based on the given key and copies it to the clipboard
(on Linux it relies on xsel, on MacOS X it uses pbcopy instead).
The plugin uses `$HOME/.otp` to store its internal files.
The plugin stores its internal files in `$OTP_HOME`, which can be set in your zshrc.
If `$OTP_HOME` is not set it defaults to either `$HOME/.otp` or `$XDG_DATA_HOME/otp`,
depending on whether `~/.otp` already exists, or whether `$XDG_DATA_HOME` is set.
+7 -1
View File
@@ -1,4 +1,10 @@
export OTP_HOME=~/.otp
if [[ -z "$OTP_HOME" ]]; then
if [[ ! -d "$HOME/.otp" ]] && [[ -n "$XDG_DATA_HOME" ]]; then
export OTP_HOME="$XDG_DATA_HOME/otp"
else
export OTP_HOME=~/.otp
fi
fi
mkdir -p $OTP_HOME
function ot () {
+3 -3
View File
@@ -33,10 +33,10 @@ plugins=(... systemadmin)
| killit | Kills any process that matches a regular expression passed to it |
| tree | List contents of directories in a tree-like format (if tree isn't installed) |
| sortcons | Sort connections by state |
| con80 | View all 80 Port Connections |
| con80 | View all connections on ports 80 and 443, or on the ports given as arguments (`con80 8080`) |
| sortconip | On the connected IP sorted by the number of connections |
| req20 | List the top 20 requests on port 80 |
| http20 | List the top 20 connections to port 80 based on tcpdump data |
| req20 | List the top 20 requests on ports 80 and 443, or on the ports given as arguments (`req20 8080`) |
| http20 | List the top 20 connections to ports 80 and 443 based on tcpdump data, or to the ports given as arguments |
| timewait20 | List the top 20 time_wait connections |
| syn20 | List the top 20 SYN connections |
| port_pro | Output all processes according to the port number |
+46 -29
View File
@@ -65,60 +65,77 @@ fi
# Sort connection state
function sortcons() {
{
LANG= ss -nat | awk 'NR > 1 {print $1}' \
|| LANG= netstat -nat | awk 'NR > 2 {print $6}'
} | sort | uniq -c | sort -rn
if (( $+commands[ss] )); then
LANG= ss -nat | awk 'NR > 1 {print $1}'
else
LANG= netstat -nat | awk 'NR > 2 {print $6}'
fi | sort | uniq -c | sort -rn
}
# View all 80 Port Connections
# View all connections on the given ports (default 80 and 443)
function con80() {
{
LANG= ss -nat || LANG= netstat -nat
} | grep -E ":80[^0-9]" | wc -l
local -a ports=($@)
(( $# )) || ports=(80 443)
if (( $+commands[ss] )); then
LANG= ss -nat
else
LANG= netstat -nat
fi | grep -E ":(${(j:|:)ports})[^0-9]" | wc -l
}
# On the connected IP sorted by the number of connections
function sortconip() {
{
LANG= ss -ntu | awk 'NR > 1 {print $6}' \
|| LANG= netstat -ntu | awk 'NR > 2 {print $5}'
} | cut -d: -f1 | sort | uniq -c | sort -n
if (( $+commands[ss] )); then
LANG= ss -ntu | awk 'NR > 1 {print $6}'
else
LANG= netstat -ntu | awk 'NR > 2 {print $5}'
fi | cut -d: -f1 | sort | uniq -c | sort -n
}
# top20 of Find the number of requests on 80 port
# top20 of Find the number of requests on the given ports (default 80 and 443)
function req20() {
{
LANG= ss -tn | awk '$4 ~ /:80$/ {print $5}' \
|| LANG= netstat -tn | awk '$4 ~ /:80$/ {print $5}'
} | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n 20
local -a ports=($@)
(( $# )) || ports=(80 443)
if (( $+commands[ss] )); then
LANG= ss -tn
else
LANG= netstat -tn
fi | awk -v ports="${(j:|:)ports}" '$4 ~ ":("ports")$" {print $5}' \
| awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n 20
}
# top20 of Using tcpdump port 80 access to view
# top20 of Using tcpdump to view access to the given ports (default 80 and 443)
function http20() {
sudo tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -n 20
local -a ports=($@)
(( $# )) || ports=(80 443)
sudo tcpdump -i eth0 -tnn -c 1000 "dst port ${(j: or :)ports}" | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -n 20
}
# top20 of Find time_wait connection
function timewait20() {
{
LANG= ss -nat | awk 'NR > 1 && /TIME-WAIT/ {print $5}' \
|| LANG= netstat -nat | awk 'NR > 2 && /TIME_WAIT/ {print $5}'
} | sort | uniq -c | sort -rn | head -n 20
if (( $+commands[ss] )); then
LANG= ss -nat
else
LANG= netstat -nat
fi | awk '/TIME[-_]WAIT/ {print $5}' | sort | uniq -c | sort -rn | head -n 20
}
# top20 of Find SYN connection
function syn20() {
{
LANG= ss -an | awk '/SYN/ {print $5}' \
|| LANG= netstat -an | awk '/SYN/ {print $5}'
} | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n20
if (( $+commands[ss] )); then
LANG= ss -an
else
LANG= netstat -an
fi | awk '/SYN/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n20
}
# Printing process according to the port number
function port_pro() {
LANG= ss -ntlp | awk "NR > 1 && /:${1:-}/ {print \$6}" | sed 's/.*pid=\([^,]*\).*/\1/' \
|| LANG= netstat -ntlp | awk "NR > 2 && /:${1:-}/ {print \$7}" | cut -d/ -f1
if (( $+commands[ss] )); then
LANG= ss -ntlp | awk "NR > 1 && /:${1:-}/ {print \$6}" | sed 's/.*pid=\([^,]*\).*/\1/'
else
LANG= netstat -ntlp | awk "NR > 2 && /:${1:-}/ {print \$7}" | cut -d/ -f1
fi
}
# top10 of gain access to the ip address