<img> Durad(8) logo </img>   Durad(8)


*NIX кутија са алатима

написано: 2023-03-29, ажурирано: 2024-06-19

Табела садржаја

Моје белешке на тему најчешће коришћене команде у *NIX базираним системима се налазе испод. Ову страну можете сматрати зоном "копирања и лепљења". Можда неком приликом одлучим да сортирам садржај међутим до тада препоручујем да користите претрагу на овој страни (CTRL + F).

Овај чланак/текст је подсетник за мене. Другима можда неће имати много смисла и то је сасвим очекивано. Ажурирам листу када год помислим да треба.


Најчешће коришћени конзолни алати

grep

Алат који често користим али ми мало напредних функција треба. Команде испод су мени највише значиле

Претрага више кључних речи истовремено

grep -iE '(Реч1|Реч2|Реч3)'

Претрага са контекстом пре и после пронађених термина

Када алат нађе "термин_за_претрагу", штампаћемо 3 реда пре и 5 редова после пронађених резултата:

grep -i -B 3 -A 5 'термин_за_претрагу'

Рекурзивна претрага свих датотека у директоријуму

grep -r 'термин_за_претрагу' ~/Путања

awk

Овај програм је врло специфичан зато што нуди превише могућности а ретко се користи у праве сврхе. Радом на неким пројектима сам имао прилику да пробам неке занимљиве команде за извлачење и приказ података стога ћу те команде да оставим овде.

Приказ колона са сепараторима

У овом примеру имамо штампање $1, $2 и $3 са сепаратором , између тих резултата:

awk -v SEPARATOR="," '{print $1 " " SEPARATOR " " $2 " " SEPARATOR " " $3}'

Врло згодно за CSV формат, на пример

Приказ података са параметрима

Мало сувљи пример:

awk '/(\t)+Size/{$1=""; print $0 }'

Сам пример не служи ничему али када убацимо dmidecode у једначину, ситуација је доста боља и има смисла:

dmidecode | awk '/(\t)+Size/{$1=""; print $0 }'

Резултат је:

No Module Installed
16 GB
No Module Installed
16 GB

Дакле, ова команда извлачи вредности регистрованих "штанглица" радне меморије у систему

sed

Овај алат користим само за једну ствар а то је замена кључних речи у документима на почетку реда (у конфигурацији):

sed -i 's/^Нека вредност са почетка реда=.*$/Замењена вредност = 22/g'

Конкретна употреба за, на пример, ограничење виртуелних терминала на 2:

sed -i 's/^.*NAutoVTs=.*$/NAutoVTs=2/' /etc/systemd/logind.conf

find

Копирање нађеног садржаја

У овом примеру тражимо pdf датотеке и копирамо их у ~/Документа

find . -name "*.pdf" -exec cp {} ~/Документа \;

Премештање нађеног садржаја

У следећем примеру тражимо jpg датотеке и премештамо их све у омот.jpg (глупа команда)

find . -iname "*.jpg" -execdir mv -i '{}' омот.jpg \;

Брисање пронађеног садржаја

У следећем примеру тражимо pdf датотеке и бришемо их

find . -name "*.pdf" -type f -delete

У следећем примеру тражимо pdf датотеке и бришемо их коришћењем xargs команде

find . -name "*.pdf" -type f -print0 | xargs -0 /bin/rm -f

Тражење садржаја по више параметера

Брисање датотека старијих од АБВ дана

У следећем примеру тражимо:

и листамо их:

find . -maxdepth 1 -type f -name "*боба*" -mtime +10 -exec echo {} \;

Обратити пажњу на noatime или nodiratime заставице код монтирања дискова, ако се користи -mtime [+|-]НЕКИ_БРОЈ

Листање више датотека које садрже једну или више кључних речи

У следећем примеру тражимо:

find . -type f -name "*.log" -mtime +10 | xargs grep -iEn "(Error 403|Error 404)"
Премештање свих датотека већих од АБВ

У ово примеру:

