Hirdetés

2024. április 28., vasárnap

Gyorskeresés

Hozzászólások

(#2651) Fecogame válasza bambano (#2650) üzenetére


Fecogame
veterán

Végü megoldottam összehasonlítással, csak floating numbert nem olyan egyszerű bash alatt :)

NULLASERTEK="0.000000"
NAGYOBBERTEK="0.534545"
[ $(bc <<< "$NULLASERTEK <= $NAGYOBBERTEK") -eq 1 ] && echo "Nagyobb, mint 0"

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2652) dabadab válasza bambano (#2650) üzenetére


dabadab
titán

De az csak egész számokra működik, bash nem tud tizedestörteket kezelni, szóval szerintem a regexillesztés lesz a megoldás.

DRM is theft

(#2653) Hege1234


Hege1234
addikt

Sziasztok!

programozás topikból küldtek ide hozzátok

bash-ba szeretném eljuttatni a .txt-be lévő sorokat a file és a resume rész után

save.sh
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '[{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["percentage"]],"id":17},{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]' | jq '.[].result.item.file, .[].result.percentage | select(. != null)' > save.txt
 
ez létrehozza a save.txt-t
smb://192.168.1.10/@.mkv
52.96696472167969

a load.sh betölti a videót az adott pozicióra ugorva

load.sh
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"smb://192.168.1.10/@.mkv"},"options":{"resume":52.96696472167969}}}'

ebbe kellene valahogy a "file": és a "resume": után beilleszteni a txt-be lévő sorokat

bambano: itt az a gond, hogy ha a --data aposztrófok között van (ezt én se figyeltem, hogy külön paraméter), akkor a ${változó} behelyettesítést a shell nem csinálja meg. ezért a --data-t idézőjelek közé kellene tenni, viszont akkor belül a json idézőjelei be fognak kavarni, azokat escape-lni kell.
valószínűleg ez már offtopic itt, van rá szaktopic.

köszi, előre is a segítséget!

[ Szerkesztve ]

(#2654) bambano válasza Fecogame (#2651) üzenetére


bambano
titán
LOGOUT blog

jogos, ez elkerülte a figyelmem. :R

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2655) Jester01 válasza Hege1234 (#2653) üzenetére


Jester01
veterán

Szerencse, hogy stringeket tetszőlegesen össze lehet fűzni.
echo 'foo${bar}'"${bar}"'baz'
Az elsőt nem bontja ki a másodikat igen.

Tehát a paraméter előtt szépen teszel egy idézőjelet majd bezárod az aposztrófot. Majd idézőjelbe beírod a változódat, majd visszanyitod az aposztrófot, beteszed a záró idézőjelet és minden mehet tovább.

Ha azt a 2 sort már betetted változókba mondjuk $url és $pos akkor

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"'"${url}"'"},"options":{"resume":'"${pos}"'}}}'

[ Szerkesztve ]

Jester

(#2656) Hege1234 válasza Jester01 (#2655) üzenetére


Hege1234
addikt

köszönöm szépen! :R

filenev=$(head -1 save.txt)
idopont=$(head -2 save.txt | tail -1)
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"'"${filenev}"'"},"options":{"resume":'"${idopont}"'}}}'

(#2657) Headless


Headless
őstag

sziasztok!

egy megoldást keresek egy bináris fájl szétválasztására egy bizonyos hex karakter sorozat elválasztásával több részre osztani, konkrétan egy cubemap kép sorozat ami jxr (képeket, posx,posy,posz,negx,negy,negz) fájlokat tartalmaz. ezeket szeretném szétválasztani. az elválasztó lehetne a wmphoto magic numbere \x4949BC. minden wm photo kép ezzel kezdődik.

mivel bináris fájl sed meg sorokat vizsgál az nem feltétlen megfelelő, egyáltalán van-e értelme bashal szenvedni, vagy ez már inkább egyszerűbb/gyorsabb egy rendes (nem script) nyelvel?

[ Szerkesztve ]

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2658) Hege1234


