Pieniä kysymyksiä ohjelmoinnista

Viestiketju alueella 'Ohjelmointi' , aloittaja kivibot, 27.12.2011.

  1. telcoM

    Rekisteröitynyt:
    27.08.2015
    Viestejä:
    295
    Mitäs Apachen error.log kertoo? Jos cgi-bin-skriptin suoritus tuottaa virheilmoituksen, sen ilmoituksen teksti pitäisi löytyä tuolta logista.

    Komento "fswebcam /home/pi/image.jpg" tallentaisi kuvan polkuun /home/pi/image.jpg, mutta siinä on kaksikin mahdollista ongelmaa:
    1.) skripti ajetaan käyttäjänä jona Apache pyörii (tai tiettyjä lisäturvatekniikoita käytettäessä erityisesti cgi-bin-skriptien ajamiseen varatulla tunnuksella), joka ei yleensä ole sama kuin käyttäjä "pi". Apache-käyttäjällä tuskin on kirjoitusoikeuksia käyttäjän "pi" kotihakemistoon, eikä kuulukaan olla. Apache-käyttäjä voi olla jakelusta riippuen "apache", "httpd", "www-data" tai jotain muuta.

    Katso "ps -ef |grep apache" niin näet minä käyttäjänä apachen prosessit pyörivät. Master-prosessi voi olla roottina, mutta varsinaiset palvelinprosessit ajetaan yleensä jollain muulla tunnuksella. Sen jälkeen katso "id tähän_apache_käyttäjätunnus"-komennolla mihin ryhmään tai ryhmiin tuo käyttäjä kuuluu. Ryhmä saattaa hyvinkin olla samanniminen kuin käyttäjä.

    2.) Ellei esim. aliaksilla ole erityisesti muuta määritelty, Apache tarjoilee tavaraa ainoastaan DocumentRootin alta, ja tyypillinen oletusarvoinen DocumentRoot on /var/www tai /var/www/html. Ellei asiaa ole jotenkin määritelty, Apache ei voisi lukea kuvaa tuolta.

    Lisäksi tuo skriptisi väittää tuottavansa text/html-tyyppisen dokumentin, mutta sen sisällöksi tulee vain fswebcam-komennon tuottamat ilmoitukset ja HTML-dokumentin lopputagit. Ellei fswebcam sattumoisin tulosta käsin ajettuna ruudulle sivutuotteena HTML-dokumenttia jossa on oikea IMG SRC= tagi ja josta puuttuu vain lopputagit, tuolla ei oikein ole edellytyksiä tehdä sitä mitä ajattelet.

    Itse koettaisin ensiksi näin:
    - skripti asianmukaiseen cgi-bin hakemistoon, esim. /usr/lib/cgi-bin joissakin jakeluissa. Nimeksi vaikka "kameratesti".
    - skriptille luku- ja ajo-oikeudet kaikille: chmod a+rx /usr/lib/cgi-bin/kameratesti
    - jonnekin DocumentRootin alle hakemisto johon kirjoitusoikeudet Apachelle, esim /var/www/kamerakuvat:
    Koodi:
    # mkdir /var/www/kamerakuvat
    # chgrp www-data /var/www/kamerakuvat
    # chmod g+rwx /var/www/kamerakuvat
    
    - skriptin sisällöksi jotain tämmöistä:
    Koodi:
    #!/bin/sh
    # ensin HTTP-headerit
    echo "Content-Type: text/html"
    echo
    
    # ajetaan itse komento
    fswebcam /var/www/kamerakuvat/image.jpg
    
    if [ $? -eq 0 ]; then
        # jos onnistui, sitten tulostetaan dokumentti jossa on viittaus kuvaan
        cat <<EOF1
    <!DOCTYPE html>
    <html>
    <head>
    <title>Pieni iloinen kameratesti</Title>
    </head>
    <body>
    <img src="/kamerakuvat/image.jpg">Tässä pitäisi olla kuva.</img>
    </body>
    </html>
    EOF1
    else
        # Kuvan otto epäonnistui
        cat <<EOF2
    <!DOCTYPE html>
    <html>
    <head>
    <title>Surkea kameratesti</title>
    </head>
    <body>
    <h2>Jotain meni pieleen!</h2>
    Pyydä palvelimen ylläpitäjää vilkaisemaan lokeja.
    </body>
    <html>
    EOF2
    fi
    
    Tuo oli sitten ihan pikaisesti huitaistuna sen kummemmin testaamatta, joten virheitä saattaa olla, mutta periaatteen pitäisi hahmottua.
     
  2. RaPe77

    Rekisteröitynyt:
    08.01.2008
    Viestejä:
    1 222
    Kiitos ajastasi :)

    Ei ollut aikaa ruveta enempää säätämään nyt, mutta tein ohjeiden mukaan ja ajoin sen.
    Sivulla lukee vaan tuo "Tässä pitäisi olla kuva.", mutta kuvaa ei näy, kamera ei ota kuvaa, joten sitä ei myöskään tonne /var/www/kamerakuvat ilmesty :/
     
  3. telcoM

    Rekisteröitynyt:
    27.08.2015
    Viestejä:
    295
    Eli cgi-bin -skriptin ajaminen sinänsä onnistuu, ja ongelma on enää tuossa fswebcam-komennon toiminnassa. Mutta komento ei sitten jostain syystä edes tuota virhekoodia josta voisi tunnistaa onnistuiko vai eikö. Olisikohan niin että kuvan ottaminen fswebcam-komennolla vaatii jotain oikeuksia joita Apachen työrukkas-käyttäjälla ei ole?

    Jos komennat:
    sudo -u www-data fswebcam /var/www/kamerakuvat/image.jpg
    tai (roottina)
    su - www-data fswebcam /var/www/kamerakuvat/image.jpg

    onnistuuko kuvan otto sitten? Jos ei onnistu, tulostaako komento mitään virheilmoituksia?

    Vilkaisepa myös sinne Apachen error.logiin: se löytyy yleensä /var/log/http tai /var/log/apache hakemistosta.
     
    Viimeksi muokattu: 05.05.2017
  4. RaPe77

    Rekisteröitynyt:
    08.01.2008
    Viestejä:
    1 222
    --- Opening /dev/video0...
    Trying source module v4l2...
    Error opening device: /dev/video0
    open: Permission denied
    Trying source module v4l1...
    Error opening device: /dev/video0
    open: Permission denied
    Unable to find a source module that can read /dev/video0.


    Sitten kun ajan vaan fswebcam image2.jpg niin:
    --- Opening /dev/video0...
    Trying source module v4l2...
    /dev/video0 opened.
    No input was specified, using the first.
    Adjusting resolution from 384x288 to 352x288.
    --- Capturing frame...
    Captured frame in 0.00 seconds.
    --- Processing captured image...
    Writing JPEG image to 'image2.jpg'.


    Ja tosiaan myös tuolla logissa on paljon permission denied.
    Ei noista oikeuksien antamisestakaan juurikaan kokemuksia ole, joten mitä siihen kokeilisin? :)
     
  5. telcoM

    Rekisteröitynyt:
    27.08.2015
    Viestejä:
    295
    Just. Eli tuolla www-data käyttäjällä ei oletusarvona ole oikeutta käyttää kameraa, mikä perusserverissä on ihan oikein: jos jossain cgi-bin-skriptissä tai vastaavassa on tietoturvabugi, www-data on se tunnus jonka hakkeri todennäköisesti ensimmäiseksi saa korkattua, joten sen oikeudet on oletuksena rajattu minimiin. Mutta tässä tapauksessa kameran käyttö webbipalvelun kautta on se mitä koneen nimenomaisesti halutaan tekevän, joten tässä tapauksessa se on syytä sallia.

    Ensiksi vilkaise millaiset luvitukset tuolla /dev/video0 laitetiedostolla on.
    Esimerkiksi:
    Koodi:
    $ ls -l /dev/video0
    crw-rw----+ 1 root video 81, 0 May  5 08:18 /dev/video0
    
    Tässä esimerkissä käyttöoikeudet on näköjään rootilla, video-ryhmällä ja plusmerkki oikeusrimpsun lopussa tarkoittaa että laitetiedostolla on vielä joku ACL. Yleensä se tarkoittaa sitä että näiden lisäksi vielä koneeseen "konsolilta" kirjautuneella käyttäjällä on lisäoikeus tuon laitteen käyttöön.

    Tässä tapauksessa tuo video-ryhmä olisi homman avain. Tarvitsee vain saada www-data käyttäjätunnus liitetyksi video-ryhmään, ja sen jälkeen se pääsee käyttämään kameraa. Ja sehän käy helposti:
    Koodi:
    $ sudo usermod -a -G video www-data
    
    Tämän jälkeen pitää käynnistää Apache uudelleen, koska muuten käynnissä olevilla Apache-prosesseilla on vielä käytössä vanha tieto tuon www-data käyttäjän ryhmäjäsenyyksistä. Tämän voi tehdä monellakin tavalla, riippuen siitä miten asiat on järjestetty käyttämässäsi Linux-jakelussa:
    Koodi:
    $ sudo apachectl restart
    tai
    $ sudo service apache restart
    tai
    $ sudo systemctl restart apache
    
    Jos et muuten saa Apachea käynnistettyä uudelleen, boottikin tietysti ajaa saman asian.

    Jokohan tämän jälkeen toimisi?
     
  6. RaPe77

    Rekisteröitynyt:
    08.01.2008
    Viestejä:
    1 222
    Suuret kiitokset!


    Nyt toimii, tästä eteenpäin pitäisi(ehkä) omankin järjen riittää muutoksiin ja säätöihin :)
     
  7. telcoM

    Rekisteröitynyt:
    27.08.2015
    Viestejä:
    295
    Hyvä homma. :kippis:

    Tuossa tulikin ihan hyvä valikoima erilaisia webbiserverin perusasioita yhdellä kertaa.
     
    Viimeksi muokattu: 06.05.2017
  8. RaPe77

    Rekisteröitynyt:
    08.01.2008
    Viestejä:
    1 222

    Kyllä, pitää vielä ajatuksella käydä niitä läpi että oppeisikin jotain eikä vaan copy/pastella vedellä. Kiitos vielä kerran :)

    Seuraavaks täytyy sitten virittää raspberrryyn ledi, mikä syttyy ennen kun kuva otetaan, ja sammuu sen jälkeen. (kamera tulee pimeään huoneeseen)
     
  9. IbanBic

    Rekisteröitynyt:
    27.11.2016
    Viestejä:
    33
    En ole mikään ohjelmoija, vaikka olenkin harrastanut HTML:n koodailua alkeellisella tasolla, joten tulee vähän tyhmä tai kummallinen kysymys.

    Liittyen tähän: http://www.tivi.fi/Kaikki_uutiset/kelan-koodi-naurattaa-this-huume-huume-6646455

    1. Kun joku julkaisee koodin kuten Kela, eikös tuota voi väärinkäyttää? Esimerkiksi joku yritys tai muu taho voi ottaa tuon koodin ja kopioida heidän järjestelmän lähes ilmaiseksi, halvemmalla pääsevät kuin Kela, joka on käyttänyt aikaa ja rahaa tuon järjestelmän rakentamiseen? Mites siis nämä ottavat tällaisen riskin kun julkaisevat järjestelmien koodeja?

    2. Sitten toinen väärinkäyttö mahdollisuus. Jos joku viisas löytää jonkun aukon, niin hänhän voi murtautua/hyökätä tällöin siihen järjestelmään? Miten tämä ehkäistään tai miten tämä riski hallitaan? Tietysti onhan tuossa hyviäkin puolia, joku näkee bugin ja ilmoittaa jne. mutta eihän kaikilta voi odottaa näin hyvää tahtoa (viittaan maailman viimeaikaisiin tapahtumiin).
     
  10. Paapaa

    Rekisteröitynyt:
    14.04.2005
    Viestejä:
    10 593
    1. Millä tavalla kyse olisi väärinkäytöstä jos noudattaa lähdekoodin lisenssiä? Millä tavalla se on siis huono asia, että julkisin varoin tuotettu koodi laitetaan julkiseksi kaikkien hyödynnettäväksi? Avaatko vähän tuota?

    Kelalle suoraa hyötyä tulee, jos joku löytää bugin, tai kehittää softaa paremmaksi. Tähän koko open source perustuu: jaetaan tavaraa, annetaan muille ja saadaan samalla itsekin lisää ja kaikki hyötyvät. (En ole ideologi tämän suhteen, suljetulle koodille on paikkansa.)

    2. Riippuu vähän, mitä komponentteja siellä on julkistettu. Ehkä siellä ei ole tietoturvan kannalta kriittisiä komponentteja. Toisaalta, tietoturva pitäisi muutoinkin toteuttaa niin, että lähdekoodin julkaisu ei sitä oikeastaan vaaranna. Mutta kokonaisuutena ajatellaan, että jos joku aukko tuleekin julkiseksi, on todennäköisempää, että se saadaan näin tukituksi kuin että sitä hyödynnetään. Joskus käy toki toisinkin.
     
  11. RaPe77

    Rekisteröitynyt:
    08.01.2008
    Viestejä:
    1 222
    Olen tätä kysynyt ennenkin, mutta olen hukannut vastauksen johonkin.
    kun ajan:
    cat /sys/bus/w1/devices/28-00000XXXXXXX/w1_slave | sed -n 's/^.*\(t=[^ ]*\).*/\1/p' | sed 's/t=//' | awk '{x=$1}END{print(x/1000)}'
    saan lämpötilan tuolta anturista muodossa 18.062

    Miten saisin kerrottua, että haluaisin sen muodossa 18.1 ?
     
  12. linuxisnotunix

    Rekisteröitynyt:
    21.05.2014
    Viestejä:
    412
    awk '{ printf("%.1f\n", $1/1000) }'
     
  13. RaPe77

    Rekisteröitynyt:
    08.01.2008
    Viestejä:
    1 222
    Kiitos! \,,/
     
  14. kasvi

    Rekisteröitynyt:
    16.11.2004
    Viestejä:
    167
    Auttakee tyhmää.. oon ainan ihan pihalla noiden heittomerkkien yms kanssa. Mites mä säilytän tän koodinpätkän toiminnallisuuden:

    <?php
    include_once 'includes/db_connect.php';

    $prefix = "2";
    $teksti="_testi";
    $testi = $prefix . $teksti;

    $mysqli->query("create table $testi (
    `user_id` int(11) NOT NULL)
    ");


    ?>

    Siis lähinnä mä haluaisin selvitä tolla pelkällä prefix-muuttujalla, muttako en onnistu ämppään sitä toimivasti tonne create table lauseeseen...?
     
    Viimeksi muokattu: 15.05.2017
  15. Asdqwerty

    Rekisteröitynyt:
    04.03.2015
    Viestejä:
    157
    Anteeksi, jos väärä paikka.

    Olisko kukaan kiinnostunut avustamaan minua koulun kurssiin liittyvässä matematiikan ohjelmoinnin tehtävässä?
    Opettaja keksi heittää matematiikankurssin lopuksi vielä ohjelmointitehtävän, jota en itse osaa toteuttaa koska omat ohjelmointititaitoni ovat hyvin vähäiset (käynyt vain perusteet kurssin). Kyseessä olisi diskreettiin matematiikkaan liittyen viestisanan koodaus ja dekoodaustehtävät (hamming koodi ja lineaarikoodi), jotka osaan paperilla toteuttaa, mutta samaa en ohjelmoida.

    Lisätietoja saa yksityisviestillä.
     

Jaa tämä sivu

Alibi
Anna
Deko
Dome
Erä
Hymy
Kaksplus
Kippari
Kotilääkäri
Kotiliesi
Koululainen
Ruoka.fi
Parnasso
Seura
Suomen Kuvalehti
TM Rakennusmaailma
Tekniikan Maailma
Vauhdin Maailma
Golfpiste
Vene
Nettiauto
Ampparit
Plaza
Muropaketti