find . -type f -size +50000k -exec cp -nv {} ./ \;

Мешање команди

Мењање параметра уколико исти постоји тј. додавање новог уколико не постоји

Сам sed ми не значи много међутим нашао сам начин да ми се допадне. Ово је за сада најбоља комбинација коју сам користио:

grep -q '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub && sed -i 's/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=auto processor.max_cstate=5 rcu_nocbs=0-3"/' /etc/default/grub || echo 'GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=auto processor.max_cstate=5 rcu_nocbs=0-3"' >> /etc/default/grub

Ово је пример AMD Ryzen конфигурације, са машине у продукцији, који гласи: - отварамо /etc/default/grub и тражимо GRUB_CMDLINE_LINUX_DEFAULT - уколико постоји GRUB_CMDLINE_LINUX_DEFAULT, мењамо вредност у crashkernel=auto processor.max_cstate=5 rcu_nocbs=0-3 - уколико GRUB_CMDLINE_LINUX_DEFAULT не постоји, додајемо тај ред у /etc/default/grub са нашим параметрима

Сигуран сам да има елегантних начина да се ово исто постигне!

Претрага датотека и штампање кључних термина

Релативно често коришћен, помало сложен, упит! Испод су дати примери датотека, директоријума и термина за претрагу:

а резултат је:

find ~/logs/{daily,monthly,weekly} -type f \( -name "*.log" -o -name "*.txt" \) | xargs sed -i -E '/понедељак\|уторак/Id'

повратак на врх ↑

Провера хардвера и извлачење информација

PCI уређаји

Листање свих уређаја

lspci

Детаљи о PCI уређајима

lspci -vs XX:XX.X
Пример

Извучемо информацију:

lspci | grep VGA

Нађемо графичку картицу нпр:

07:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [...]

Извучемо све што имамо о графичкој картици:

lspci -vs 07:00.0

Листање УСБ уређаја

lsusb

Извлачење детаља о УСБ уређајима

Исто је као и за lspci само што је формReisат мало другачији:

lspci -vs BUS:DEVICE

Пример:

$ lsusb
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

$ lsusb -vs 006:001
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
[...]

Извлачење листе учитаних системских модула за хардвер који се користи

lspci -vvv | grep modules

Графичке карте

Провера доступне видео меморије

Понекад radeontop и radeonsi команде нису доступне. Тада можемо да сазнамо неке детаље уз помоћ команде glxinfo из пакета mesa-utils

glxinfo | grep memory

повратак на врх ↑

ЦПЈ и режими рада

Провера модела ЦПЈ

Метод 1 провере модела

cat /proc/cpuinfo

Метод 2 провере модела

lscpu

Да ли ЦПЈ подржава "турбо"

Метод 1 провере "турбо" подршке

cat /sys/devices/system/cpu/cpufreq/boost

Метод 2 провере "турбо" подршке

cat /sys/devices/system/cpu/cpu[0-9]/cpufreq/cpb

Провера ЦПЈ режима скалирања

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

Провера фреквенција рада ЦПЈ

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
Промена ЦПУ режима скалирања (сва језгра)

Пример за performance режим

cpupower frequency-set -g performance
Промена ЦПУ режима скалирања (засебна језгра)

Опет, пример испод је за performance режим

cpupower -c $БРОЈ_ЈЕЗГРА frequency-set -g performance

Мењање доње границе за скалирање код ONDEMAND режима

echo -n $ПРОЦЕНАТ > '/sys/devices/system/cpu/cpufreq/ondemand/up_threshold'

Напомена: $ПРОЦЕНАТ дефинише моменат оптерећења и заузећа када ће оперативни систем да повећа брзину ЦПЈ.

Пример за вредност 60% :

У пракси су ове бројке веће па често виђамо вредности од 90% или више за ONDEMAND режим. Узео сам пример тог режима али правило важи за све режиме, изузев за PERFORMANCE који увек диктира рад на максималној остваривој брзини ЦПЈ.

udev - пример правила за промену доње границе скалирања
echo SUBSYSTEM=="module", ACTION=="add", KERNEL=="acpi\_cpufreq", RUN+=" /bin/sh -c ' echo -n $ПРОЦЕНАТ > /sys/devices/system/cpu/cpufreq/ondemand/up\_threshold ' " > /etc/udev/rules.d/50-scaling-governor.rules
cron - пример правила за промену доње границе скалирања

Отворимо листу задатака:

crontab -e

Затим додамо шта желимо:

@reboot echo -n $ПРОЦЕНАТ > /sys/devices/system/cpu/cpufreq/ondemand/up\_threshold

Можемо и да проверимо шта смо додали до сада у cron:

crontab -l

Провера брзине ЦПЈ

Праћење режима ЦПЈ

Ово није идеалан начин да пратите брзину ЦПЈ међутим помаже у анализи (ја преферирам ову методу више него друге):

cat /sys/devices/system/cpu/cpufreq/policy0/stats/time_in_state

За преглед свих језгара, команда је релативно проста:

cat /sys/devices/system/cpu/cpufreq/policy*/stats/time_in_state

Резултат је број у микросекундама.

perf

perf stat -a sleep 2

cpupower

Напомена: kernel-tools је пакет који се користи у Федори за cpupower

cpupower monitor
Праћење ЦПЈ брзине у стварном времену

Пример је за проверу сваке 2 секунде:

watch -n 2 cpupower monitor

повратак на врх ↑

Тестови оптерећења ЦПЈ

Метода #1 за оптерећење ЦПЈ

dd if=/dev/zero of=/dev/null

Метода #2 за оптерећење ЦПЈ

dd if=/dev/urandom | bzip2 -9 >> /dev/null

Метода #3 за оптерећење ЦПЈ

yes > /dev/null &

Метода #4 за оптерећење ЦПЈ

seq 3 | xargs -P0 -n1 md5sum /dev/zero

повратак на врх ↑

Дискови

Провера активних (S)ATA линкова

dmesg | grep -i 'ata link up'

Провера типа диск (HDD, SSD)

Метод 1 за проверу типа диска

У овом примеру, SSD дискови враћају вредност 0:

for f in /sys/block/sd?/queue/rotational; do printf "$f is "; cat $f; done

Метод 2 за проверу типа диска

grep . /sys/block/sd?/queue/rotational

Провера доступних и коришћених режима уписа за монтиране уређаје

Метод 1 за проверу "шедулера"

for f in /sys/block/sd?/queue/scheduler; do printf "$f is "; cat $f; done
Метод 2 за проверу "шедулера"
grep . /sys/block/sd?/queue/scheduler

Ручна промена режима читања/писања

echo $РЕЖИМ > /sys/block/sdX/queue/scheduler

Тримовање на захтев

Напомена: не препоручујем да се ово ради у продукцији. Пре бих проверио статус systemctl status fstrim него што бих ово пуштао ручно но нека се нађе овде.

fstrim -v /

Подразумевани, оптимизовани режими за дискове

Моја правила за /etc/udev/rules.d/60-ssd-scheduler.rules:

# SSD = deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
# for HDD = CFQ is the way to go
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="cfq"

Форматирање УСБ флеш меморија

Брисање табеле партиција на првом сектору

dd if=/dev/zero of=/dev/sdX bs=512 count=1 status=progress

Форматирање комплетног уређаја

dd if=/dev/zero of=/dev/sdX bs=512 status=progress

Бонус: Коришћење HDSentinel алата за проверу стања дискова

hdsentinel -solid | awk '{print "[\t" $3 "% \t] "$5}'

повратак на врх ↑

Мреже

Листање отворених портова, "ослушкивача" и сл.

Socket statistics

[l]istening [n]umeric IP [t]cp [u]dp
ss -lntu

netstat

[l]isten [n]umerical [t]cp [u]dp
netstat -lntu
nmap
nmap -p0-65535 127.0.0.1 -T5