Hege1234
addikt

amikor így szerepelnek a sorok a .txt fájban
jq, awk vagy más hasonló megoldással, hogyan lehetne
a számokat úgy átalakítani, hogy a 2. sorba legyenek és a 10 alatti számok elé
mindig kerüljön egy 0?

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '[{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["time"]],"id":17},{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]' | jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' > "c:\kodi\info.txt"

[netes jq link]

eredeti:
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
2
3
5

elképzelt: (235)
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
020305

elképzelt 2.: (14325)
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
014325

jq és awk kombinációjával jutottam el idáig, hogy
ez lett belőle de nem sikerül rájönnöm, hogyan lehetne úgy megoldani ahogy elképzeltem

| jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' | awk '{key=$0; getline; print key "" $0;}'
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA2
35

| jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' | awk 'NR > 1 { printf("") } {printf "%s",$0}'
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA235

(#2659) Headless válasza Headless (#2657) üzenetére


Headless
őstag

megoldottam, mivel a fájlokban van egy másik separator, azt feltudtam hasnálni, nyilván a zárt forráskódű fejlesztők is azt használják szeparátornak...
Röviden: grep kikeresem a byteoffseteket a separatorokhoz, majd végig megyek rajtuk while ciklusban, kiszámolom a megfelelő kezdő/végoffset értékeket és azt dd-vel szépen átmásálom. A separatort átírom, hogy ne legyen kereshető, nehogy megtalálja a zárt forráskódú szoftver fejlesztő, vagy bárki más aki rákeresne :)

Az elején van 4 byte felesleg, valamint a separator 8 byte azt hozzáadom az előző byteoffsethez

previousByteOffset=4
imageCount=0
grep -oba ggggggg "$imageFile" |while IFS=: read byteOffset rest;do
    dd if="$imageFile" of="$imageFile-$imageCount.jpg" bs=$(($byteOffset-$previousByteOffset)) count=1 skip=$previousByteOffset iflag=skip_bytes
    previousByteOffset=$(($byteOffset+8))
    imageCount=$(($imageCount+1))
