Приветствую, уважаемые хабрачитатели.
Предлагаю Вашему вниманию свою небольшую наработку, которая, по моему мнению, может облегчить жизнь администраторам операционных систем «породы» UNIX. Мне, как администратору Unix серверов, часто приходится предоставлять некую информацию по множеству серверов архитектурному комитету, по этому пришла идея написания «всего этого безобразия».
Смысл работы скрипта — выдача всей (ну почти всей) информации о сервере, работающем на Linux или AIX (других ОС семейства UNIX под рукой нет, но я над этим работаю).
Требования для работы скрипта: пользователь, под которым будет осуществляться подключение к серверам, должен иметь право выполнять все команды от рута без запроса пароля (на рабочей станции, с которой будет запускаться скрипт — аналогично, и, соответственно, это должен быть Linux) и в файле sudoers (ну или в LDAP, у всех по разному) должна быть строка
!requiretty
Для начала необходимо создать файл под названием sshaskpass.sh, со следующим содержанием:
#!/bin/bash
if [ -n "$SSH_ASKPASS_TMPFILE" ]; then
cat "$SSH_ASKPASS_TMPFILE"
exit 0
elif [ $# -lt 1 ]; then
echo "Usage: echo password | $0 <ssh command line options>" >&2
exit 1
fi
sighandler() {
rm "$TMP_PWD"
}
TMP_PWD=$(mktemp)
chmod 600 "$TMP_PWD"
trap 'sighandler' SIGHUP SIGINT SIGQUIT SIGABRT SIGKILL SIGALRM SIGTERM
export SSH_ASKPASS=$0
export SSH_ASKPASS_TMPFILE=$TMP_PWD
[ "$DISPLAY" ] || export DISPLAY=dummydisplay:0
read password
echo $password >> "$TMP_PWD"
# use setsid to detach from tty
exec setsid "$@"
rm "$TMP_PWD"
Кладем его, например, в свой домашний каталог и даём ему право на запуск (chmod +x sshaskpass.sh).
В этом же каталоге создаем второй файл, я назвал его Unix_check, Вы можете назвать его как угодно.
#!/bin/bash
if [ ! -z $1 ]; then
if ping -c1 -w1 $1 >> /dev/null 2>&1; then
export HOSTNAME_NEW=$1
export USER_NAME=ИМЯ_ПОЛЬЗОВАТЕЛЯ
export pass=ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ
connect="$PWD/sshaskpass.sh ssh -o StrictHostKeyChecking=no -l $USER_NAME $HOSTNAME_NEW -n"
echo "$pass" | $connect exit > /dev/null 2>&1
SYSTYPE=`echo "$pass" | $connect uname -a | awk '{print $1}'`
if [ $SYSTYPE = AIX ]; then
#AIX section start
echo "--------------------------------------------------------------------------------"
echo -en "Hostname: tt"
echo "$pass" | $connect hostname -s
echo -en "Domain: tt"
echo "$pass" | $connect cat /etc/resolv.conf | grep domain | grep -v "#" | awk '{print $2}'
echo -en "Uptime: tt"
echo "$pass" | $connect sudo uptime | awk -F, '{print $1}' | awk '{print $3" "$4}'
echo -en "Load average: tt"
echo "$pass" | $connect sudo uptime | awk -F: '{print $NF}' | cut -c2- | awk -F, '{print $1$2$3}'
cpunum(){
for i in `echo "$pass" | $connect lsdev | grep proc | grep Available | awk '{print $1}'`; do
echo $i ;
done
}
CPU=`cpunum`
ch(){
for i in $CPU; do
PROC1=`echo "$pass" | $connect lsattr -El $i | grep type | awk '{printf "%s", $2" "}'`
PROC2=`echo "$pass" | $connect lsattr -El $i | grep frequency | awk '{print $2/1000000000 }' | awk '{printf("%.2fn", $1)}'`
echo -e "$PROC1 $PROC2"
done
}
echo -en "Procs: ttt"
ch | cat -n | tail -1 | awk '{print $1"x"$2" "$3$4" GHz"}'
echo -en "Cores per CPU: tt"
echo "$pass" | $connect lsattr -El proc0 | grep smt_threads | awk '{print $2}'
ips(){
IFCONFIG=`echo "$pass" | $connect ifconfig -a | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}'`
for i in $IFCONFIG; do
echo -en "IP: ttt"
echo $i
done
}
ips
macs(){
LSMACS=`echo "$pass" | $connect lsdev -Cc adapter | grep ent | grep -v EtherChannel | grep -v VLAN | grep -v Client | awk '{print $1}'`
for i in $LSMACS; do
echo -en "MAC: ttt"
echo "$pass" | $connect lscfg -vpl $i | grep Network | awk -F. '{print $14}' | sed 's/.{2}/&:/g' | rev | cut -c2- | rev
done
}
macs
echo -en "Mem: ttt"
echo "$pass" | $connect lsattr -El mem0 | grep goodsize | awk '{printf "%s", $2/1024 " Gigabytes"}' | sed -e 's/,/./'
echo -e ""
echo -en "Swap space:tt"
echo "$pass" | $connect lsps -s | sed -e '1d' | awk '{print $1}' | sed 's/(.*)../1/' | awk '{ tot+=$1 } END { printf "%s", tot/1024 }'; echo " Gigabytes"
total(){
LSVG=`echo "$pass" | $connect lsvg`
for i in $LSVG; do
echo "$pass" | $connect lsvg $i | grep "TOTAL PPs" | awk '{print $7}' | sed -e 's/.//'
done
}
echo -en "Total in VGs:tt"
total | awk '{ tot+=$1 } END { printf "%s", tot/1024 " Gigabytes"}' | sed 's/,/./'
used(){
LSVG=`echo "$pass" | $connect lsvg`
for i in $LSVG; do
echo "$pass" | $connect lsvg $i | grep "USED PPs" | awk '{print $6}' | sed -e 's/.//'
done
}
echo -e ""
echo -en "Used in VGs:tt"
used | awk '{ tot+=$1 } END { printf "%s", tot/1024 " Gigabytes"}' | sed 's/,/./'
free(){
LSVG=`echo "$pass" | $connect lsvg`
for i in $LSVG; do
echo "$pass" | $connect lsvg $i | grep "FREE PPs" | awk '{print $7}' | sed -e 's/.//'
done
}
echo -e ""
echo -en "Free in VGs:tt"
free | awk '{ tot+=$1 } END { printf "%s", tot/1024 " Gigabytes"}' | sed 's/,/./'
echo -e ""
echo -en "Total in FS: tt"
TOT1=`echo "$pass" | $connect lsfs | sed -e '1d' | grep -v "proc" | grep -v "itsm" | grep -v "jfs2 --" | awk '{print $1}'`
for i in $TOT1; do
echo "$pass" | $connect df -P -m $i | sed -e '1d' ; done | awk ' !x[$0]++' | awk '{print $2}' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}' | sed -e 's/,/./'
echo -en "Used in FS: tt"
USED1=`echo "$pass" | $connect lsfs | sed -e '1d' | grep -v "proc" | grep -v "itsm" | grep -v "jfs2 --" | awk '{print $1}'`
for i in $USED1; do
echo "$pass" | $connect df -P -m $i | sed -e '1d' ; done | awk ' !x[$0]++' | awk '{print $3}' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}' | sed -e 's/,/./'
echo -en "Free in FS: tt"
FREE1=`echo "$pass" | $connect lsfs | sed -e '1d' | grep -v "proc" | grep -v "itsm" | grep -v "jfs2 --" | awk '{print $1}'`
for i in $FREE1; do
echo "$pass" | $connect df -P -m $i | sed -e '1d' ; done | awk ' !x[$0]++' | awk '{print $4}' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}' | sed -e 's/,/./'
asm(){
RHDS=`echo "$pass" | $connect ls -la /dev/ | grep oracle | grep rhdisk | awk '{print $NF}'`
for i in $RHDS; do
echo "$pass" | $connect getconf DISK_SIZE /dev/$i
done
}
echo -en "ASM space:tt"
asm | awk '{tot+=$1} END {printf "%s", tot/1024 " Gigabytes"}' | sed 's/,/./'
echo -e ""
wwns(){
LSWWNS=`echo "$pass" | $connect lsdev -Cc adapter | grep -v Defined | grep fcs | awk '{print $1}'`
for i in $LSWWNS; do
echo -en "WWN: ttt"
echo "$pass" | $connect lscfg -vpl $i | grep Network | awk -F. '{print $14}' | sed 's/.{2}/&:/g' | rev | cut -c2- | rev
done
}
wwns
FGET=`echo "$pass" | $connect sudo mpio_get_config -Av 2>&1 | grep "Storage Subsystem Name" | awk -F= '{print $2}' | cut -c3- | rev | cut -c2- | rev`
MGET=`echo "$pass" | $connect sudo fget_config -Av 2>&1 | grep "array name" | awk -F= '{print $2}' | cut -c3- | rev | cut -c2- | rev`
HDLM=`echo "$pass" | $connect sudo /usr/DynamicLinkManager/bin/dlnkmgr 2>&1 view -lu | grep "SerialNumber" | awk -F: '{print $2}' | cut -c2-`
for i in $FGET; do
echo -en "Storage: tt"
echo $i
done
for i in $MGET; do
echo -en "Storage: tt"
echo $i
done
for i in $HDLM; do
echo -en "Storage: tt"
echo VSP $i
done
echo -en "Oslevel:ttAIX "
echo "$pass" | $connect oslevel -s
echo -en "Architecture:tt"
echo "$pass" | $connect uname -p | tr -d 'n'
echo "$pass" | $connect ls -la /unix | awk '{print $NF}' | awk -F / '{print " " $NF}' | sed 's/_/ /g' # CHECK!!!!
echo -en "M/T:ttt"
echo "$pass" | $connect lsattr -El sys0 | grep modelname | awk '{print $2}' | cut -c5-
echo -en "Serial Num:tt"
echo "$pass" | $connect lsattr -El sys0 | grep systemid | awk '{print $2}' | cut -c7-
echo "--------------------------------------------------------------------------------"
sudo rm -f /tmp/tmp.*
#AIX section end
elif [ $SYSTYPE = Linux ]; then
#Linux section start
MANUF=`echo "$pass" | $connect sudo /usr/sbin/dmidecode -t system | grep Manufacturer | awk '{ print $2 }'`
CPUMANUF=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "vendor_id" | uniq | awk '{print $3}'`
echo "--------------------------------------------------------------------------------"
echo -en "Hostname: tt"
echo "$pass" | $connect hostname -s
echo -en "Domain: tt"
echo "$pass" | $connect hostname -d
echo -en "Uptime: tt"
echo "$pass" | $connect sudo uptime | awk -F, '{print $1}' | awk '{print $3" "$4}'
echo -en "Load average: tt"
echo "$pass" | $connect sudo uptime | awk -F: '{print $NF}' | cut -c2- | sed -e 's/,/./g' | awk -F. '{print $1"."$2$3"."$4$5"."$6}'
echo -en "Procs: ttt"
if [ "$MANUF" = "VMware," ]; then
CPUS=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l`
MODEL=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "model name" | tail -1 | cut -c14-`
if [ "$CPUMANUF" = "AuthenticAMD" ]; then
SPEED=`echo "$pass" | $connect sudo /usr/sbin/dmidecode | grep "Current Speed" | head -n 1 | awk '{printf "%s", $3/1000}'`
echo $CPUS $MODEL $SPEED GHz
else
echo $CPUS $MODEL
fi
CORES=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep processor | wc -l`
echo -en "Cores per CPU: tt"
echo $(( $CORES / $CPUS ))
else
CPUS=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l`
MODEL=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "model name" | tail -1 | cut -c14-`
if [ "$CPUMANUF" = "AuthenticAMD" ]; then
SPEED=`echo "$pass" | $connect sudo /usr/sbin/dmidecode | grep "Current Speed" | head -n 1 | awk '{printf "%s", $3/1000}'`
echo $CPUS $MODEL $SPEED GHz
else
echo $CPUS $MODEL
fi
CORES=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "cpu cores" | sort | uniq | awk '{print $4}'`
echo -e "Cores per CPU: tt""$CORES"
fi
ips(){
IFCONFIG=`echo "$pass" | $connect sudo /sbin/ip addr | grep inet | grep -v inet6 | grep -w -v lo | awk '{print $2}'`
for i in $IFCONFIG; do
echo -en "IP: ttt"
echo $i
done
}
ips
if [ "$MANUF" = "HP" ]; then
if echo "$pass" | $connect sudo rpm -aq | grep hponcfg > /dev/null; then
echo "$pass" | $connect sudo /sbin/hponcfg -w /tmp/ilo > /dev/null 2>&1
ILOIP=`echo "$pass" | $connect sudo /bin/cat /tmp/ilo | grep "<IP_ADDRESS VALUE" | awk -F= '{print $2}' | cut -c3- | rev | cut -c4- | rev`
echo "$pass" | $connect sudo /bin/rm /tmp/ilo
else
echo "$pass" | $connect sudo /bin/mkdir /tools > /dev/null 2>&1
echo "$pass" | $connect sudo /bin/mount naiad:/tools /tools
echo "$pass" | $connect sudo /bin/rpm -ivh /tools/Software/hp/hponcfg-3.1.0-0.noarch.rpm > /dev/null 2>&1
echo "$pass" | $connect sudo /bin/umount /tools
echo "$pass" | $connect sudo /sbin/hponcfg -w /tmp/ilo > /dev/null 2>&1
ILOIP=`echo "$pass" | $connect sudo /bin/cat /tmp/ilo | grep "<IP_ADDRESS VALUE" | awk -F= '{print $2}' | cut -c3- | rev | cut -c4- | rev`
echo "$pass" | $connect sudo /bin/rm /tmp/ilo
fi
if ! echo "$pass" | $connect sudo rpm -aq | grep hpacucli > /dev/null; then
echo "$pass" | $connect sudo /bin/mkdir /tools > /dev/null 2>&1
echo "$pass" | $connect sudo /bin/mount naiad:/tools /tools > /dev/null 2>&1
echo "$pass" | $connect sudo /usr/bin/yum install -y /tools/Software/hp/hpacucli-9.40-12.0.i386.rpm > /dev/null 2>&1
echo "$pass" | $connect sudo /bin/umount /tools > /dev/null 2>&1
fi
echo -en "ILO IP: tt"
echo $ILOIP
fi
macs(){
IFCONFIGM=`echo "$pass" | $connect sudo /sbin/ifconfig | grep HWaddr | awk '{print $5}' | uniq`
for i in $IFCONFIGM; do
echo -en "MAC: ttt"
echo $i
done
}
macs
echo -en "Mem: ttt"
echo "$pass" | $connect sudo /usr/sbin/dmidecode --type memory | grep Size | grep -v No | awk '{print $2}' | awk '{ tot+=$1 } END { printf "%s", tot/1024 }'
echo -e " Gigabytes"
echo -en "Swap space:tt"
echo "$pass" | $connect cat /proc/swaps | sed -e '1d' | awk '{print $3}' | awk '{ tot+=$1 } END { printf "%s", tot/1024 }' | awk '{ tot+=$1 } END { printf "%s", tot/1024 }' | awk '{printf("%.2fn", $1)}' | awk '{print $1 " Gigabytes"}' | sed -e 's/,/./' | sed "s/.[00][0-9]*//g"
echo -en "Total space: tt"
echo "$pass" | $connect sudo df -m -l -P | grep -v "none" | grep -v "sda1" | grep -v "tmpfs" | sed -e '1d' | awk '{ print $2 }' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}'
echo -en "Used space: tt"
echo "$pass" | $connect sudo df -m -l -P | grep -v "none" | grep -v "sda1" | grep -v "tmpfs" | sed -e '1d' | awk '{ print $3 }' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}'
echo -en "Free space: tt"
echo "$pass" | $connect sudo df -m -l -P | grep -v "none" | grep -v "sda1" | grep -v "tmpfs" | sed -e '1d' | awk '{ print $4 }' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}'
if echo "$pass" | $connect rpm -aq | grep asm > /dev/null 2>&1;
then
nums(){
NUMS0=`echo "$pass" | $connect sudo ls -la /dev/oracleasm/disks/ 2> /dev/null | grep oracle | awk '{print $5" "$6}' | sed 's/,//g' | sed 's/ /@/g'`
for i in $NUMS0; do
echo $i
done
}
nums > /tmp/asmnums
drvs(){
NUMS1=`cat /tmp/asmnums`
for i in $NUMS1; do
DEVS=`echo "$pass" | $connect cat /proc/partitions | sed 's/ */ /g' | sed 's/ /@/g' | grep $i | sed 's/@/ /g' | awk '{print $NF}'`
echo $DEVS
done
}
drvs > /tmp/asmdrvs
echo -en "ASM space: tt"
asm(){
BLOCK=`cat /tmp/asmdrvs`
for s in $BLOCK; do
echo "$pass" | $connect sudo cat /proc/partitions | sed 's/ */ /g' | sed 's/ /@/g' | grep $s | sed 's/@/ /g' | awk '{print $3}';
done
}
asm | awk '{ tot+=$1 } END { print tot/1048576 " Gigabytes"}';
sudo rm -f /tmp/asmdrvs
sudo rm -f /tmp/asmnums
else
echo -e "ASM space: tt0 Gigabytes"
fi
wwns(){
LSWWNS=`echo "$pass" | $connect sudo /usr/bin/systool -c fc_host -v 2> /dev/null | grep port_name | awk -F= '{print $2}' | cut -c5- | rev | cut -c2- | rev | sed 's/.{2}/&:/g' | rev | cut -c2- | rev`
for i in $LSWWNS; do
echo -en "WWN: ttt"
echo $i
done
}
wwns
if echo "$pass" | $connect sudo ls /usr/sbin/mppUtil > /dev/null 2>&1 /dev/null; then
RDAC=`echo "$pass" | $connect sudo /usr/sbin/mppUtil -a 2>/dev/null | grep FC | awk '{print $NF}'`
for i in $RDAC; do
echo -en "Storage: tt"
echo $i
done
fi
echo -en "Oslevel: tt"
if echo "$pass" | $connect sudo ls /etc/redhat-release > /dev/null 2>&1; then
echo "$pass" | $connect cat /etc/redhat-release
elif echo "$pass" | $connect sudo ls /etc/SuSE-release > /dev/null 2>&1; then
echo "$pass" | $connect cat /etc/SuSE-release | head -1
elif echo "$pass" | $connect sudo ls /etc/gentoo-release > /dev/null 2>&1; then
echo "$pass" | $connect cat /etc/gentoo-release
elif echo "$pass" | $connect sudo ls /etc/debian_version > /dev/null 2>&1; then
echo "$pass" | $connect cat /etc/os-release | grep PRETTY | awk -F= '{print $2}' | cut -c2- | rev | cut -c2- | rev
fi
echo -en "Kernel ver: tt"
echo "$pass" | $connect uname -r
echo -en "Architecture: tt"
echo "$pass" | $connect uname -a | awk '{print $12}'
echo -en "Manufacturer: tt"
if [ "$MANUF" = "VMware," ]; then
echo "Vmware"
else
echo "$MANUF"
fi
echo -en "Model: ttt"
echo "$pass" | $connect sudo /usr/sbin/dmidecode -t system | grep "Product Name" | cut -c16-
echo -en "Serial Num: tt"
echo "$pass" | $connect sudo /usr/sbin/dmidecode -t system | grep "Serial Number" | cut -c17-
if [ "$MANUF" = "HP" ]; then
HDDFAIL=`echo "$pass" | $connect sudo /usr/sbin/hpacucli ctrl all show config | grep "physicaldrive" | grep -v OK | cut -c7-`
if [ ! -z "$HDDFAIL" ]; then
echo -e "HDD Error: tt"$HDDFAIL
fi
fi
echo "--------------------------------------------------------------------------------"
sudo rm -f /tmp/tmp.*
#Linux section end
elif [ $SYSTYPE = FreeBSD ]; then
#FreeBSD section start
echo "FreeBSD"
#FreeBSD section end
elif [ $SYSTYPE = SunOS ]; then
#Solaris section start
echo "Solaris"
#Solaris section end
elif [ $SYSTYPE = HP-UX ]; then
#HP-UX section start
echo "HP-UX"
#HP-UX section end
fi
else echo "unknown host $1"
fi
else echo "hostname or ip must be specified (Unix_check hostname/ip)"
fi
Соответственно, ему тоже даем право на запуск.
Запускаем следующим образом: ./Unix_check hostname
Пример для AIX:
--------------------------------------------------------------------------------
Hostname: tsm
Domain: xxxxxxx.xxxxx.ua
Uptime: 30 days
Load average: 0.00 0.00 0.02
Procs: 2xPowerPC_POWER5 2.10 GHz
Cores per CPU: 2
IP: 172.17.xx.xx
MAC: 00:14:5E:97:xx:xx
MAC: 00:14:5E:97:xx:xx
Mem: 7.75 Gigabytes
Swap space: 5 Gigabytes
Total in VGs: 1252.5 Gigabytes
Used in VGs: 562.25 Gigabytes
Free in VGs: 690.25 Gigabytes
Total in FS: 527.375 Gigabytes
Used in FS: 461.424 Gigabytes
Free in FS: 65.9507 Gigabytes
ASM space: 0 Gigabytes
WWN: 10:00:00:00:C9:4F:xx:xx
WWN: 10:00:00:00:C9:4F:xx:xx
Storage: 181470A-78K0xxx-tsm-F
Storage: 181470A-78K0xxx-tsm-D
Oslevel: AIX 6100-07-03-1207
Architecture: powerpc unix 64
M/T: 9131-52A
Serial Num: XXXXXX
--------------------------------------------------------------------------------
Пример для Linux
--------------------------------------------------------------------------------
Hostname: dfilendbb01
Domain: xxxx.xxxx.xxx
Uptime: 5 days
Load average: 0.00 0.02 0.00
Procs: 2 Dual-Core AMD Opteron(tm) Processor 2218 2.6 GHz
Cores per CPU: 2
IP: 172.17.xx.xx/xx
ILO IP: 172.17.xx.xx
MAC: 00:21:5A:49:xx:xx
Mem: 8 Gigabytes
Swap space: 8 Gigabytes
Total space: 71.0547 Gigabytes
Used space: 31.0742 Gigabytes
Free space: 36.3203 Gigabytes
ASM space: 0 Gigabytes
WWN: 50:01:43:80:02:9f:xx:xx
WWN: 50:01:43:80:02:9f:xx:xx
Oslevel: Red Hat Enterprise Linux Server release 5.9 (Tikanga)
Kernel ver: 2.6.18-348.3.1.el5
Architecture: x86_64
Manufacturer: HP
Model: ProLiant BL465c G1
Serial Num: CZJ8300xxx
HDD Error: physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS, 146 GB, Predictive Failure)
--------------------------------------------------------------------------------
Некоторые пути нужно будет изменить, такие как монтирование NFS шары с пакетами для RHEL от HP (hponcfg и hpacucli).
Так же, для Linux, в скрипте используются утилиты для определения дисковых стоек IBM, подключенных по SAN и использующие не нативный multipathd, а RDAC. Для AIX, должно показывать все стойки, подключенные напрямую (без VIOS и VSCSI).
При определении размеров дисков под Oracle ASM, в AIX используется метод выделения hdisk-ов целиком, без использования LVM.
В Linux размер дисков Oracle ASM должен работать всегда корректно, по крайней мере, другого способа презентации дисков я не знаю.
Для серверов производства HP, скрипт проверяет встроенные RAID адаптеры на наличие ошибок на дисках.
Буду рад, если предоставленная информация кому-то пригодится, так же, готов выслушать любую критику в свой адрес.
P.S. Внимательные читатели увидят в конце основного скрипта строчки, относящиеся к FreeBSD, Solaris, HP-UX, эти разделы еще не готовы, так как, я упоминал ранее, под рукой нет этих ОС. Если уважаемое сообщество предоставит мне право в дальнейшем редактировать эту статью, по мере появления упомянутых систем — буду дополнять скрипт.
Спасибо за внимание.
Автор: baragoon