OpenWrt

Провера MU-MIMO статуса

grep -iE '(BEAMFORME|ANTENNA)' /var/run/hostapd*.conf

Пример једног излаза:

vht_capab=[RXLDPC][SHORT-GI-80][SHORT-GI-160][TX-STBC-2BY1][SU-BEAMFORMER][SU-BEAMFORMEE][MU-BEAMFORMER][MU-BEAMFORMEE][RX-ANTENNA-PATTERN][TX-ANTENNA-PATTERN][RX-STBC-1][SOUNDING-DIMENSION-4][BF-ANTENNA-4][VHT160-80PLUS80][MAX-MPDU-7991][MAX-A-MPDU-LEN-EXP7]
he_su_beamformer=1
he_mu_beamformer=1

За OFDMA очекујете и ово:

he_su_beamformer=1
he_mu_beamformer=1

Провера AQM стања

find /sys/kernel/debug/iee*/phy* -name aqm
cat /sys/kernel/debug/iee*/phy*/netdev:*/aqm

Провера стања уштеде енергије чипа за бежичну мрежу

cat /sys/kernel/debug/iee*/phy*/netdev:wlan*/stations/*/peer_ps_state

2 = онемогућено

Провера AQL стања

cat /sys/kernel/debug/iee*/phy*/aql_enable

AQL бројач:

cat /sys/kernel/debug/iee*/phy*/netdev:wlan*/stations/*/aql

Провера "airtime fairness" стања

cat /sys/kernel/debug/iee*/phy*/airtime_flags

Претрага OpenWrt дневника по битним терминима

Простије речено: има ли грешака и уопозорења или не?

logread -t | grep -iE '(warn|crit|err)'

Мреже Разно

Гашење ЛЕД лампице на Atheros бежичним штапићима

Занимљивост: мрежа је спорија док се ЛЕД лампица пали и гаси на штапићу. Бизарно

echo 'none' > /sys/class/leds/ath9k\_htc-phy0/trigger

Насумична хардверска адреса у NetworkManager програму

echo '[device]
wifi.scan-rand-mac-address=yes

[connection]
wifi.cloned-mac-address=random
ethernet.cloned-mac-address=random
connection.stable-id=${CONNECTION}/${BOOT}' > /etc/NetworkManager/conf.d/00-macrandomize.conf

Дозвољавање саобраћаја кроз заштитни зид (Fedora/CentOS)

Користимо Апач сервер (httpd) као пример:

firewall-cmd --add-service=http

Дозвола Апач саобраћаја која је трајна:

firewall-cmd --add-service=http --permanent

Претрага уређаја кроз Avahi

avahi-browse -alr

повратак на врх ↑

Виртуелне машине

VirtualBox

Пребацивање фиксних дискова у динамичке (VDI)

VBoxManage clonehd [old-VDI] [new-VDI] --variant Standard

Пребацивање динамичких дискова у фиксне (VDI)

VBoxManage clonehd [old-VDI] [new-VDI] --variant Fixed

Промена величине постојећих дискова (VDI)

VBoxManage modifyhd [VDI] --resize [megabytes]

QEMU

Пребацивање VBox диска у диск за libvirt

qemu-img convert -f vdi -O qcow2 [VBOX-IMAGE.vdi] [KVM-IMAGE.qcow2]

повратак на врх ↑

Управљање пакетима

Flatpak

Брисање заосталих flatpak датотека

Команда испод може да се користи за уклањање заосталих датотека након брисања самог програма коришћењем flatpak команде.

flatpak uninstall --delete-data

Такође, може да се дода и само име пакета, да се одмах све избрише. Пример за Телеграм:

flatpak uninstall --delete-data org.telegram.desktop

Брисање програма и пакета који се не користе више

flatpak uninstall --unused

повратак на врх ↑

Манипулација сликама

Компресија и оптимизација слика

ПНГ слике