done

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2660) Jester01 válasza Hege1234 (#2658) üzenetére


Jester01
veterán

read line
echo "$line"
while read line
do
    printf "%02d" "$line"
done
echo

Jester

(#2661) Hege1234 válasza Jester01 (#2660) üzenetére


Hege1234
addikt

sajnos nem sikerült rájönnöm ezt hol kellene használnom, hogy beleírja az info.txt -be
a felugró ablakba a beírt számok 1-9 ig mindig kaptak nullát
a 014325, 020305 viszont nem sikerült beírnom
olyan mintha, mivel 10 nél nagyobb így a szám levenné róla a nullát vagy valamilyen műveletet is csinálna közbe

(#2662) Hege1234


Hege1234
addikt

segítséggel persze de meglett végül a megoldás

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '[{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["time"]],"id":17},{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]' | jq --raw-output '.[0].result + .[1].result | .item.file, ( .time | .hours * 3600 + .minutes * 60 + .seconds | strftime("%H%M%S"))' > info.txt

demo

(#2663) Fecogame


Fecogame
veterán

Van egy ilyen awk parancsom:

awk "BEGIN {print (($(awk "BEGIN {print (100 - 0.11)}") * 0.000025442)/100)}"

A kimenet pedig így néz ki:
2.5414e-05

Na most én ezt "normálisan" kiírva szeretném megkapni, nem pedig tudományos formátumban. Találtam ezt a megoldást, de beillesztve (print cserélve printf-re) nem működik, errort dob:

awk "BEGIN {printf "%.2f", (($(awk "BEGIN {printf "%.2f", (100 - 0.11)}") * 0.000025442)/100)}"

Error:
awk: line 1: syntax error at or near %

Hogyan kaphatnám meg az eredményt, ami 0.00002541401?

:R

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2664) vargalex válasza Fecogame (#2663) üzenetére


vargalex
félisten

Ha tudod a tizedes jegyek számát, akkor:

echo | awk '{printf "%.13f", (100-0.11)*0.000025442/100}'

vagy a awk BEGIN-ben echo nélkül:

awk 'BEGIN {printf "%.13f", (100-0.11)*0.000025442/100}'

Természetesen, ha csak az általad írt kerekített érték kell, akkor a formátum a "%.11f".
Nem értem, hogy miért használod a beágyazott AWK-t...
Egyébként az AWK programot sima aposztrófok közé szokás tenni, így nincs kavarodás a printf formátum leírójával.

[ Szerkesztve ]

Alex

(#2665) Fecogame válasza vargalex (#2664) üzenetére


Fecogame
veterán

Sajnos nem tudom, hány tizedesjegy lesz benne.

Azért tettem macskakörmök közé, mert használok benne 2 változót is, csak most az egyszerűség kedvéért behelyettesítettem számokkal :)

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2666) Lenry


Lenry
félisten

egy bash scriptem egy while ciklussal szalad végig egy mappán, és végzi el a feladatát.
lehet valahogy előre tudni, hogy hány elemen fog dolgozni?
ki szeretném íratni, hogy pl a 130-ból a 15. mappán dolgozik épp'. utóbbi nyilván nem gond. előbbire viszont nincs ötletem

[ Szerkesztve ]

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2667) Jester01 válasza Lenry (#2666) üzenetére


Jester01
veterán

Először kigyűjtöd a listát amin végig kell menni?

Jester

(#2668) Lenry válasza Jester01 (#2667) üzenetére


Lenry
félisten

find . -mindepth 1 -maxdepth 1 -type d -name "*" -print | while ((i++)); read path
do
.....
done

ennyi az egész

[ Szerkesztve ]

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2669) Jester01 válasza Lenry (#2668) üzenetére


Jester01
veterán

dirs=(*/)
i=1
for path in "${dirs[@]}"
do
  echo $((i++))/${#dirs[@]} "$path"
done

Jester

(#2670) Headless válasza Lenry (#2668) üzenetére


Headless
őstag

Szia

ehhez hasonló megoldás lehet

dir_list=$(find . -mindepth 1 -maxdepth 1 -type d -name "*" -print)
dir_count=$(echo "$dir_list" |wc -l)
echo "$dir_list" |while ((i++)); read path
do
.....
done

Én csak másoltam a te funkcióidat azt nem vizsgáltam, hogy megfelelő-e, vagy, hogy van-e egyszerűbb, mellesleg szerintem van kicsit fura a while ciklusod, nem is tudom hogy ez szintaktikailag helyes-e.

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2671) Lenry válasza Headless (#2670) üzenetére


Lenry
félisten

hibátlanul fut, szóval olyan nagyon nem lehet elb*szva.

köszi a válaszokat :R

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2672) JoinR válasza Lenry (#2668) üzenetére


JoinR
senior tag

Legkevesebb módosítással:

LEN=$(ls -l | grep -c ^d)
find . -mindepth 1 -maxdepth 1 -type d -name "*" -print | while ((i++)); read path
do
echo $i/$LEN
done

(#2673) Lenry válasza JoinR (#2672) üzenetére


Lenry
félisten

bakker, ez annyira egyszerű, nem tudom hogy nem jutott eszembe :W
köszi :R

[ Szerkesztve ]

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2674) bambano válasza JoinR (#2672) üzenetére


bambano
titán
LOGOUT blog

miért nézed két módszerrel a listát?

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2675) Fecogame


Fecogame
veterán

ksh-ban szeretnék tört számokkal dolgozni, lehetőleg külső parancs nélkül. Az oka, hogy több tízezerszer kell lefuttatnom, és számít, mennyi idő alatt végez. awk-val már megcsináltam, csak lassú.

A furcsa az, hogy itt kiírja rendesen az eredményt tört számként:
pi@raspberrypi:~ $ ksh -c 'echo $((250/0.8))'
312.5

Itt viszont nem:
pi@raspberrypi:~ $ ksh -c 'echo $((24832/23413))'
1

És így sem:
pi@raspberrypi:~ $ ksh -c 'echo $((23413/24832))'
0

Miért? És hogyan lehetne rávenni, hogy ne kerekítsen? :)

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2676) dabadab válasza Fecogame (#2675) üzenetére


dabadab
titán

ksh-ban szeretnék tört számokkal dolgozni

Igen, ezt hívják statisztikusnak.

:DDD

Egyébként meg pont úgy működik, mint C-ben: ha sima egész számokat adsz meg, akkor integer aritmetikát használ, ha lát benne tizedespont (vagy vesszőt, éljen a lokalizáció :D ), akkor meg floating pointot:

db@jano:~$ ksh -c 'echo $((24832/23413.0))'
1.06060735488830991

(Ja, és nincs floating point minden ksh-ban, verziótól függ)

[ Szerkesztve ]

DRM is theft

(#2677) Fecogame válasza dabadab (#2676) üzenetére


Fecogame
veterán

Köszi, így már működik! :) :R

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2678) Headless válasza Fecogame (#2675) üzenetére


Headless
őstag

ha nagyon érdekel a teljesítmény shellt miért nem felejted el? pl megcsinálhatod az egészet awk-val. Még lehet egy python is gyorsabb. vagy ha tényleg számít minden us akkor c++.

annó csináltam egy tesztet:
1-1000-ig vizsgáltam a számokat, hogy prím-e és a tisztán awk megoldás töredéke volt, mint a sima shell megoldásnak.

[ Szerkesztve ]

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2679) coco2


coco2
őstag

Sziasztok!

Linux / bash script. Kicsit (nagyon) kijöttem a gyakorlatból.

Van egy környezeti változó, T_STR. Benne van mondjuk ez: "custom str". Környezetből használom shell scriptben (/bin/bash enyem_script.sh) valahogy így:

#!/bin/bash
echo "${T_STR}"
echo "$T_STR"
echo ${T_STR}
echo $T_STR

Valaki le tudja írni nekem legalább dióhéjban, hogy mi a különbség ezek között az echo-k között? Ami különbség van, az mikor számít?

A ""-ről talán az volt, hogy ha space van a stringben, és nem raktam macskakörmök közé a változó értékét olyankor, amikor egy shell parancsba beillesztettem, akkor az két külön paraméternek minősülhet, és "szét törhet" miatta a parancs bemenetem. De erre visszaigazolást várnék tényleg ez van-e vele, vagy rosszl emlékszem?

A { }-ről valami változó érték értelmezés volt talán, de már nem emlékszem.

កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។

(#2680) Jester01 válasza coco2 (#2679) üzenetére


Jester01
veterán

Igen az idézőjel azért van. A kapcsoszárójel meg többek között akkor kell ha nem egyértelmű a változó neve, pl. echo "${T_STR}foo".

[ Szerkesztve ]

Jester

(#2681) coco2 válasza Jester01 (#2680) üzenetére


coco2
őstag

Megvan, köszönöm :)

Nyersanyag tippet had kérjek script gyártáshoz.

Bash scriptben listázni szeretném a helyi könyvtárat ( ./ ), és ha találok file-t adott kiterjesztéssel (pld ".txt" -> létezik "file.txt"), első (vagy akár utolsó) olyan létező file nevét szeretném változóba rakni (FILENAME="file.txt"). A határozatlanság oka, hogy a mappában garantáltan csak egy olyan file lesz, de ha mégis több lenne, azt valahogyan detektálni kell, és leállítanom a scriptet, vagy hibatűrés jelleggel csak az egyiket dolgozni fel a sok közül. Bármelyik jó.

Ha jól sejtem, valami áradat szerkesztővel kell majd játszadoznom. Jól jönne rá pár példa, hogyan, és hogy az áradatszerkesztő scriptjéből hogyan mozgathatok adatot kívülre, ha egyáltalán bárhogyan.

កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។

(#2682) JoinR válasza coco2 (#2681) üzenetére


JoinR
senior tag

Kár túlbonyolítani, ha talál még fájlt, az utolsó lesz a változó értéke és kész.

(#2683) Headless válasza coco2 (#2681) üzenetére


Headless
őstag

utolsó elem
filename=$(ls ./*.txt |tail -n 1)

első elem
filename=$(ls ./*.txt |head -n 1)

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2684) coco2 válasza Headless (#2683) üzenetére


coco2
őstag

:C Köszönöm

កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។

(#2685) _kovi_


_kovi_
aktív tag

Sziasztok!
Lenne egy olyan gondom, hogy fájlokat kell generálnom és a fájlnév utolsó 4 karakterében egy számot teszek ami növelődik, pl.: 0001, 0002, 0003, 0004 .... stb
A Bashnek van egy gondja ezzel a számmal, mert ahogy olvastam oktálisnak veszi.
Konkrétan 0008-ig szépen megcsinálja a fájlokat és aztán a debugban:
0008: túl nagy érték a számrendszerhez (hibás token: „0008”

Így csináltam a kódban:
SZAMLALO=$((SZAMLALO+1))
SZAMLALO=$(printf "%04d\n" $((10#$SZAMLALO)))

Úgy találtam googliban, hogy a 10# -al meg lehet neki mondani, hogy 10-es számrendszerben legyen, de valahogy nem eszi meg..

Ez működik, de beleteszi a fájlnévbe a # -ot:
SZAM=$(printf "%04d\n" $SZAMLALO)
SZAMLALO=10#$SZAM
Amit elvileg meg tudnék cut- olni de nem túl elegáns. :)

Köszi!!

[ Szerkesztve ]

(#2686) Jester01 válasza _kovi_ (#2685) üzenetére


Jester01
veterán

A számlálót tartsd simán számként és csak a fájlnévbe tedd a printf-el.

Jester

(#2687) _kovi_ válasza Jester01 (#2686) üzenetére


_kovi_
aktív tag

Huh le tudnád ezt írni picit bővebben? :)

(#2688) dabadab válasza _kovi_ (#2687) üzenetére


dabadab
titán

valami ilyesmi:

X=1
while [ $X -lt 1000 ] ; do
        FILENAME="$(printf "file%04d.txt" $X)"
        echo $FILENAME
        let X++
done

DRM is theft

(#2689) _kovi_ válasza dabadab (#2688) üzenetére


_kovi_
aktív tag

Köszönöm!!

(#2690) Fecogame


Fecogame
veterán

Hogyan lehetne megszámolni, hogy adott számsorozat elemei között (ebben a sorrendben nézve) hányszor történt emelkedés/csökkenés? Példa:

2
3
4
6
2
1
7
3

A fenti példában 4 alkalommal emelkedett és 3 alkalommal csökkent az érték.

Nyilván összehasonlítom az aktuálisat az előzővel, ez rendben van, csak hogyan kezelem le ezt a legelső elemnél? Counterrel a for cikluson belül?

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2691) Fecogame válasza Fecogame (#2690) üzenetére


Fecogame
veterán

Megoldva :)

rsup="0"
rsdown="0"
itemcounter="1"
for rs in ${arr[@]}; do
      if [ "$itemcounter" -gt "1" ]; then
              [ "$rs" -gt "$rsold" ] && (( rsup = rsup + 1 ))
              [ "$rs" -lt "$rsold" ] && (( rsdown = rsdown + 1 ))
      (( itemcounter = itemcounter + 1 ))
      rsold="$rs"
done

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2692) Fecogame válasza Fecogame (#2691) üzenetére


Fecogame
veterán

Közben rájöttem, hogy több hiba is van a fenti kódban, de javítva, így már tökéletes :)

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2693) tjsz


tjsz
senior tag

Sziasztok!

Nem tudom, hogy jó helyen járok-e, de segítségre lenne szükségem: miért van az, hogy az alábbi "programkód" mindig más-más DHCP kérési időpontot ad ki, pedig közben a listabeli gépek még bekapcsolva sem voltak. Érdekes módon az eltérés mindig annyi, ahány másodperccel később futtatam.

root@Router:/tmp/home/root# cat /var/lib/misc/dnsmasq.leases|awk '{print $3, $2, $4, $1}'|sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n|awk -v dhcplt=604800 '{print $4,systime()+$4-dhcplt, $2, $1, $3}'|awk '{ if
 ($1 == "0" ) print "Unknown - infinite      ","   ",$3,"   ",sprintf("%-18s",$4),$5; else print strftime("%c", $2),"   ",$3,"   ",sprintf("%-18s",$4),$5; }' >> "$file_email_std"
Sun Dec 19 08:43:35 2021     50:e5:94:12:34:56     192.168.1.1         Home_pc
Sun Dec 19 08:51:30 2021     bc:5f:4f:12:34:56     192.168.1.2         Home_pc_2
root@Router:/tmp/home/root# cat /var/lib/misc/dnsmasq.leases|awk '{print $3, $2, $4, $1}'|sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n|awk -v dhcplt=604800 '{print $4,systime()+$4-dhcplt, $2, $1, $3}'|awk '{ if
 ($1 == "0" ) print "Unknown - infinite      ","   ",$3,"   ",sprintf("%-18s",$4),$5; else print strftime("%c", $2),"   ",$3,"   ",sprintf("%-18s",$4),$5; }'
Sun Dec 19 08:43:45 2021     50:e5:94:12:34:56     192.168.1.1         Home_pc
Sun Dec 19 08:51:40 2021     bc:5f:4f:12:34:56     192.168.1.2         Home_pc_2
root@Router:/tmp/home/root# cat /var/lib/misc/dnsmasq.leases|awk '{print $3, $2, $4, $1}'|sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n|awk -v dhcplt=604800 '{print $4,systime()+$4-dhcplt, $2, $1, $3}'|awk '{ if
 ($1 == "0" ) print "Unknown - infinite      ","   ",$3,"   ",sprintf("%-18s",$4),$5; else print strftime("%c", $2),"   ",$3,"   ",sprintf("%-18s",$4),$5; }'
Sun Dec 19 08:44:17 2021     50:e5:94:12:34:56     192.168.1.1         Home_pc
Sun Dec 19 08:52:12 2021     bc:5f:4f:12:34:56     192.168.1.2         Home_pc_2
root@Router:/tmp/home/root# exit

Tehát pl. az egyik futtatáskor a Home_pc 8:43:35-kor, 10 másodperccel későbbi futtatáskor mintha 8:43:45-kor kért volna IP címet.

DNS cache beállítva 0-ra, tehát nem cache-el.

[ Szerkesztve ]

(#2694) f_sanyee válasza tjsz (#2693) üzenetére


f_sanyee
senior tag

Mi a cél? a dnsmasq.leases fileban fix dátum van, hogy mikor jár le a lease, nem kell számolgatni. a DNS-nek semmi köze a DHCP-hoz.

(#2695) tjsz válasza f_sanyee (#2694) üzenetére


tjsz
senior tag

A cél: kiszámolni, hogy adott eszköz mikor kért IP címet.

(#2696) f_sanyee válasza tjsz (#2695) üzenetére


f_sanyee
senior tag

akkor nem a systime()-ból kéne kivonni a ttl-t, hanem a fileban lévő első oszlopól.
ez pl a jelenegi időből teszi:
date +%s | awk '{ print strftime("%a %b %d %H:%M:%S", $1-604800) }'

(#2697) tjsz válasza f_sanyee (#2696) üzenetére


tjsz
senior tag

Köszönöm a tippet, ki fogom próbálni!

(#2698) tjsz válasza f_sanyee (#2694) üzenetére


tjsz
senior tag

A dnsmasq.leases file 1. oszlopában a "dhcp lease time"-ból hátralévő idő van tárolva másodpercben. Tehát ha pl. 1 hétre kap minden eszköz IP címet, akkor az IP cím kérés 1. másodpercében 604800 az érték, majd ez szépen csökken 1-esével másodpercenként egészen addig, amíg le nem nullázodik ill. ha nem kér újra IP címet az adott eszköz.

A probléma ott volt/van, hogy bár a dns cache ki van kapcsolva, a dnsmasq.leases file csak akkor frissül, ha egy újabb eszköz kér IP címet, ekkor az 1. oszlopban lévő értékek korrigálásra kerülnek. Vagyis: nem a systime()-al volt a gond, hanem ezzel a cache-eléssel.

Közben egy újabb kérdés fogalmazódott meg bennem: mivel ugyanazon script többféle esemény miatt is elindításra kerülhet (pl. WAN oldal up vagy éppen down, napi riport készítés, stb.), ezért hogyan lenne érdemes azt megoldani, hogy egyidejűleg csak 1 példányban induljon el? Valami ideiglenes file létrehozás-törléssel? (és annak ellenőrzésével)

[ Szerkesztve ]

(#2699) f_sanyee válasza tjsz (#2698) üzenetére


f_sanyee
senior tag

nem tudom milyen dnsmasq verzióban lehet az elsó oszlop a lease time, de az enyémben itt a lease vége van, epoch formában, pl:
router:~# for d in $(awk '{ print $1}' /var/lib/misc/dnsmasq.leases); do echo -n "$d: "; date "+%Y-%m-%d %H:%M" -d @${d}; done
1640798190: 2021-12-29 18:16
1640766485: 2021-12-29 09:28
1640759983: 2021-12-29 07:39
1640788042: 2021-12-29 15:27
1640799888: 2021-12-29 18:44
1640794808: 2021-12-29 17:20
1640798330: 2021-12-29 18:18
1640791708: 2021-12-29 16:28
1640790907: 2021-12-29 16:15
router:~# date
Wed Dec 29 07:18:07 CET 2021

a DNS cache-nek ehhez semmi köze, ezek DHCP leasek.
napi reportnak ebből nem sok értelme van szerintem, inkább nézném a dnsmasq logját, hogy mikor osztott ki valaminek címet..

(#2700) tjsz válasza f_sanyee (#2699) üzenetére


tjsz
senior tag

root@Router:/tmp/home/root# for d in $(awk '{ print $1}' /var/lib/misc/dnsmasq.leases); do echo -n "$d: "; date "+%Y-%m-%d %H:%M" -d @${d}; done
603566: 1970-01-08 00:39
594732: 1970-01-07 22:12
339516: 1970-01-04 23:18
500044: 1970-01-06 19:54
541145: 1970-01-07 07:19
604800: 1970-01-08 01:00
235115: 1970-01-03 18:18
386945: 1970-01-05 12:29
604157: 1970-01-08 00:49
589094: 1970-01-07 20:38
603861: 1970-01-08 00:44
596755: 1970-01-07 22:45
569503: 1970-01-07 15:11
555154: 1970-01-07 11:12
529923: 1970-01-07 04:12
81783: 1970-01-01 23:43
101094: 1970-01-02 05:04
89397: 1970-01-02 01:49
106480: 1970-01-02 06:34
524019: 1970-01-07 02:33
510826: 1970-01-06 22:53
429562: 1970-01-06 00:19
517980: 1970-01-07 00:53
518487: 1970-01-07 01:01

root@Router:/tmp/home/root# dnsmasq -v
Dnsmasq version 2.80-7d04e17  Copyright (c) 2000-2018 Simon Kelley
Compile time options: IPv6 GNU-getopt no-RTC no-DBus no-UBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset Tomato-helper auth DNSSEC no-ID loop-detect inotify no-dumpfile
This software comes with ABSOLUTELY NO WARRANTY.
Dnsmasq is free software, and you are welcome to redistribute it
under the terms of the GNU General Public License, version 2 or 3.
root@Router:/tmp/home/root#

FreshTomato firmware.

Copyright © 2000-2024 PROHARDVER Informatikai Kft.