Shell ΡΠΊΡΠΈΠΏΡ
Π― Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΊΡΠΈΠΏΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ΄Π΅Ρ.
ΠΠΈΡΠ΅Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΠ³ΠΎ, ΠΎΠ½ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ΅ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΈ ΡΠ°Π·Π΄Π΅Π»Π΅.
#!/usr/bin/env bash
# Display available disk space on specific server and partition
# default parameters
default_bastion=""
default_busername=""
default_server="localhost"
default_username="milosz"
default_partition="/srv"
# nextcloud server
nextcloud_server="nextcloud.local"
nextcloud_partition="/data"
# dokuwiki server
dokuwiki_bastion="bastion.example.org"
dokuwiki_busername="bouncer"
dokuwiki_server="192.0.2.10"
dokuwiki_username="dokuwiki"
dokuwiki_partition="/wiki"
# kolab server
kolab_bastion="bastion.example.org"
kolab_busername="bouncer"
kolab_server="192.0.2.20"
kolab_username="monitoring"
kolab_partition="/"
# get defined servers/applications
applications="$((set -o posix; set) | awk -F '=' '/_server/ {split($1,array,"_"); print array[1]}' | grep -v default)"
# get defined attributes
attributes="$((set -o posix; set) | awk -F '=' '/default_/ {split($1,array,"_"); print array[2]}')"
for application in $applications; do
# define attributes for server/application
for attribute in $attributes; do
application_attribute="${application}_${attribute}"
default_attribute="default_${attribute}"
if [ -n "${!application_attribute}" ]; then
eval "${attribute}"="${!application_attribute}"
else
eval "${attribute}"="${!default_attribute}"
fi
done
# perform an action
if [ -n "$bastion" ]; then
bastion_param="-J ${busername}@${bastion}"
else
bastion_param=""
fi
echo -n "$server: "
ssh $bastion_param $server -l $username "bash -c 'df -h --output=avail $partition | sed 1d'"
done
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π²ΡΡΠ΅ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΉ ΡΠΊΡΠΈΠΏΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ, ΡΡΠΎΠ±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ΅ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π½Π° ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ .
nextcloud.local: 87G 192.0.2.10: 98G 192.0.2.20: 5,5G
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΡΡΠΈΠ±ΡΡΡ
ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π½Π΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΏΡΡΡΡΠ΅.
# default parameters default_bastion="" default_busername="" default_server="localhost" default_username="milosz" default_partition="/srv"
# get defined attributes
attributes="$((set -o posix; set) | awk -F '=' '/default_/ {split($1,array,"_"); print array[2]}')"
ΠΠ·Π²Π»Π΅ΡΠ΅Π½Π½ΡΠ΅ ΠΈΠΌΠ΅Π½Π° Π°ΡΡΠΈΠ±ΡΡΠΎΠ².
attributes="bastion busername server username partition"
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
# nextcloud server nextcloud_server="nextcloud.local" nextcloud_partition="/data" [...]
ΠΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π°ΡΡΠΈΠ±ΡΡ server Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅.
# get defined servers/applications
applications="$((set -o posix; set) | awk -F '=' '/_server/ {split($1,array,"_"); print array[1]}' | grep -v default)"
ΠΠ°Π·Π²Π°Π½ΠΈΡ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
applications="nextcloud dokuwiki kolab"
Π Π°Π·Π±ΠΎΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
Π― Π±ΡΠ΄Ρ ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
for application in $applications; do
ΠΡΠΈΡΠ²ΠΎΠΉΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, server, username β¦), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ application_attribute (Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ nextcloud_server, nextcloud_username, β¦ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ), ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΠΌΡ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ $ {! Application_attribute}. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΠΏΡΡΡΠΎΠ΅.
# define attributes for server/application
for attribute in $attributes; do
application_attribute="${application}_${attribute}"
default_attribute="default_${attribute}"
if [ -n "${!application_attribute}" ]; then
eval "${attribute}"="${!application_attribute}"
else
eval "${attribute}"="${!default_attribute}"
fi
done
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΡΠΎΡΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° Π°ΡΡΠΈΠ±ΡΡΠΎΠ².
# perform an action
if [ -n "$bastion" ]; then
bastion_param="-J ${busername}@${bastion}"
else
bastion_param=""
fi
echo -n "$server: "
ssh $bastion_param $server -l $username "bash -c 'df -h --output=avail $partition | sed 1d'"
ΠΠΎΠ½Π΅Ρ ΡΠΈΠΊΠ»Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΠΉ.
done
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΡ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ source Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ ΡΡΠΈ ΡΠ°ΡΡΠΈ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠ° ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ.