Új hozzászólás Aktív témák
-
Jester01
veterán
Megfelelő locale beállítás mellett elvileg az alnum osztályban benne kell legyenek az ékezetes betűk is. Ha nem, akkor fel kell őket sorolni. Az aposztrófot pedig úgy a legegyszerűbb beletenni ha dupla idézőjelre váltunk:
sed "s/[[:alnum:]']//g; s/\(.\)/\1\n/g" abc | sort -u
-
bambano
titán
válasz
ChiliChili #1695 üzenetére
ha ráírtál arra a meghajtóra, amiről a törölt adatot akarod visszahozni, akkor lehúztad az egészet a retyeráton.
(#1696) prucam: A-Z-ben nincs benne a magyar ékezet, mert az ascii/utf-8 kódja kívül esik ezen a tartományon. ebbe csak az angol abc nagybetűi tartoznak bele.
echo "1349'45934" | tr -d "'"
echo "1349'45934" | sed -e "s/'//"a tr-ben macskaköröm-aposztróf-macskaköröm van. (falusiasan: idézőjel-aposztróf-idézőjel)
-
prucam
tag
-
ChiliChili
tag
Sziasztok! Ti talán tudtok segíteni, remélem, jó helyen járok. Egy rossz rsync algoritmussal, letöröltem néhány *.dmg (Mac OSX disk image file) kiterjesztésű fájlt egy ext3-as meghajtóról. Ezeket szeretném visszaszerezni a PhotoRec segítségével, úgy hogy készítek egy custom signature (custom.sig) filet. Illetve csak készítenék, mert nem működik a dolog. Nem is működhet, mert nem igaztán értem, mit kellene tennem.
Próbáltgattam szerkeszteni a photorec.sig fájlt, de nem jártam eredménnyel, továbbra is unknown üzenetet kapok a fidentify parancsra.
Itt egy hexdump | head egy *.dmg fájlból:
00000000 78 01 ed d7 41 6a c2 40 14 00 d0 af 86 2e ba 75 |x...Aj.@.......u|
00000010 5d 98 6d 77 a2 45 97 6d a0 16 a4 34 01 a9 07 f0 |].mw.E.m...4....|
00000020 0a 9e a0 07 e8 a2 f4 18 5e c0 43 79 81 ee 6c 22 |........^.Cy..l"|
00000030 0a ea 3a 8b 40 de 5f 24 33 93 30 fc 79 7f f3 67 |..:.@._$3.0.y..g|
00000040 1f 3f e9 14 d1 7f f9 cd fa 51 c5 5f c4 73 1c 22 |.?.......Q._.s."|
00000050 52 35 ce 76 83 dd 43 bd 18 51 7f eb c5 dd 71 7c |R5.v..C..Q....q||
00000060 7e 7c c5 e3 e4 69 3c 2b 16 ef 65 91 5e a7 a3 51 |~|...i<+..e.^..Q|
00000070 7a cb 3f 27 e3 6a cb f3 1f de ed 15 58 6d 97 cb |z.?'.j......Xm..|
00000080 75 de de fc 64 d6 84 c0 66 93 af 87 e5 7d 0c be |u...d...f....}..|
00000090 b3 9b ed 56 db 9b 05 d3 4e 09 a8 7f a7 ca ed b0 |...V....N.......| -
McSzaby
őstag
Sziasztok,
grep stdout-t szeretném fájlba írni úgy, hogy a képernyőre ne dobja ki. Mindezt egy forcikluson belül, de sehogy sem tudom megcsinálni.
Tudtok tippet adni hogy küldöm be a grep stdout-t egy fájlba?
-
prucam
tag
Szia,
köszi a segítséget!
Itt ülök kb. 30 perce, de nem igazán értem....
Egyszerűbben is lehetne?
Valahogy így:grep -v '[a-zA-Z0-9]' abc > abc_2
1. nem akarom törölni a karaktereket, csak tudni kellen mégis mi fordul elő a fájlban
2. nem kell, hogy hányszor fordul elő. Csak lista.üdv
-
prucam
tag
Sziasztok!
azt szeretném megtudni, hogy egy file-ben, milyen karakterek vannak, betűkön [Aa-Zz] és számokon [0-9] kívül.
Valami ilyesmi lenne az eredmény:
()+-:.!?[]
Lehet egy sorba is, v. egymás alá is.
üdv
-
Jester01
veterán
válasz
sto1911 #1686 üzenetére
Nincs fordítva mert az 1>file is azt jelenti igazából, hogy a jobb oldalon lévő fájlt nyissa meg (írásra) és mostantól az legyen az 1-es deszkriptor. A nyíl az egyenlőségjel (értékadás) helyett áll, az iránya pedig a megnyitás módjára utal.
1>file azt jelenti 1=file (és írni fogunk bele) -
Jester01
veterán
válasz
sto1911 #1682 üzenetére
Az 1-es deszkriptort (stdout) és a 2-est (stderr) szeretnénk megcserélni, mert a | pipe az 1-est irányítja át miközben a whiptail a 2-esre írja az eredményt és az 1-est pedig a terminálhoz használná.
A cseréhez a szokásos módszert használtam:
tmp=a
a=b
b=tmpVagyis először a 2-est ideiglenesen lemásoljuk a 3-asra (3>&2) majd az 1-est a 2-esre (2>&1) végül a 3-ast az 1-esre (1>&3-) és itt a 3-ast be is zárjuk.
-
Jester01
veterán
Ja látom már mi a probléma, a whiptail-nek szüksége van az stdout-ra de a pipe azt átirányítja, így amit ő a terminálba írogatna azt a sudo mint jelszót megkapja. Elvileg ez jó lesz mert megcseréli az stdout-ot és az stderr-t:
whiptail --passwordbox 'passwrd' 8 28 3>&2 2>&1 1>&3- | sudo -S -p "" apt-get update
Vagy, ha már megvan a jelszó akkor egyeszerűen:
echo $pwd | sudo -S -p "" apt-get update
-
alfa20
senior tag
válasz
Jester01 #1678 üzenetére
így néz ki a próba script:
#!/bin/bash
exec 3>&1
pwd=`whiptail --passwordbox 'Add meg a rendszergazda jelszavát:' 8 40 2>&1 1>&3`
exec 3>&-
whiptail --passwordbox 'passwrd' 8 28 | sudo -S -p " " apt-get updateeredmény:
az első rész bekéri a jelszót majd eltárolja a $pwd váltózóban
ez szépen működik,
a második résznél viszont "Sorry, try again." üzenet fogad 3x, majd "sudo: 3 incorrect password attempts" -
-
alfa20
senior tag
Sziasztok,
Egy kis segítséget szeretnék kérni, készítettem egy script-et aminek az a lényege, hogy ha felteszem az Ubuntut egy gépre, akkor automatikusan minden szükséges tárolót felvesz, lefrissíti a rendszert, majd automatikusan telepíti/eltávolítja a szükséges (megszokott) programokat, ez a kis script nagyon jól teszi a dolgát.
Most viszont szeretném kicsit megváltoztatni, hogy mindezt a whiptail-el tegye szeretném kicsit csinosítani, ezzel is megvagyok egy változatban, csak az a baj hogy "sudo ./install.sh"-val kell indítanom terminálból, mert a "whiptail --passwordbox"-al sehogy sem boldogulok.Valaki meg tudná mutatni hogy működik?
Hogy tudnám vele elérni, hogy pl. a "sudo apt-get update"-hez egy witget-be kérje a jelszót?google-ban kerestem, de nem találtam használhatót az angollal meg hadi lábon állok
-
prucam
tag
válasz
bambano #1669 üzenetére
kipróbáltam rendezés nélkül:
# diff A_file B_file
6,7d5
< Dinnye Héja
< Kívül Zöld Belül Piros?
19c17
< Kobalt F1
---
> Kobalt F1
\ No newline at end of fileEz mit jelenthet: 6,7d5
a 6 és a 7 a sorok sorszámát. d5?
19c17: meg gondoloma file-k hany sorból állnakEgy darabig próbálgattom, de ez nekem megfelel. Majd megláttom mit szól az 5000 soros file-hez...
-
prucam
tag
Sziasztok,
lassan "farigcsálom" a sciptem, s szeretnék újra segítséget kérni tőletek.
Szitu:
- teljes soregyezést vizsgálunk
- van két file-m, egy hosszú (a_file), s egy rövidebb (b_file). Azt melyik paranccsal tudom megcsinálni, hogy "b_file" sorai közül melyik nem szerepel az "a_file-ben"?Készítettem egy képet is, hogy érthető legyen:
"a" és "b" file-k, csak a "b"-ben szerepel:
Dinnye Héja
Kívül Zöld Belül Piros?Ezeket szeretném eredményül. Légyszí segítsetek!
Köszönöm
-
dabadab
titán
válasz
bambano #1663 üzenetére
"ha az sqlldr meghal, akkor annak az exit státuszát kell lekezelni, arra a trapek szerintem nem jók."
De, tud ilyet is:
#!/bin/sh
trap "echo hiba!" ERR
echo true
# ennek nulla a visszateresi erteke
true
echo false
# ennek nemnulla a visszateresi erteke
false
echo vegeMondjuk a legtobb esetben tenyleg sokkal hasznalhatobb az "if [ $? -ne 0 ] ; then [ ... ] fi" szerkezet.
-
bambano
titán
válasz
Speeedfire #1664 üzenetére
nem te írod bele a szkriptbe, hanem benne lehet a programban.
például azok a programok, amik jelszót akarnak bekérni, elég gyakran nem a szabvány bemenetet és kimenetet használják, hanem közvetlenül a terminált, hogy ne lehessen átirányítani a jelszó beírást. az ilyeneknél előfordul, hogyha leteszed háttérbe, megáll.egyébként így is lehet, grafománia esetén, de tömörebb:
sqlldr @sql && ha sikerült
vagy
sqlldr @sql || ha nemsikerült.
ja, arra figyelj, hogy a cron-nál nem ugyanaz szokott a keresési út lenni, mint a bejelentkezéskor, ezért van, hogy program natívan bejelentkezve fut, crontabból meg nem. crontab esetén be kell állítani minden környezeti változót újra.
-
Speeedfire
félisten
válasz
bambano #1663 üzenetére
Ez jónak tűnik, mert akkor elvileg ennyivel le lehetne kezelni, igaz minden egyes sqlldr vagy sqlplus utasításhoz kell egy ilyen "burok", de nem vészes.
Tehát ha jól értettem:sqlldr @sql
if [$? -eq 0];
then
#megvalami
else
#hibaeset
fiElvileg semmi olyat nem írtam a scriptbe, ami miatt a /dev/tty-t kellene használni, de ettől függetlenül elképzelhető. Alapesetben cron-nal futna le, csak most foltozom még és tesztnél jobb lett volna a &.
Köszi az infókat. -
bambano
titán
válasz
Speeedfire #1662 üzenetére
A trapek az aktuális shell szkriptnek küldött megszakítások elkapására jók.
ha az sqlldr meghal, akkor annak az exit státuszát kell lekezelni, arra a trapek szerintem nem jók.
valamelyik bash változóban benne van az utoljára futtatott parancs exit státusza (közben elolvastam, $?), ami nulla, ha jól futott le, valami más szám, ha nem, és 128+n, ha az n. megszakítás hatására lépett ki.A háttérben futtatás hibánál meg azt kellene megnézni, hogy a programok nem akarják-e használni a /dev/tty-t, mert lehet, azért akad le háttérben. linuxon strace van, solarison emlékeim szerint truss.
-
Speeedfire
félisten
válasz
dabadab #1661 üzenetére
Konkrétan van 3 sqlplus és 1 sqlldr parancs, ami meghal ha pl nincs adatbázis kapcsolat, vagy a fájlban valami rossz. Ilyenkor meg megáll a script, ekkor lenne jó, pl egy exception. Vagy ha azt mondom, hogy:
sql=trap sqlplus
akkor ezt visszatér valami értékkel? Elég hülyén van megcsinálva a 2 sql error kezelése, vagy csak én vagyok béna. Nem tudom.
Az sqlplus-hoz csak spool fájl van, amibe visszaírja az eredményt. Az sqlldr meg paraméteresen van error log fájl, de ott van, hogy 10 percig tölti az adatbázisba az adatokat és nem tudom, hogy mi a baja.Ami még fura nekem, hogy a legtöbb esetben hiba nélkül fut a script, ha így indítom el
bash pelda.sh, de ha mögé teszek egy & jelet, akkor már 10/10 alkalommal lehal.
Solaris serveren van. -
dabadab
titán
válasz
Speeedfire #1660 üzenetére
Igazan eleve nincsenek igazan exceptionok, igy aztan nagyon nincs is mit lekezelni
Ami van, azok a signalok, azokat meg (bash-ben, a tovabbiak konkretan arrol szolnak) a trap utasitassal lehet lekezelni, illetve a trap a signalokon kivul meg ismer par egyeb alkalmat is (EXIT - a script vegen, RETURN - return utasitaskor, DEBUG - kb. minden parancs elott, ERR - ha egy parancs nemnulla visszateresi erteket ad)
Valos eletbol vett pelda arra, hogy barhol lepjen ki a program, mindig umountolja a felmountolt fs-t (a 0 az EXIT "szignal"):
mount $INMNT
trap "umount $INMNT" 0 -
Speeedfire
félisten
Shell scriptben lehet csinálni valami kivétel kezelést (try{}catch{}), mint más nyelvekben?
Egy ideje fontozgatom a feldolgozót, de nem az igazi. -
Jester01
veterán
válasz
Speeedfire #1657 üzenetére
Mert dupla [ jellel kezdted, amik között ráadásul szóköz is volt. Ebben a formában az első az a test programot hívja meg, a második pedig már annak argumentum ezért fog besokallni. bash-ban van [[ konstrukció is, de ekkor nem szabad szóközt tenni mert ilyenkor ez a dupla zárójel egy egység, és ilyenformán kell lezárni is. Vagyis 2 lehetőséged van:
1.) test használata:
if [ $IF_FILE_PROCESSED -eq "0" ] && [ $IF_FILE_ERROR -eq "0" ];
2.) [[ használata:
if [[ $IF_FILE_PROCESSED -eq "0" && $IF_FILE_ERROR -eq "0" ]];A 0-át egyébként teljesen fölösleges idézőjelbe tenni, a változókat viszont célszerű ha nem tudod biztosan mi lehet bennük.
-
Speeedfire
félisten
Erre nekem miért írja, hogy túl sok argumentum?
if [ [ $IF_FILE_PROCESSED -eq "0" ] && [ $IF_FILE_ERROR -eq "0" ] ];
[: too many arguments
-
Dagobert07
tag
Sziasztok kellene egy kis help a beadandómhoz!!!!
Válaszotokat előre is köszönöm!
A feladat a következő: Levelezőlista
A shell script automatikusan továbbítsa a beérkező leveleket a levelezési listára feliratkozott felhasználóknak. Valósítsa meg az automatikus fel- és leiratkozásokat is. A próbák során ne zavarjon másokat!
Már nagy részben kész a script az megvan hogy aki feliratkozik annak automatikusan küld egy üdvözlőlevelet,A fel és leiratkozás megvan , annyiból áll hogy menti txt-fájlba az emailt, tesztelve jól működik
a másik része az lenne hogy ha érekezik az email címemre egy mail továbbítsam annak a txt fájlos emailcímeknek.Aki tudna nekem segíteni leírhatja itt is fórumba,a helyzet hogy nem vagyok zseni belőle ez a része nekem elég nehéz, így aki személyesen tudna és szeretne segíteni itt a Facebook oldalam: https://www.facebook.com/arvaiati
MINDENKINEK ELŐRE KÖSZÖNÖM !!
-
Jester01
veterán
válasz
pepe006 #1653 üzenetére
A find kapcsolóiról a man page ad részletes leírást.
Az f még a -type-hoz tartozik, az ellenőrzi, hogy mezei file legyen.
A -printf kiíratási művelet azzal megspékelve, hogy különböző dolgokat lehet behelyettesíteni. A %H az argumentum neve ami alatt megtalálta a fájlt, a \n szokás szerint soremelés.
A -quit pedig abbahagyja a keresést az első találat után. Ez nem csak a hatékonyság miatt van, hanem azért, hogy csak egyszer írja ki.A */ az kilistázza a könyvtárakat (az első szinten), és a for ciklus ezeken megy végig. Mint említettem a feladatkiírás nem volt teljesen precíz, szóval nem tudom ez-e az elvárt működés.
-
Jester01
veterán
válasz
FishAir #1641 üzenetére
$ cat >test.sh
#!/bin/bash
f=${1//./ }
tmp=${f#*[0-9]* }
echo "${f:0:${#f}-${#tmp}}"
$ bash test.sh jo.reggelt.kivanok.2013.sallang.hablaty.rizsa
jo reggelt kivanok 2013
$ bash test.sh jo.reggelt.kivanok.s20e13.sallang.hablaty.rizsa
jo reggelt kivanok s20e13Mint látható, ez bash specifikus. A másolás része gondolom menni fog.
-
FishAir
senior tag
válasz
Claude Leon #1642 üzenetére
Tyíha. Nagyon szépen köszönöm. Küzdeni fogok vele még így is szerintem. Úgyhogy lehet, hogy majd keresni foglak, ha nem baj.
-
pepe006
csendes tag
Sziasztok!
Kaptam egy feladatot órán és nem sok ötletem van arra merre is induljak el.
Még csak kezdő vagyok ebben.
Tudnátok nekem segíteni?
Köszi ÜdvBash script írása, mely tetszőleges paraméterként megadott könyvtár esetében kilistázza azon könyvtárakat, melyekben valahol szerepel olyan .php kiterjesztésű fájl, melyben megtalálható az ’eval’ string (aposztrofok nélkül)!
-
Claude Leon
senior tag
válasz
FishAir #1641 üzenetére
#!/bin/bash
if test -z $2
then
echo "Használata: $0 [honna] [hova]"
exit
fi
if ! test -d $2 && test -a $2
then
echo '"'$2'" nem directory!'
else
if ! test -a $2
then
mkdir $2
fi
ls -a |awk -v sourcedir=$1 -v targetdir=$2 '// { fln=""; n=split($0,array,".");
for (i=1;i<=n;i++) {if (i==n||array[i] ~ /[[:digit:]]/||array[i]=="")
{fln=(fln array[i])} else fln=(fln array[i] " ");
if (array[i] ~ /[[:digit:]]/) break;}
{print "test ! -d " sourcedir "/" $0 " && cp -f " sourcedir "/" $0 " \"" targetdir "/" fln "\"" ;} }'|sh -
fi
exitDe hogy te is dolgozz vele, ha valami szerepel már u.a. néven, gondolkodás nélkül felülírja.
-
FishAir
senior tag
Sziasztok!
Egy olyan scriptre lenne szükségem, ami egy adott könyvtárból egy másik helyen készít egy átnevezett másolatot úgy, hogy a pontokat lecseréli space-re és az első olyan szó (space-el elválasztott szöveg) utáni részt levágja, amiben szám is van. Példa:
ebből:
jo.reggelt.kivanok.2013.sallang.hablaty.rizsa
ezt:
jo reggelt kivanok 2013vagy
ebből:
jo.reggelt.kivanok.s20e13.sallang.hablaty.rizsa
ezt:
jo reggelt kivanok s20e13Köszi előre is.
-
LógaGéza
veterán
Üdv!
Lenne két gyors kérdésem.
1.: A napokban teljesen automatizálásra állítottam be egy gépet. Lényeg, hogy fut rajta egy Impress vetítés, egy osd_clock óra, és egy netrádió mplayerrel.
Ez futtatja:/opt/libreoffice4.1/program/soffice.bin --impress --nologo --norestore -show /home/user/vetites/vetites.odp | osd_clock -c white -s 0 -F '%Y %h %e %T' -f -xos4-terminus-bold-r-normal--40-400-72-72-c-180-iso8859-15 | mplayer http://x.hu/y.mp3 < /dev/null &
Van egy másik szkript, ami cron-ba beállított időközönként lefut, megszakítja ezeknek a futtatását, elindít egy videót, majd ha vége a videónak, akkor újra elindítja a fenti szkriptet. Az ilyen:
killall mplayer | killall osd_clock | killall soffice.bin && mplayer /home/user/adas.avi -fs && sh /home/user/vetites/run.sh
Annyi a problémám ezzel, hogy ha bejön a cron művelet, akkor a leállítás megtörténik, viszont a videó nem indul el, csak ha kézzel kiadom az && utáni parancsot. Mit rontok el?
2.: Ugyanez a gép, ugyanez a rendszer. Rosszalkodik manapság az internet, elmegy - visszajön. Ezt nem szereti az mplayer, ha nincs egy ideig elérés, akkor leáll, és nincs hang. Szeretnék egy olyan szkriptet, ami ellenőrzi, hogy fut-e az mplayer, és ha nem fut, akkor elindítja, ezt is beraknám cron-ba.
-
prucam
tag
Sziasztok,
egy fájlban szeretném megtudni az üres soroknak a sorszámát. Ezt hogyan lehet?
üdv
-
McSzaby
őstag
Sziasztok,
Ismerkedőben vagyok a scripteléssel és az lenne a kérdésem, hogy van-e valamilyen módszer/megoldás arra, hogy mondjuk egy tar parancsot egy amolyan szokványos 0-100% követő "folyamatábrába" szúrjak bele? whiptail-lel próbálkoztam, de valahogy nem akart összejönne...
-
Jester01
veterán
válasz
szlovibuki #1634 üzenetére
Ha van jogod cron-t használni akkor azzal meg tudod csinálni.
-
szlovibuki
tag
Sziasztok! Van egy shell hozzáférésem, amin irssit futtatok. Az irrsihez van egy scriptem, amit szeretnék automatizálni, hogy előre beállított időben (pl. délelőtt 11 órakor, minden nap) induljon el és ne nekem kelljen paranccsal elindítani. Ebben tud valaki segíteni?
-
bobsys
veterán
VBS-ben ez a sor csinal valamit?
'shell.run "\\servername\NETLOGON\application.exe"
A ' a sor legelejen nem azt jelenti, hogy komment igy nem fog futni az application.exe?
-
prucam
tag
Sziasztok,
van egy fájlom aminek a sorai elé szeretnénk beilleszteni egy üres oszlopot (pl. 1-33-ig) v. 4 tabulátor szélesség.
Hogyan lehet megcsinálni? Légyszí segítsetek. Köszi
-
válasz
persnongrat #1628 üzenetére
Erre akadtam rá. Remélem jó.
-
doc
nagyúr
válasz
cappa72 #1625 üzenetére
tobb variacio is van
hasznalhatod pl. a "szamjegy" jelolest: \d, vagyis ket szamjegynel: \d\d
vagy mondhatod azt is hogy "barmilyen karakter" ami a pont, vagyis ket akarmi: ..
de vannak meg variaciokmod: ugy tunik a \d nem megy sed-ben, akkor marad a "bobeszedubb" megoldas ha szamjegyre akarsz keresni: [0-9]
-
Sziasztok!
Látszólag egyszerűnek tűnő problémába ütköztem.
Életem első sed -i parancsával gyűlt meg a bajom.
Szeretnék verziókövetést végrehajtani egy fájlon belül.
Eddig nem lenne gond, mert
sed -i "s/doksi-v-00/doksi-v-01/" version.txt
még ok.
Viszont nem biztos, hogy a -00 verziószámot a 01 követi, hanem - kihagyva néhány verziót - a -04.
Na és itt akadtam el... Tehát akárhányadik verziót -04-re varázsolni.
Gondolkodtam azon, hogy hogyan lehetne a v- után ??-t használni, hátha a két "akátmilyen" karakter cserélhető lesz, de ez így saját kútfőből nem megy.
Próbáltam sed -i "s/v-\?/v-04/" version.txt írni, de akkor beszúrja a 04-et a 00 elé.Köszönöm.
-
rt06
veterán
hi
ennek kapcsan kerdeznem, hogy:
- miert?
- hol van meg felesleges idezojel, s miert?
- hova kellene meg esetleg idezojel, s miert? -
Jester01
veterán
Mellesleg van rá céleszköz, úgy hívják, pidof (vagy pgrep)
-
McSzaby
őstag
Sziasztok,
Most ismerkedem igazából csak a scripteléssel, de egy kérdésre nem találok sehol sem választ.
Szóval, egy if függvényben hogy tudom ellenőrizni egy processz futását? Én így oldottam meg, de szerintem ennél van szebb megoldás is.
if echo `ps -ef |grep $PROCESS | grep -v grep`
then .....gondoltam rá, hogy ezt elintézem így,
$PROCESS2= echo `ps -ef |grep $PROCESS | grep -v grep`
if [ $PROCESS2 -gt 0] ...de gyanítom ez így ebben a formában elég nagy bullshit, ugye?!..
-
Pxs
aktív tag
Sikerült megoldani minden akadályt és ez lett a vége...
Egy tcpdump-ot használó script, amelyik egy rakás paramétert kezel (beállítható pl. hogy meddig fusson, mekkora helyet harapjon ki max. a diskből és egyebek). Ez nekem házi feladat volt és kb. 5 év szünet után fogtam hozzá újra a shell programozáshoz, úgyhogy örülök, hogy végre elkészült.
Hanem szerintem elég bő lére lett eresztve, valaki adna esetleg tippeket, melyik részein/hogyan lenne érdemes tömöríteni rajta ?Példa parancssor kitöltött paraméterekkel, ha valaki kipróbálná:
./gkdump -i eth0 -r 1 -M 10 -w $HOME -T 30 -U 40 -C 1 -P 80 -b 100 -X -D 10 -m 600
És a script (sorry, nem túl rövid, a tördelés meg várhatóan viccesen jön ki majd):
Üdv
#################################################################
#!/bin/bash
#GKDumpV1 by Gabor Kiss, 2013echo
if [[ $# -eq 0 ]]; then
#kapott-e parametereket a script
echo "TCP packet dump script by Gabor Kiss, 2013"
echo "Requires root or superuser privileges to work !"
echo
echo "Required parameters: "
echo
echo '-i [interface] -r [rotate time] -M [maximum number of files] -w [work directory]'
echo '-T [running time] -U [maximum allowed disk usage] -C [1 or any]: compress mode on/off '
echo
echo 'Optional/special parameters: '
echo
echo '-P [port number] -X: delete logfile -S: silent mode'
echo '-D [how many old dumpfiles to delete if disk space insufficient]'
echo '-m [packet count to capture] -b [if this disk size is exceeded, stop at start] '
echo '-I: list available network interfaces and exit -H: help'
echo
echo 'No parameters given ! Exiting...'
echo 'Use -H option for help.'
echo
exit 1
fiif [[ $# -lt 12 && $# -gt 1 ]]; then
#minden kotelezo parameter megvan ?
echo "Wrong number of parameters, exiting !"
echo '7 mandatory parameters are required or use -H for list.'
echo
exit 1
fiwhile getopts i:r:M:w:T
:SP:XD:m:b:HI option #parameterek atadasa
docase "${option}"
ini) INTERFACE=${OPTARG};; #halozati interface valasztas
r) REPEAT_TIME=${OPTARG};; #milyen gyakran rotalja a file-okat
M) MAXFILES=${OPTARG};; #maximum hany file-t mentsen le/tartson
w) WORKDIR=${OPTARG};; #hova mentse a dumpfile-okat
T) RUNTIME=${OPTARG};; #meddig fusson a script
U) MAX_USED=${OPTARG};; #mennyi szabad hely szazaleknal alljon le
C) COMPRESS=${OPTARG};; #BZIP2 compress mode, kulon kezelje !S) SILENT_MODE=1;; #silent mode, csak logfile-ba iras
P) PORTNUM=${OPTARG};; #port number a dump-hoz,kulon kezelje
X) PURGE_LOG=1;; #logfile torlese
D) GETSPACE=${OPTARG};; #ennyi dumpfile-t toroljon, ha nincs eleg hely
m) MAXPACKETS=${OPTARG};; #maximum hany packetet mentsen le
b) DISK_EXCEED=${OPTARG};; #ha ekkora vagy nagyobb a disk usage,alljon le a startnal
I) AVAILABLE_IFACES=1;; #elerheto halozati interface-ekH) HELP=1;; #csak
hasznalati info kiiratasa
####
esac
doneif [[ -z $MAXPACKETS ]]; then #default 100.000 packet capture maximum, ha nincs
megadva a -m paraméter
MAXPACKETS=100000
fiif [[ -z $HELP ]]; then #ellenorizni, a help funkcio lett-e csak meghivva
DISK_USAGE=$(df $WORKDIR|tail -1|awk {'print $5'}|awk -F"%" {'print $1'} )
if [[ $DISK_USAGE -ge $DISK_EXCEED ]]; then
echo "Current disk usage is $DISK_USAGE %, more than allowed $DISK_EXCEED %. Exiting.."
echo
exit 1
fifi
if [[ $AVAILABLE_IFACES -gt 0 ]] ; then #elerheto halozati
interface-ek kiiratasa es kilepes
echo
echo "Available network interfaces for listening: "
echo
ifconfig -s|grep -vi "iface"|awk {'print $1'}
echo
exit 0
fiif [[ PURGE_LOG -gt 0 ]]; then #logfile torlese
rm -f dumped.log
echo
echo 'Logfile dumped.log deleted.'
echo
fiif [[ -z $SILENT_MODE && $HELP -eq 1 ]]; then #HELP mode
echo
echo "TCP packet dump script by Gabor Kiss, 2013"
echo "Requires root or superuser privileges to work !"
echo
echo 'Required parameters & functions: '
echo
echo '-i: which network interface to use'
echo '-r: how often to rotate the dump files (in seconds, greater than zero)'
echo '-M: maximum number of PCAP dump files to keep (greater than zero)'
echo '-w: working directory to save dump files into'
echo '-T: maximum allowed runtime in seconds (greater than zero)'
echo '-U: do not start operation/stop when directory FS usage hits this value (greater than zero)'
echo '-C: use BZIP2 compression (1=enabled, any other value=disabled)'
echo
echo "Optional parameters & functions: "
echo
echo '-S: silent mode, do not write anything on screen, write results only to logfile: dumped.log'
echo '-P: listen on this port number (greater than zero)'
echo '-X: delete existing logfile'
echo '-D: delete this many old dump files, if there is insufficient space on startup (greater than zero)'
echo '-m: maximum number of packets to capture'
echo '-b: if current disk usage is equal or greater than this, stop the script after starting'
echo '-H: display this help message'
echo
exit 0
fiif [[ $SILENT_MODE -eq 1 ]] ; then #silent
mode bekapcsolasa es logolas (hozzafuzes a loghoz)
logfile=dumped.log
exec >> $logfile 2>&1
fiif [[ SILENT_MODE -eq 1 ]]; then
#logfile fejlec datumozasa silent mode eseten
echo
echo '#############################'
date
echo '#############################'
echo
fiif [[ $REPEAT_TIME -eq 0 || $MAXFILES -eq 0 || $RUNTIME -eq 0 || $MAX_USED -eq 0 ]]; then #kotelezo numerikus
parameter ne legyen 0
echo
echo "One or more numeric parameters with zero value ! Exiting..."
echo
exit 1
fiecho "TCP packet dump script by Gabor Kiss, 2013"
echo "Requires root or superuser privileges to work."DISK_USAGE=$(df $WORKDIR|tail -1|awk {'print $5'}|awk -F"%" {'print $1'} ) #mentes helyen mennyi hely
van az FS-ben
if [[ $DISK_USAGE -gt $MAX_USED ]] ; then #ne
induljon el, ha x% felett van a filesystem kihasznaltsaga
echo
echo "Disk usage in working directory is $DISK_USAGE %. Maximum allowed is $MAX_USED %."if [[ $GETSPACE -gt 0 ]]; then
ITERATION=0
echo "Trying to get enough disk space. Deleting $GETSPACE old dumpfiles..."while [[ $ITERATION -le $GETSPACE ]]; do
let ITERATION++
sudo rm -f $(ls -tc $WORKDIR/*pcap* 2>/dev/null|awk {'print $1'}|tail -1)
doneDISK_USAGE=$(df $WORKDIR|tail -1|awk {'print $5'}|awk -F"%" {'print $1'} )
echo "Completed. New disk usage is $DISK_USAGE%."
if [[ $DISK_USAGE -gt $MAX_USED ]]; then
echo "Could not free enough disk space. Exiting..."
echo
exit 1fi
fi
if [[ -z $GETSPACE ]]; then
#ha nincs megadva, hany file-t toroljon hely felszabaditasra, kilepes
echo 'No -D value was given. Exiting...'
echo
exit 1
fielse
echo
echo "Disk usage in working directory is $DISK_USAGE %. Maximum allowed is $MAX_USED %. Proceeding.." #eleghely eseten tovabb
fiecho
echo "Running tcpdump on network interface: $INTERFACE. Rotating dumpfiles every: $REPEAT_TIME second." #parameterek osszegzese
echo "Maximum dump files to keep: $MAXFILES. Allowed runtime: $RUNTIME seconds."if [[ $MAXPACKETS -gt 0 ]]; then
echo "Maximum number of packets to capture: $MAXPACKETS"fi
if [[ $PORTNUM -gt 0 ]]; then
echo "Listening on port $PORTNUM."
fi
if [[ $COMPRESS -eq 1 ]]; then
echo "Using BZIP2 compression on dump files."
else
echo "Not using compression on dump files."
fi
echo "Saving files in directory $WORKDIR."
echo "PLEASE WAIT..."if [[ ! -d "$WORKDIR" ]]; then #ha nem letezik a mentesekhez konyvtar, hozza letre
sudo mkdir $WORKDIR
fiecho
if [[ $COMPRESS -gt 0 ]]; then #BZIP2 tomorites hasznalata
if [[ -z $PORTNUM ]]; then
sudo tcpdump -i $INTERFACE -G $REPEAT_TIME -W $MAXFILES -c $MAXPACKETS -z bzip2 -w
"$WORKDIR/tcpdump_%Y-%m-%d_%H:%M:%S.pcap" &
else
sudo tcpdump port $PORTNUM -i $INTERFACE -G $REPEAT_TIME -W $MAXFILES -c $MAXPACKETS -z bzip2 -w
"$WORKDIR/tcpdump_%Y-%m-%d_%H:%M:%S.pcap" &
fi
else
if [[ $PORTNUM -gt 0 ]]; then
sudo tcpdump port $PORTNUM -i $INTERFACE -G $REPEAT_TIME -W $MAXFILES -c $MAXPACKETS -w
"$WORKDIR/tcpdump_%Y-%m-%d_%H:%M:%S.pcap" 1>/dev/null &
fiif [[ -z $PORTNUM ]]; then
sudo tcpdump -i $INTERFACE -G $REPEAT_TIME -W $MAXFILES -c $MAXPACKETS -w "$WORKDIR/tcpdump_%Y-%m-%d_%H:%M:%S.pcap" 1>/dev/null &
fifi
TCPD_BACKGROUND=$!
#hatterben futo tcpdump PID megjegyzese
COUNTER=0
#ellenorzo rutin az aktualis disk space-hez es "visszaszamlalo"
KILLED=0
until [[ $COUNTER -eq $RUNTIME ]]; doDISK_USAGE=$(df $WORKDIR|tail -1|awk {'print $5'}|awk -F"%" {'print $1'})
if [[ $DISK_USAGE -ge $MAX_USED ]]; then
RED_FLAG=1
else
RED_FLAG=0
fiif [[ RED_FLAG -gt 0 ]] ; then
sudo kill $TCPD_BACKGROUND
echo
echo '*** Disk space exceeded ! Killed tcpdump process !***'
echo "Runtime was: $COUNTER seconds."
echo
KILLED=1
break
fisleep 1
let COUNTER++if [[ KILLED -gt 0 ]]; then
break
fidone
if [[ RED_FLAG -eq 0 ]]; then
sudo kill $TCPD_BACKGROUND
echo
echo '*** Tcpdump background process was killed. Disk space OK. ***'
echo "Runtime was: $RUNTIME seconds."
echo
fi###
CURRENT_FILES=$(sudo ls -l $WORKDIR/*pcap* 2>/dev/null|wc -l) #file
darabszamot ellenorzo es takarito rutin
TOTAL=0if [[ $CURRENT_FILES -gt $MAXFILES ]]; then
echo
echo "There are $CURRENT_FILES dumpfiles in the working directory of maximum $MAXFILES, cleaning old files.."
DIFFERENCE=$CURRENT_FILES-$MAXFILESwhile [ $CURRENT_FILES -gt $MAXFILES ]; do
CURRENT_FILES=$(sudo ls -l $WORKDIR/*pcap*|wc -l) 2>/dev/null
sudo rm -f $(ls -tc $WORKDIR/*pcap*|awk {'print $1'}|tail -1) 2>/dev/null #legregebbi file-ok torlese
let TOTAL++if [[ $DIFFERENCE -eq $TOTAL ]]; then
break
fidone
else
echo
echo "There are $CURRENT_FILES dumpfiles in the working directory, cleaning is NOT necessary."
echo "Operation summary: "fi
echo
#muveletek osszegzese
TOTAL_DUMP=$(ls -l $WORKDIR/*pcap*|wc -l)
echo "$TOTAL old files were deleted."
echo "There are a total of $TOTAL_DUMP dumpfiles available."
NEWEST=$(ls -tc $WORKDIR/*pcap*|awk {'print $1'}|head -1)
echo "Newest file is: $NEWEST"
OLDEST=$(ls -tc $WORKDIR/*pcap*|awk {'print $1'}|tail -1)
echo "Oldest file is: $OLDEST"echo
echo "Operation complete. Bye. "
echoif [[ $SILENT_MODE -eq 1 ]]; then
#silent mode veget jelzo uzenet es stdout visszairanyitasa a terminalra
exec >/dev/tty
echo "Completed without severe errors. See logfile $HOME/dumped.log for results."
echo
fiexit 0
-
Pxs
aktív tag
Eszembe jutott, hogy a while loop gyakorlatilag egy subshell, azért nem látja a változókat.
Áthidaltam a dolgot azzal, hogy a while loop-ban minden egyes iterációnál egy temp file-ba íratom sorrendben a script paramétereinek értékeit, aztán sed-del beolvastatom a loop-on kívül, így működik a dolog.Nem csoda, hogy a tcpdump behülyült..nem is kapott semmilyen értékeket paramétereknek.
Tanulság: éjjel 2-kor már ne írjunk scriptet, ha nem munkahelyen vagyunk.
Ugyanakkor, ha valaki megírná, hogyan érhetném el a változókat a while loop-on kívül is, azt megköszönném. Export/declare nem oldja meg a dolgot..
-
Pxs
aktív tag
Közben felfedeztem, hogy egyetlen változóban sem tárolja el az értéket...azaz mégsem veszi át a paramétereket értékeit
i) INTERFACE=${OPTARG};; #halozati interface valasztas
r) REPEAT_TIME=${OPTARG};; #milyen gyakran kezdjen uj file-t
w) WORKDIR=${OPTARG};; #hova mentse a dumpfile-okat
m) MAXFILES=${OPTARG};; #maximum hany dump file-t tartson megEzek mind tök üresek, csak a while loop-ban tudom kiíratni az értékeiket. Mi lenne a megoldás ? :S
-
Pxs
aktív tag
válasz
buherton #1611 üzenetére
Köszönöm, közben sikerült valamit alkotnom getopts-szal, legalábbis a paramétereket átveszi.
Switch-et nem használtam, azt muszáj ?
Az alábbi script jött össze (a lényege, hogy adott paraméterekkel dumpokat készítsen TCP dumppal).
Nagyon sürgős lenne vele elkészülnöm és két pontban totál elakadtam.Az egyik: a $WORKDIR változó mindig üresen marad, hiába adom meg az indításnál a paraméterét (ahová mentse a dump file-okat)
A másik: a tcpdump parancs (a script forráskód vége felé) folyton beleköt valamibe, próbáltam betartani a gyári paraméter sorrendjét (lényeges-e ez egyáltalán ?), de rendszerint ilyesmit kapok:
-G: invalid packet count (ezt a -c opció után, azaz legjobb meglátásom szerint a -c után kapott számot és az azt követő -G kapcsolót egy paraméternek akarja venni és mivel a "-G" nem szám, hibát dob...)
Valaki le tudná nekem ellenőrízni és segíteni/kijavítani ?
Ezer hála előre is !A script:
#!/bin/bash
while getopts i:r:w:m: option
do
case "${option} "
ini) INTERFACE=${OPTARG};; #halozati interface valasztas
r) REPEAT_TIME=${OPTARG};; #milyen gyakran kezdjen uj file-t
w) WORKDIR=${OPTARG};; #hova mentse a dumpfile-okat
m) MAXFILES=${OPTARG};; #maximum hany dump file-t tartson megesac
echo "Aktualis param: $option "--" $OPTARG" #debughoz
done
echo "Working directory: $WORKDIR" #ez valamiert mindig ures marad !
sudo tcpdump -i $INTERFACE -G $REPEAT_TIME -c $MAXFILES -w "/trace_%Y-%m-%d_%H:%M:%S.pcap"
exit 0
-
buherton
őstag
Íme:
$ ./pelda.sh -a10
TEMP=$(getopt -o a:: -- "$@")
eval set -- "$TEMP"
while true ; do
case "$1" in
-a)
case "$2" in
"") echo "Option a, no argument"; shift 2 ;;
*) echo "Option a, argument $2"; shift 2;;
esac ;;
--) shift; break ;;
*) echo "Internal error!"; exit 1 ;;
esac
doneForrás: [link]
-
Pxs
aktív tag
Sziasztok !
Linux/BASH script írásban jártasak számára egy kérdés:
Paraméterezhető scriptet kellene írnom, ilyesmi formában:
<scriptnév> -a -b -c -d -e ....
Hogyan tudnám megoldani, hogy pl. a "-a" utáni paramétert (pl. számot) ne 2. számúnak vegye, hanem elsőnek ? (Mert ilyenkor az "-a"-t veszi elsőnek alapból).
Illetve, hogyan passzolok át egy ilyen paramétert a scriptnek értelmezésre ?: pl. -c 2500 (tehát értelmezze azt, hogy a "-c" benne van a param listában és az utána lévő értéket is)
A paraméterek sorrendje mindig fix ? (Ez azért is fontos, mert ki kell íratnom hiányos/nem megfelelő paraméter megadás esetén a usage-et)
Valaki itt említette a getopts-ot...az nem szúrja el a sorrendet ?
Régebben foglalkoztam már ezzel, de évek teltek el azóta...nem ugrik be és amit eddig neten találtam, azon se leltem meg a pontos választ. Ez egy határidős dolog, 2 napom maradt rá és ez csak a jéghegy csúcsa belőle.
Remélem, érthetően fogalmaztam Előre is köszi mindenkinek ! -
persnongrat
tag
válasz
#68216320 #1608 üzenetére
Egyébként a korábbi, /tmp-s megjegyzésemre visszatérve: oda akartam kilyukadni, hogy normálisan beállított gépeken pl. a /tmp önálló fájlrendszer és "noexec" opcióval van mountolva, nehogy véletlenül onnan futtasson valaki valami illetlen dolgot.
Egyszer szívtam meg, elég mély nyomot hagyott. -
#68216320
törölt tag
válasz
persnongrat #1606 üzenetére
Igazad volt. Másoltam és belekerülhetett valami karakter. Beírtam kézzel és működik
Köszönöm a tippet.
-
buherton
őstag
-
#68216320
törölt tag
válasz
persnongrat #1603 üzenetére
A user home-ban van. Simán az echo működik. Nem lép be a ciklusba, mert, ha a while do-ba írom bele az echo-t akkor nem ír ki semmit.
-
persnongrat
tag
válasz
#68216320 #1602 üzenetére
Hová tetted? Nem lehet, hogy esetleg a /tmp-be (ahogy egy időben nekem is szokásom volt az egyébként szemétnek szánt, scriptekkel) ?
A script nem fut vagy a curl nem ad vissza semmit és végtelen ciklusban áll az egész?Ha ugyanitt leteszel egy végrehajtható x.sh-t, amiben ennyi van:
#!/bin/bash
echo helloEz lefut?
Valami hibaüzenet? -
#68216320
törölt tag
Urak, miért lehet, hogy nem fut az alábbi szkript?
#!/bin/bash
while [ 1 ]
do
curl google.com
sleep 20
donechmod-al futásjog beállítva. Ha terminálba bemásolom, ott fut. sh-ként viszont nem. Mintha bele sem kezdene a ciklusba.
Új hozzászólás Aktív témák
- Országosan a legjobb BANKMENTES részletfizetési konstrukció! Lenovo ThinkPad L16 Gen 1 Prémium
- BESZÁMÍTÁS! Gigabyte B450 R7 5700X 32GB DDR4 512GB SSD RX 6700XT 12GB Rampage SHIVA be quiet! 650W
- BESZÁMÍTÁS! SAPPHIRE VEGA 64 8GB HBM2 videokártya garanciával hibátlan működéssel
- iKing.Hu - Apple 16 Pro Max - Natural Titanium - Új, kipróbált
- BESZÁMÍTÁS! MSI B450M R5 3600 16GB DDR4 512GB SSD RTX 2060 Super 8GB THERMALTAKE Core V21 500W
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest