| Autor | Sõnum | 
| v6lur Vana Pingviin
 
  
  
 Vanus: 37
 Liitunud: 08.07.2005
 Postitused: 667
 Asukoht: Kopenhaagen/Tartu
 Distributsioon: Arch
 
  
   |  
 
 
| 
| 
 |  
| Tekkis mõte proovida valmis saada väike skript/shelli käsk, mille abil Bluetoothi sisse-välja lülitada. Eesmärk on ühe globaalse kiirklahvi kaudu lülitada välja, kui on parajasti sisselülitatud, ja vastupidi. (Eraldi kiirklahve sisse- ja väljalülitamiseks ei taha, oleks liiga lihtne  ) 
 See töötab:
  	  | Kood: |  	  | $ if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth			 | 
 See ei tööta:
 (annab veateate "bash: syntax error near unexpected token `then' ") 	  | Kood: |  	  | $ sudo if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth			 | 
 ("/home/mihkel/bluetooth" on hetkel "/sys/devices/platform/asus-laptop/bluetooth" ohutu asendus.)
 Proovisin ka nii:
  	  | Kood: |  	  | sudo "if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth"			 | 
 Selle peale sain veateate "sudo: if [ 0 -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth: command not found"
 
 Mida ma valesti teen?
 |  
|  |  |  |  
| _________________
 "Sleep, she is for the weak."
 
 |  | 
|  |    | 
| johnsmith Vana Pingviin
 
  
  
 Vanus: 51
 Liitunud: 24.07.2006
 Postitused: 714
 Asukoht: Universum
 Distributsioon: Ubuntu/Gentoo/FreeBSD
 
  
   |  
 
 
| 
| 
 |  
| Ma arvan , et see mida sa tahad saavutada tuleks teha hoopis nii 
  	  | Kood: |  	  | 
#!/bin/bash
 
 if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1  ]
 then echo 0 > /sys/devices/platform/asus-laptop/bluetooth
 else echo 1 > /sys/devices/platform/asus-laptop/bluetooth
 fi
 
 #end
 
 | 
 
 Bash on päris lõdva süntaksiga seal pole vaja neid semikooloneid kuigi see on hea programmeerimise tava.  Muidugi üheski programmeerimiskeeles pole if testi järgi semikoolonit see on ikka lause lõpus. Ülimääraseid lauseid tuleks vältida, et säilitada koodi loetavus.
 
 EDIT: Siis peaks töötama nii.  Kas see sudo tahab salasõna ka ?
 |  
|  |  |  |  
| _________________
 "Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford
 
 
 Viimati muutis johnsmith 07.03.2008, 20:44; muudetud 1 kord
 |  | 
|  |    | 
| v6lur Vana Pingviin
 
  
  
 Vanus: 37
 Liitunud: 08.07.2005
 Postitused: 667
 Asukoht: Kopenhaagen/Tartu
 Distributsioon: Arch
 
  
   |  
 
 
| 
| 
 |  
| Ilma mõneta neist semikoolonitest ei tee ka esimene rida (mis koos nendega töötab) midagi, sellepärast nad sinna said/jäid... 
 Miks too esimene rida sudo'ga ei tööta, jääb mulle arusaamatuks.
 
 Eesmärki selgitasin vist natuke poolikult... Kui BT töötab, on /sys/devices/platform/asus-laptop/bluetooth sisuks 1. Kui ei tööta, siis 0. Üritan saavutada seda, et kui vajutan nt Win+B, siis:
 a) kui BT on parajasti sisse lülitatud, siis lülitatakse ta välja:
 b) kui BT on välja lülitatud, siis lülitatakse ta sisse;
 ehk siis kui $ cat /sys/devices/platform/asus-laptop/bluetooth tagastab 1, siis $ sudo echo 0 > /sys/devices/platform/asus-laptop/bluetooth ja vastupidi.
 /home/mihkel/bluetooth on testimiseks, kuna veateateid vms igaks juhuks ei tahaks "päris" kohta kirjutada.
 
 Bash'i skript sudo'ga käima tõmmata on lihtsam jah, kuigi tore oleks, kui niisama ka töötaks...
 
 E: sudo tahab parooli ka, jah. /etc/sudoers vast aitaks...
  (samas wlassistant nõudis vanas arvutis parooli ka pärast selle sudoers'isse lisamist - uues pole proovinud.) |  
|  |  |  |  
| _________________
 "Sleep, she is for the weak."
 
 |  | 
|  |    | 
| johnsmith Vana Pingviin
 
  
  
 Vanus: 51
 Liitunud: 24.07.2006
 Postitused: 714
 Asukoht: Universum
 Distributsioon: Ubuntu/Gentoo/FreeBSD
 
  
   |  
 
 
| 
| 
 |  
| Esimesena ma siiski prooviks seal sudoersi failis anda sellele skriptile  NOPASSWD parameeter. Pole ise juba tükk aega sudoersiga jamanud praegu Gentoos pole seda isegi installitud. 
 Kui see ei õnnestu siis võimalik kirjutada C keeles väike proge millele anda setuid ja mis käivitab siis selle skripti, see on jälle rohkem sääsest elevandi tegemine.
 
 Ma ei tea kas on ka võimalus sööta sudoersile salasõna teisest failist näiteks......., tundub jälle mõtetu häkk olevat.
 |  
|  |  |  |  
| _________________
 "Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford
 
 |  | 
|  |    | 
| v6lur Vana Pingviin
 
  
  
 Vanus: 37
 Liitunud: 08.07.2005
 Postitused: 667
 Asukoht: Kopenhaagen/Tartu
 Distributsioon: Arch
 
  
   |  
 
 
| 
| 
 |  
| Tegelikult see parooli küsimine mind ei segagi - sudo asemele sai muidugi kdesudo pandud, enne unustasin mainida. 
 Hetkel tegin siis eraldi faili, mis vajadusel (kde)sudo'ga käivitatakse. Kui keegi oskab öelda, miks esimeses postituses kirjeldatud variandid ei tööta, võib siiski teada anda.
 |  
|  |  |  |  
| _________________
 "Sleep, she is for the weak."
 
 |  | 
|  |    | 
| johnsmith Vana Pingviin
 
  
  
 Vanus: 51
 Liitunud: 24.07.2006
 Postitused: 714
 Asukoht: Universum
 Distributsioon: Ubuntu/Gentoo/FreeBSD
 
  
   |  
 
 
| 
| 
 |  
| Esimeses postis kirjeldatud kood ei tee esiteks seda mida olid soovinud. 
 Kui if test on tõsi siis echo prindib standard outputi ehk ekraanile 0 kui ebatõsi siis 1.
 
 fi ütleb bashile, et if testi järel tulevad laused on läbi:
 Programmeerimiskeeltes tavaliselt tähendab seda
 if (mingi test)
 {
 Hästi palju igast lauseid;
 
 }
 // If lõppeb ja programmi sooritus jätkub siit
 
 Bash ei saanud ilmselt aru millal lõppeb if koodi ala kuna
 fi > /home/mihkel/bluetooth on nagu eraldi lause samas kui fi lõpetab  if testi laused siis jääb bashil sooritada selline lause
 > /home/mihkel/bluetooth mis aga ei tee muud kui redigeerib midagi sinna faili aga puudub vasakul olev operand. Kui bash leiab koodist > siis ta teab, et see on binaarne operand ehk mõlemal pool operandi peab olema mingi muutuja kui seda pole siis bash lõpetab erroriga.
 
 Ühesõnaga nii loogiline kui süntaksi error
 
 
   |  
|  |  |  |  
| _________________
 "Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford
 
 |  | 
|  |    | 
| v6lur Vana Pingviin
 
  
  
 Vanus: 37
 Liitunud: 08.07.2005
 Postitused: 667
 Asukoht: Kopenhaagen/Tartu
 Distributsioon: Arch
 
  
   |  
 
 
| 
| 
 |  
| ...teeb kusjuures täpselt seda, mida ma tahan (tavakasutajal pole aga õigust /sys/devices/platform/asus-laptop/bluetooth kirjutada) - ent kui sinna nüüd sudo ette panna (ja jutumärgid ümber), siis annab veateate: "sudo: if [ 0 -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth: command not found". Kui ette panna kdesudo, tuleb veateateks: "sudo: if: command not found". Ka "fi" ärajätmine ei näi midagi muutvat :/ 	  | Kood: |  	  | $ if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth			 | 
 |  
|  |  |  |  
| _________________
 "Sleep, she is for the weak."
 
 |  | 
|  |    | 
| johnsmith Vana Pingviin
 
  
  
 Vanus: 51
 Liitunud: 24.07.2006
 Postitused: 714
 Asukoht: Universum
 Distributsioon: Ubuntu/Gentoo/FreeBSD
 
  
   |  
 
 
| 
| 
 |  
| Teeb jah proovisin järgi   
 Aga tegelikult sul on loogika vale seal ja ilmselt ka sellepärast se sudoga ei õnnestu. Bash on lõdva süntaksiga skriptikeel mis annab niimõnegi loogikavea andeks ja ilmselt sellepärast ta muudabki seda faili. Kui ta ütleb, et "command not found" siis ta järelikult ei saa aru süntaksist. Kuna nüüd annad sa selle testi sudo programmile parameetriks ja tema enam sellest aru ei saa.
 
 Kui sa testid mingit asja ja see on tõsi siis sa sooritad mingid käsud
 if(test)
 //if testi laused algavad
 {
 //kui test on vale siis seda lauset ei sooritata
 tee midagi kui if test on tõene;
 //if testi laused lõpevad
 }
 // ei saa ju seda lauset panna siia
 tee midagi kui if test on tõene;
 //kuna see lause sooritatakse igal juhul ükskõik mis if test oli
 
 Ma ei pretendeeri küll mingi bashi guru tiitlile aga niimoodi saan mina asjast aru kui keegi oskajam tahab seda lahti seletada siis ta võiks seda teha.
 
 Kui sa fi ära jätad siis sudo ei tea millal testi laused lõpevad
 Ainuke muutus mis võib selle sinu versiooni tööle panna oleks minu meelest selline
 
  	  | Kood: |  	  | 
$ if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1;  > /home/mihkel/bluetooth fi
 
 | 
 Kuna ma eeldan, et bash lihtsalt ignoreerib semikooloneid mis tähendavad lause lõppu programmeerimis keeltes. Kui bash loeks ka semikooloneid siis antud laused oleksid absurdsed.  Antud juhul lihtsalt ta parsib välja then ja elsi ning sooritab käsud vastavalt then või else järel. Aga ka siis sooritatakse echo 1 > faili ja isegi kui if test on tõsi faili ei kirjutata 0 vaid sinna jääb endiselt 1. See ei ole enam süntaksi error vaid loogiline error.
 |  
|  |  |  |  
| _________________
 "Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford
 
 |  | 
|  |    | 
| wk Vana Pingviin
 
  
 
 
 Liitunud: 24.10.2007
 Postitused: 1133
 Asukoht: Tallinn, vahel Vastseliina vald
 Distributsioon: Debian, Kubuntu
 
  
   |  
 
 
| 
| 
 |  
|  	  | Tsitaat: |  	  | Kui see ei õnnestu siis võimalik kirjutada C keeles väike proge millele anda setuid ja mis käivitab siis selle skripti, see on jälle rohkem sääsest elevandi tegemine. 			 | 
 Miks setuidiks on vaja C-keelt?
 |  
|  |  |  |  
| _________________
 Kõike hääd,
 WK
 
 |  | 
|  |   | 
| johnsmith Vana Pingviin
 
  
  
 Vanus: 51
 Liitunud: 24.07.2006
 Postitused: 714
 Asukoht: Universum
 Distributsioon: Ubuntu/Gentoo/FreeBSD
 
  
   |  
 
 
| 
| 
 |  
|  	  | wk kirjutas: |  	  |  	  | Tsitaat: |  	  | Kui see ei õnnestu siis võimalik kirjutada C keeles väike proge millele anda setuid ja mis käivitab siis selle skripti, see on jälle rohkem sääsest elevandi tegemine. 			 | 
 
Miks setuidiks on vaja C-keelt?			 | 
 
 Küsid lihtsalt uudishimust või on sul mingi alternatiivne lahendus ?
 
 Ei tea, C keele librades on seteuid() funktsioon millega saab võtta ja loobuda teist uid -d. Sama asi on ju näiteks passwd utiliidis, kasutaja käivitab programmi ning see kirjutab  /etc/shadow faili uue  rea kuhu muidu võib ainult root kirjutada.
 
 Kui lambist anda mingile skriptile näiteks chmod chmod 6755 ma ei kujuta ette kas see siis töötaks. Kuidas see skript siis teab millal muutuda juureks ?
 |  
|  |  |  |  
| _________________
 "Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford
 
 |  | 
|  |    | 
| wk Vana Pingviin
 
  
 
 
 Liitunud: 24.10.2007
 Postitused: 1133
 Asukoht: Tallinn, vahel Vastseliina vald
 Distributsioon: Debian, Kubuntu
 
  
   |  
 
 
| 
| 
 |  
| Ei ole lahendust, mul oli lihtsalt meelest läinud, et interpreteeritavale skriptile ei piisa reeglina suid/guid-ist failisüsteemi tasemel. Kuna ma ise kirjutasin teiste õigustes käivad skriptid perlis, siis mõtlesin, et saab ka bashis. Aga perlis on sellejaoks eraldi interpretaator -- suidperl. 
 Aga setuidi ja setgidi idee on sellest, et nad võimaldavad jooksutada programme käivitajast erinevate õigustega ning see on lahendatud failisüsteemi tasemel antud õigustest lähtuvalt. Ilmselt on need C-funktsioonid vajalikud, kui on vaja peenemalt reguleerida õiguseid eri programmi funktsioonides.  Nii et ses mõttes peaks iga binaar toimima.
 |  
|  |  |  |  
| _________________
 Kõike hääd,
 WK
 
 |  | 
|  |   | 
| leio Pingviini aktivist
 
  
  
 Vanus: 41
 Liitunud: 31.07.2007
 Postitused: 126
 Asukoht: Tallinn
 Distributsioon: Gentoo Linux
 
  
   |  
 
 
| 
| 
 |  
| Paneks näiteks sulud ümber ettepoole, ehk aitab. Siis saab nii 0 kui 1 echo puhul asi suunatud kenasti kuhu vaja mu meelest. Ignoreerides kõige muid võimalikke vigu millese ma hetkel ei süvene (kui neid üldse on), näiteks nii: 
 
  	  | Kood: |  	  | $ (if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi) > /home/mihkel/bluetooth			 | 
 Kuigi nagu tunduks, et saaks lihtsalt loogilise eituse tagasi echo'da ja mingid "-eq" värki pole ehk vaja?
 
 setuid koha pealt - linuxil on õiguste süsteem. Tavaliste õigustegagi (mitte ACL advanced võimalused) võimalik lihtsalt anda faili omaniku õigustega käivitusõigused. Selle jaoks on setuid bitt faili õigustes. Kui antud skripti omanik on root ja failid on setuid õigus peal (chmod u+s <fail>) siis töötab ta root õigustega käimapannes. See võib küll üks hea turvaauk olla kui valesti kasutada, nii et tuleb ettevaatlik olla.
 |  
|  |  |  |  
| _________________
 Gentoo Linux arendaja -- GNOME ja GStreamer - http://www.gentoo.org/
 
 |  | 
|  |    | 
|  |