oxipng
find . -name "*.[Pp][Nn][Gg]" -printf '  oxipng  > %p\n' -exec oxipng -ao max -Z -q {} \;
optipng
find . -name "*.[Pp][Nn][Gg]" -printf '  optipng   > %p\n' -exec optipng -preserve -clobber -nc -nb -o7 -zm1-9 -quiet {} \;
pngcrush
find . -name "*.[Pp][Nn][Gg]" -printf '  pngcrush  > %p\n' -exec pngcrush -ow -rem alla -reduce -brute -q -warn {} \;

ГИФ слике

find . -name "*.[Gg][Ii][Ff]" -printf '  gifsicle   > %p\n' -exec gifsicle --batch --no-warnings --no-comments --optimize=3 {} \;

ЈПЕГ слике

jpegtran
find . -name "*.[Jj][Pp]*[Gg]" -printf '  jpegtran  > %p\n' -exec jpegtran -optimize -copy all {} > {} \;
jpegoptim
find . -name "*.[Jj][Pp]*[Gg]" -printf '  jpegoptim > %p\n' -exec jpegoptim -f --strip-none --overwrite --quiet {} \;

Брисање метаподатака

exiv2 алат

Брисање свих метаподатака из свих датотека

find . -type f -iname '*' -exec exiv2 -da rm {} \;

Или брисање метаподатака из подржаних слика, нпр:

find . -type f \( -name "*.[Pp][Nn][Gg]" -o -name "*.[Jj][Pp]*[Gg]" -o -name "*.[Gg][Ii][Ff]" -o -name "*.[Ww][Ee][Bb][Pp]" \) -exec exiv2 -da rm {} \;

exiftool алат

Брисање свих метаподатака из свих датотека

find . -type f -iname '*' -exec exiftool -overwrite_original -all= {} \;

Или брисање метаподатака из подржаних слика, нпр:

find . -type f \( -name "*.[Pp][Nn][Gg]" -o -name "*.[Jj][Pp]*[Gg]" -o -name "*.[Gg][Ii][Ff]" -o -name "*.[Ww][Ee][Bb][Pp]" \) -exec exiftool -overwrite_original -all= {} \;

повратак на врх ↑

Оптимизација система

Ограничавање броја процеса

Провера свих ограничења

ulimit -aH

Пример: "Тврдо" ограничење процеса и остало

Сачувати блок испод у /etc/security/limits.conf датотеку:

* hard nproc 2500
#@users hard nproc 3250
root hard nproc 3250

# Disable core dumps
* hard core 0

# Limit max user logins
* hard maxlogins 2

Ажурирање фирмвера

fwupd (Linux Vendor Firmware Service)

Излиставање свих подржаних уређаја:

fwupdmgr get-devices

Освежавање локалне базе података о ажурирањима:

fwupdmgr refresh

Излиставање свих доступних ажурирања за рачунар са ког се покреће команда:

fwupdmgr get-updates

Ажурирање подржаних уређаја новимјом верзијом

fwupdmgr update

повратак на врх ↑

Остало

Писање по MBR у FreeBSD систему

sysctl kern.geom.debugflags=0x10

Показивање статуса напретка у dd алату

Ово је доступно у GNU Coreutils 8.24 и новијим.

dd if=/dev/urandom of=/dev/null status=progress

Закључавање root налога

passwd -dl root

Ова команда: - -d уклања лозинку - -l закључава налог

Тиме онемогућавамо да се корисници пријављују као root

"Бели шум за сиромашне"

PulseAudio метода

pacat /dev/urandom

Коришћењем звучника у кућишту или са матичне плоче

cat /dev/urandom > /dev/pcspkr

Омогућавање SystemRequest (SysReq) тастера

Употреба: Left Alt + Print Scr + F

REISUB: - R eboot - E ven - I f - S ystem - U tterly - B roken

Метода 1 за омогућавање SystemRequest

echo 'kernel.sysrq = 1' > /etc/sysctl.d/90-sysrq.conf

Метода 2 за омогућавање SystemRequest

