next previous contents naprej nazaj vsebina napredna vprasanja radi jih vprasujejo ljudje ki mislijo da ze poznajo vse odgovore kako berem znake s terminala ne da bi bilo uporabniku treba pritisniti return subject how do i read characters without requiring the user to hit return date thu mar est preverite nacin cbreak v bsd ali nacin ~icanon v sysv ce se sami ne zelite spoprijeti s terminalskimi paramteri z uporabo sistemskega klica ioctl lahko prepustite delo programu stty a to je pocasno in neucinkovito in vcasih boste morali spremeniti kodo da bo delala pravilno include stdio h main int c printf pritisnite katerikoli znak za nadaljevanje\n funkcija ioctl bi bila tukaj boljsa le leni programerji delajo takole system bin stty cbreak ali stty raw c getchar system bin stty cbreak printf hvala ker ste vnesli c \n c exit nekaj ljudi mi je poslalo razlicne bolj pravilne resitve tega problema zal mi je da jih ne morem vkljuciti saj zares presegajo namen tega seznama preveriti boste zeleli tudi dokumentacijo prenosljive knjiznice zaslonskih funkcij imenovane curses`` ce vas zanima v i enega samega znaka vas pogosto zanima tudi neka vrsta kontrole prikaza na zaslonu in knjiznica curses priskrbi razlicne prenosljive rutine za obe funkciji kako preverim ce je treba prebrati znak ne da bi ga zares prebral subject how do i check to see if there are characters to be read date thu mar est v nekaterih razlicicah unixa je mogoce preveriti ali je v danem datotecnem deskriptorju kaj neprebranih znakov v bsd ju lahko uporabite select uporabite lahko tudi fionread ioctl ki vrne stevilo znakov ki cakajo na prebranje a to deluje le pri terminalih cevovodih in vticih v system v release lahko uporabite poll a to deluje le na tokovih v xenixu in torej na unixu sysv r in poznejsih sistemski klic rdchk poroca o tem ali se bo klic read na danem datotecnem deskriptorju blokiral ni nacina da bi preverili ali so znaki dostopni za branje s kazalca file lahko gledate po notranjih podatkovnih strukturah stdio da bi videli ce je vmesni pomnilnik vhoda neprazen a to ne bo delovalo saj ne veste kaj se bo zgodilo naslednjic ko boste hoteli napolniti vmesni pomnilnik vcasih ljudje vprasujejo to vprasanje z namenom da bi napisali if znaki dostopni iz fd read fd buf sizeof buf in dobili ucinek neblokovnega branja z read to ni najboljsi nacin za izvedbo tega saj je mozno da bodo znaki dostopni ko preverite dostopnost a ne bodo vec dostopni ko poklicete read namesto tega prizgite zastavico o ndelay ki se pod bsd imenuje tudi fndelay z izbiro f setfl funkcije fcntl starejsi sistemi version bsd nimajo o ndelay na teh sistemih lahko najblizje neblokovnemu branju pridete z uporabo alarm da branju potece cas kako ugotovim ime odprte datoteke subject how do i find the name of an open file date thu mar est v splosnem je to pretezko datotecni deskriptor je lahko obesen na cevovod ali pty in v tem primeru nima imena lahko je obesen na datoteko ki je bila odstranjena lahko ima vec imen zaradi pravih ali simbolicnih povezav ce morate to res storiti in prepricajte se da ste o tem razmislili na dolgo in siroko in se odlocili da nimate druge izbire lahko uporabite find z izbiro inum in morda se xdev ali uporabite ncheck ali se enkrat oponasajte funkcionalnost enega od teh orodij v vasem programu zavedajte se da preiskovanje megabytnega datotecnega sistema za datoteko ki je morda sploh ni traja nekaj casa kako lahko tekoci program ugotovi svojo lastno pot subject how can an executing program determine its own pathname date thu mar est vas program lahko pogleda argv ce se zacenja z `` je to verjetno ime absolutne poti do vasega programa sicer lahko vas program pogleda v vsak imenik imenovan v okoljski spremenljivki path in poskusa najti prvi imenik ki vsebuje izvrsilno datoteko katere ime se ujema s programovim argv ki je po dogovoru ime programa ki se izvaja ce zdruzite ta imenik in vrednost argv imate verjetno pravo ime ne morete pa biti prepricani saj je povsem legalno da en program izvede drugega z exec s katerokoli vrednostjo argv ki si jo zazeli da exec izvrsuje nove programe z imenom izvrsilne datoteke v argv je le dogovor na primer povsem hipoteticni primer include stdio h main execl usr games rogue vi disertacija char null izvrseni program misli da je njegovo ime njegova vrednost argv vi disertacija`` tudi nekateri drugi programi lahko mislijo da je ime programa ki ga trenutno poganjate vi disertacija`` a seveda je to le hipoteticni primer zato tega ne poskusajte sami kako uporabim popen za odprtje procesa za branje in pisanje subject how do i use popen to open a process for reading and writing date thu mar est problem ko poskusate preusmeriti vhod in izhod poljubnemu suzenjskemu procesu je da lahko nastane mrtva zanka ce oba procesa hkrati cakata na se ne generiran vhod zanki se lahko izognemo tako da obe strani upostevata strog protokol brez mrtvih zank toda ker to zahteva sodelovanje med procesi je neprimerno za knjiznicno funkcijo podobno popen distribucija expect`` vkljucuje knjiznico funkcij ki jih lahko c jevski programer klice neposredno ena izmed funkcij dela isto stvar kot popen za hkratno branje in pisanje uporablja ptys namesto cevi in nima problemov z zaciklanjem prenosljiva je na bsd in sv glejte vprasanje kako pozenem passwd ftp telnet tip in druge interaktivne programe v skripti ukazne lupine v ozadju `` za vec podatkov o distribuciji expect kako izvedem v c ju sleep za manj kot sekundo subject how do i sleep in a c program for less than one second date thu mar est najprej se zavedajte da je vse kar lahko dolocite minimalna kolicina zakasnitve dejanska zakasnitev bo odvisna od upravniskih zadev kot je obremenitev sistema in je lahko poljubno dolga ce nimate srece ne obstaja funkcija standardne knjiznice na katero bi se lahko zanesli v vseh okolji za dremanje`` angl napping obicajen izraz za kratke spance nekatera okolja priskrbijo funkcijo usleep n `` ki zadrzi izvajanje za n mikrosekund ce vase okolje ne podpira usleep je tukaj nekaj njenih implementacij za okolja bsd in system v naslednja koda douga gwyna je prirejena z emulacijske podpore systema v za bsd in izrablja sistemski klic select na bsd ju doug jo je prvotno imenoval nap `` vi jo boste verjetno zeleli klicati usleep `` usleep podporna rutina za emulacijo sistemskih klicev bsd zadnja sprememba originalne verzije oktober d a gwyn extern int select int usleep usec vrne ce je ok sicer long usec premor v mikrosekundah static struct `timeval' long tv sec sekunde long tv usec mikrosekunde delay premor select delay tv sec usec l delay tv usec usec l return select long long long delay na unixih system v bi lahko to storili takole podsekundni premori za system v ali karkoli kar ima poll don libes bsd jeva analogija te funkcije je definirana v mikrosekundah medtem kot je poll definiran v milisekundah zaradi zdruzljivosti ta funkcija priskrbi natancnost po dolgem teku tako da oklesti prave zahteve na milisekundo natancno in akumulira mikrosekunde med posameznimi klici z idejo da jo verjetno klicete v tesni zanki in se bo po dolgem teku napaka iznicila ce je ne klicete v tesni zanki potem skoraj gotovo ne potrebujete mikrosekundne natancnosti in v tem primeru vam ni mar za mikrosekunde ce vam bi bilo mar tako ali tako ne bi uporabljali unixa saj lahko nakljucno prebavljanje sistema npr razporejanje zmelje casomerilno kodo vrne ob uspesnem premoru ob neuspesnem include poll h int usleep usec unsigned int usec mikrosekunde static subtotal mikrosekunde int msec milisekunde 'foo' je tukaj le zato ker so imele nekatere verzije hrosca pri katerem se prvi argument poll preverja za obstoj pravilnega pomnilniskega naslova ceprav je drugi argument enak struct pollfd foo subtotal usec ce je premor ms ne naredi nicesar a si zapomni if subtotal return msec subtotal subtotal subtotal return poll foo unsigned long msec se ena moznost za dremanje na system v in verjetno tudi drugih ne bsd unixih je paket s nap jona zeeffa objavljen v comp sources misc volume ne potrebuje namestitve gonilnika naprave a deluje brez napak ko se namesti njegova locljivost je omejena z vrednostjo hz v jedru saj uporablja rutino delay jedra mnogo novejsih unixov ima funkcijo nanosleep kako pripravim skripte setuid` ukazne lupine do delovanja subject how can i get setuid shell scripts to work date thu mar est ta odgovor je dolg a to je zapleteno in pogosto zastavljeno vprasanje hvala maartenu litmaathu za ta odgovor in za spodaj omenjeni program indir`` najprej predpostavimo da ste na razlicici unixa npr bsd ali sunos ki pozna tako imenovane izvrsilna skripte ukaznih lupin`` taksna skripta se mora zaceti s podobno vrstico bin sh skripta se imenuje izvrsilna`` ker se tako kot resnicna binarna izvrsilna datoteka zacne s tako imenovano magicno stevilko`` ki doloca tip izvrsilne datoteke glejte tudi razdelek zakaj se nekatere skripte zacnejo z `` `` v nasem primeru je ta stevilka enaka `` in os vzame ostanek prve vrstice kot interpreter za skripto ki mu morda sledi uvodna izbira kot je bin sed f denimo da se ta skripta imenuje foo` in se nahaja v imeniku bin ce potem napisete foo arg arg arg bo os preuredil zadeve tako kot bi napisali bin sed f bin foo arg arg arg vendar je tukaj neka razlika ce je prizgan bit setuid za foo` bo spostovan v prvi obliki ukaza ce zares vpisete drugo obliko bo os spostoval bite z dovoljenji programa bin sed ki seveda ni setuid prav toda kaj ce se moja skripta ukazne lupine ne zacne s taksno vrstico ` ali ce moj os o tem nic ne ve no ce jo ukazna lupina ali kdorkoli drug poskusa izvesti bo os vrnil indikacijo napake saj se datoteka ne zacne z veljavno magicno stevilko ukazna lupina bo po sprejetju te indikacije predpostavila da gre za skripto ukazne lupine in ji dala se eno priloznost bin sh lupinska skripta argumenti a zdaj smo ze videli da se v tem primeru bit setuid datoteke lupinska skripta` ne bo spostoval prav kaj pa varnostna tveganja pri lupinskih skriptah setuid dobro denimo da se skripta imenuje etc skripta setuid` in se zacenja z vrstico bin sh zdaj pa poglejmo kaj se zgodi ce izvedemo naslednje ukaze cd tmp ln etc skripta setuid i path i vemo da bo zadnji ukaz preurejen v bin sh i toda ta ukaz nam bo dal interaktivno ukazno lupino ki bo z bitom setuid tekla kot da bi jo pognal lastnik skripte na sreco lahko to varnostno luknjo zlahka zapremo ce napisemo v prvo vrstico bin sh znak ` oznacuje konec seznama izbir naslednji argument i` bo vzet kot ime datoteke iz katere naj se berejo ukazi kot bi tudi moral biti vendar pa obstajajo veliko resnejsi problemi cd tmp ln etc skripta setuid temp nice temp mv moja skripta temp tretji ukaz bo preurejen v nice bin sh temp ker se ta ukaz izvaja pocasi bo morda lahko cetrti ukaz zamenjal originalno datoteko temp` s trojanskim konjem moja skripta` preden ukazna lupina sploh odpre temp` obstajajo nacini za krpanje te varnostne luknje naj os zazene skripte setuid na drugacen varen nacin system v r in bsd uporabljata gonilnik dev fd s katerim podata interpreterju datotecni deskriptor skripte naj bo skripta interpretirana posredno skozi vmesnik ki se preprica da je vse v redu preden pozene pravi interpreter ce uporabljate program indir` iz arhiva comp sources unix bodo skripte setuid izgledale takole bin indir u bin sh etc skripta setuid napravite binarni ovoj`` pravo izvrsilno datoteko ki je setuid in katere edina naloga je pognati interpreter z imenom skripte kot argumentom napravite splosen streznik za skripte setuid`` ki poskusa najti zahtevano opravilo` v bazi podatkov veljavnih skript in ob uspehu pozene pravi interpreter s pravimi argumenti zdaj ko smo se prepricali da se interpretira pravilna datoteka ali so prisotna se kaksna tveganja seveda za skripte ukazne lupine ne smete pozabiti eksplicitno nastavitev spremenljivke path na varno pot lahko ugotovite zakaj tukaj je se spremenljivka ifs ki lahko povzroca tezave ce ni pravilno nastavljena tudi druge okoljske spremenljivke lahko ogrozijo varnost sistema npr shell nadalje se morate prepricati da ukazi v skriptah ne dovoljujejo interaktivnih ubeznih zaporedij ukazne lupine potem je tukaj umask ki je lahko nastavljen na kaj cudnega et cetera zavedati se morate da skripta setuid podeduje`` vse hrosce in varnostna tveganja ukazov ki jih klice po vsem tem dobimo vtis da so lupinske skripte setuid precej tvegan posel morda bo za vas bolje programirati v c ju kako lahko ugotovim kateri uporabnik ali proces ima odprto datoteko ali uporablja dolocen datotecni sistem da ga lahko odmestim subject how can i find out which user or process has a file open date thu mar est uporabite fuser system v fstat bsd ofiles v javni lasti ali pff v javni lasti ti programi vam bodo povedali razlicne stvari o procesih ki upobljajo dolocene datoteke v arhivih comp sources unix volume najdete prenos fstat z bsd na dynix sunos in ultrix pff je del paketa kstuff in deluje na kar nekaj sistemih navodila za nabavo kstuff najdete v vprasanju kako lahko v skripti ali programu ugotovim id procesa programa z dolocenim imenom `` obvescen sem bil da obstaja tudi program imenovan lsof a ne vem kje se ga dobi michael fink michael fink uibk ac at dodaja ce ne morete odmestiti datotecnega sistema z umount za katerega zgornja orodja ne porocajo o odprtih datotekah se prepricajte da datotecni sistem ki ga poskusate odmescati ne vsebuje aktivnih tock namescanja uporabite df kako izsledim ljudi ki me tipajo s finger subject how do i keep track of people who are fingering me from jonathan i kamens from malenovi plains nodak edu nikola malenovic date thu sep v splosnem ne morete ugotoviti userid nekoga ki vas tipa z oddaljenega stroja morda lahko ugotovite stroj s katerega prihajajo oddaljene zahteve ena od moznosti ce jo vas sistem podpira in ce je tipalnemu strezniku angl finger daemon prav jo da naredite vaso datoteko plan za imenovano cev`` angl named pipe namesto obicajno datoteko za to uporabite mknod` potem lahko pozenete program ki bo odprl vaso datoteko plan za pisanje odpiranje bo blokirano dokler nek drugi proces namrec fingerd ne odpre plan za branje zdaj lahko skozi to pipo posljete kar pac zelite kar vam omogoca da prikazete razlicno informacijo plan vsakic ko vas nekdo potipa eden od programov za to je paket planner`` objavljen v volume arhivov comp sources misc seveda to sploh ne bo delovalo ce vas sistem ne podpira imenovanih cevi ali ce vas lokalni fingerd vztraja da imate navadne datoteke plan vas program lahko tudi izkoristi priloznost in pogleda v izhod programa netstat`` ter s tem ugotovi odkod prihaja zahteva za finger toda to vam ne bo izdalo identitete oddaljenega uporabnika ce zelite dobiti oddaljeni userid mora oddaljena stran poganjati identifikacijski streznik kot je rfc trenutno obstajajo tri implementacije rfc za popularne stroje bsd in nekaj aplikacij kot ftpd z wuarchive ki podpirajo ta streznik za vec informacij se prikljucite elektronskemu spisku rfc users z obicajno zahtevo subscribe`` na rfc users request kramden acf nyu edu glede tega odgovora obstajajo tri opozorila prvo je da mnogi sistemi nfs napacno prepoznajo imenovano cev to pomeni da bo poskus branja cevi na drugem stroju lahko blokiral dokler ne potece predviden cas ali videl cev kot datoteko dolzine in je ne bo nikoli izpisal drugi problem je da na veliko sistemih streznik fingerd preveri ali datoteka plan vsebuje podatke in je bralna preden jo poskusa brati v tem primeru bodo oddaljeni klici finger popolnoma zgresili vaso datoteko plan tretji problem je da imajo sistemi ki podpirajo imenovane cevi na voljo v danem casu le fiksno koncno stevilo le teh preverite nastavitveno datoteko jedra in izbiro fifocnt ce stevilo cevi na sistemu prekoraci vrednost fifocnt sistem prepreci izdelavo novih cevi dokler nekdo ne sprosti virov razlog za to je da je vmesni pomnilnik odmerjen v pomnilniku ki se ne preklaplja angl buffers are allocated in a non paged memory je mogoce ponovno prikljuciti proces na terminal ko je bil ta odklopljen tj po zagonu programa v ozadju in odjavi subject is it possible to reconnect a process to a terminal date thu mar est vecina razlicic unixa ne podpira odklopa`` in priklopa`` procesov angl detaching attaching processes kot ju podpirajo operacijski sistemi kot sta vms in multics vendar obstajajo prosto dostopni paketi s katerimi lahko pozenete procese na taksen nacin da se lahko pozneje spet pritrdijo na terminal prvi tak paket je screen`` ki je opisan v arhivih comp sources unix kot screen multiple windows on a crt`` slov zaslon vec oken na crt`` glejte paket screen v comp sources misc volume ta paket bo tekel vsaj na sistemih bsd system v r in sco unix drugi je pty`` ki je v arhivih comp sources unix opisan kot run a program under a pty session`` slov pozenite program v seansi pty`` glejte pty v volume nacrtovan je le za uporabo v sistemih podobnih bsd tretji je dislocate`` ki je skripta prilozena distribuciji expect za razliko od prejsnjih dveh bi moral ta teci na vseh razlicicah unixa podrobnosti o tem kako dobite expect najdete v vprasanju kako pozenem passwd ftp telnet tip in druge interaktivne programe v skripti ukazne lupine v ozadju `` nobeden od teh paketov ne deluje retroaktivno se pravi da morate pognati proces pod pripomockom screen ali pty ce ga zelite odklopiti in priklopiti je mogoce vohuniti`` na terminalu gledajoc izhod ki se prikazuje na drugem terminalu subject is it possible to spy on a terminal date wed dec za to obstaja vec razlicnih poti ceprav nobena od njih ni popolna pripomocek kibitz dovoljuje dvema ali vec clovekoma da sta v stiku prek ukazne lupine ali poljubnega programa uporaba vkljucuje opazovanje ali pomoc pri terminalski seji druge osebe belezenje pogovora z moznostjo pomika nazaj shranjevanje pogovora in celo spreminjanje med tekom mostveno igranje iger urejanje dokumentov ali druga opravila pri katerih ima vsaka oseba dolocene kvalitete in dolocene pomanjkljivosti ki se komplementirajo kibitz pride kot del distribucije expect glejte kako pozenem passwd ftp telnet tip in druge interaktivne programe v skripti ukazne lupine v ozadju `` za uporabo pripomocka kibitz potrebujete dovoljenje osebe ki jo zelite vohuniti vohunjenje brez privolitve zahteva manj prijetne pristope napisete lahko program ki brska po strukturah jedra in opazuje izhodni vmesni pomnilnik spornega terminala ter pri tem izpisuje znake kot se izpisujejo na izhod to ocitno ni nekaj kar naj bi poskusal kdorkoli ki nima izkusenj pri delu okoli jedra operacijskega sistema unix se vec katerokoli metodo boste ze uporabili bo verjetno zelo neprenosljiva ce zelite to poceti ves cas na dolocenem pritrjenem terminalu npr ce zelite da bodo lahko operaterji preverili zaslonski terminal stroja z drugih strojev lahko dejansko povezete monitor s terminalskim kablom na primer vtaknite izhod monitorja v serijska vrata drugega stroja in na teh vratih pozenite program ki bo nekam shranil svoj vhod in ga potem prenesel na druga vrata tista ki gredo zares na fizicni terminal ce to pocnete se morate prepricati da se ves izhod terminala posilja nazaj po zici ce povezujete le zice racunalnik terminal to ni problem to ni nekaj kar bi lahko pocel nekdo ki ni domac z napeljavo terminalskih zic in podobno zadnja razlicica paketa screen vkljucuje vecuporabniski nacin nekaj podatkov o paketu screen najdete v vprasanju je mogoce ponovno prikljuciti proces na terminal ko je bil ta odklopljen tj po zagonu programa v ozadju in odjavi `` ce ima sistem ki ga uporabljate tokove sunos svr vam kot nasvet priporocamo program objavljen v volume arhiva skupine comp sources misc in ni ga treba najprej zagnati vnaprej morate nastaviti vas sistem da samodejno potisne modul advise na tok vsakic ko se odpre tty ali pty naprej nazaj vsebina