echo "1" > /proc/sys/kernel/sysrq

Провера доступности AMD динамичког управљања напоном (DPM)

Метод 1, модернија команда за проверу стања DPM-а

cat /sys/class/drm/card*/device/power_dpm_force_performance_level

Могуће вредности су: low auto high

Метод 2, старија команда за проверу стања DPM-а

cat /sys/kernel/debug/dri/*/radeon_pm_info

Гашење вертикалне синхронизације у ГНОМЕ окружењу

Раније је овај трик помагао да окружење "ради брже".

echo '<device screen="0" driver="dri2">
  <application name="Default">
    <option name="vblank_mode" value="0"/>
  </application>
</device>' > ~/.drirc

Листа најчешћих типова датотека у директоријуму

Ово често користим приликом прављења бев сајтова како бих знао који тип датотеке се најчешће користи. Таква статистика је добра ако пишете .htaccess правила и покушавате да повећате безбедност, блокирањем приступа датотекама које не користите нпр.

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort | uniq -c | sort -rn

Онемогућавање Bluetooth уштеде енергије

Уколико Bluetooth "крче", прекидају и сл. на рачунару, промена режима рада може да помогне:

sed -i.bak -e '/^#ControllerMode = dual/s/^#//; /^ControllerMode = le/!s/^ControllerMode = dual$/ControllerMode = le/' -e '/^#AutoEnable=true/s/^#//; /^AutoEnable=false/!s/^AutoEnable=true$/AutoEnable=false/' /etc/bluetooth/main.conf

Након тога можете да поново покренете сервис:

sudo systemctl restart bluetooth

или

sudo service bluetooth

CPanel cron идеје

Брисање информација о посетама корисника

Да ли вам је битан ГДПР или просто вас не интересују подаци о посетама, није битно. Истражио сам могућности за брисањем неких података. Врло често овакве команде решавају само део проблема зато што постоје различите регулативе о чувању и евидентирању података које пружаоци услуга поштују и примењују.

Датотеке које складиште извештаје о посетама

Избрисаће комплетне датотеке.

find ~/logs ~/access-logs ~/tmp/{analog,awstats,webalizer,webalizerftp} ~/.trash -type f \( -name "*djura*" -o -name "*dura*" -o -name "*80a5ai3dd*" -o -name "*pohokolius*" -o -name "*90a3ac" \) -mtime 0 -exec rm -f {} \;

Кориговати -mtime 0 у зависности од тога да ли се крон покреће сваки дан (не препоручујем) или сваких АБВ дана (препоручујем).

Брисање кључних речи из свих извештаја где се помиње домен (корисно за дељени хостниг)

Неће помоћи са свим уносима али ће наћи највећи део. Са обзиром на ресурсе које ово може да искористи (читај: може да преоптерети сервер), извршавати ову команду ретко и у току ноћи:

Претрага:

find ~/logs ~/access-logs ~/tmp/{analog,awstats,webalizer,webalizerftp} -type f \( -name "*.log" -o -name "*.txt" -o -name "*.rs" -o -name "*90a3ac" \) -exec grep -H -E 'djura|dura|80a5ai3dd|pohokolius|--90a3ac' {} \;

Брисање:

find ~/logs ~/access-logs ~/tmp/{analog,awstats,webalizer,webalizerftp} -type f \( -name "*.log" -o -name "*.txt" -o -name "*.rs" -o -name "*90a3ac" \) -exec sed -i -E '/djura|dura|80a5ai3dd|pohokolius|--90a3ac/Id' {} +

Замените djura|dura|80a5ai3dd|pohokolius|--90a3ac са чиме год желите.

Брисање електронске поште старије од АБВ дана

Пример брисања поште старије од 7 дана, изостављајући архивиране садржаје:

find ~/mail/нешто_нешто -type d -name "cur" -print0 | xargs -0 -I {} find {} -type f -mtime +7 ! -ipath '*/.Archive/*' -print0 | xargs -0 rm -f