Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - hazardrok

Stran: 1 2 [3] 4
31
Vývoj / Re:Práce s vlákny v C
« kdy: 19. 01. 2021, 18:44:14 »
no super...snad se konecne pohnu kupredu (rad bych pouzil spravnym smerem, ale do toho je jeste daleko :))
Pridal jsem do kodu mutex a zkusil jak se to bude chovat. Po spusteni pres:
Kód: [Vybrat]
valgrind --tool=helgrind ./mainjsem dostal po skonceni programu tuto hlasku
Kód: [Vybrat]
==3853== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 50221857 from 38)
Vyslednu kod je zde:
Kód: [Vybrat]
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <pthread.h>

static int init_function(void);
static void *handle_function(void *arg);

static uint8_t thread_var = 0x00;
static pthread_t thread;
static pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;

int main(int argc, char *argv[]){
  int ret;
  int c_run = 100;
   
  while(1){
    ret = init_function();
    if(ret == 1){
      //printf("vytvoreno nove vlakno\n");
      if(c_run != 0){ c_run--;}
      else{ break;}
      }
    }
 
  return 0;
  }

static int init_function(void){
  uint8_t var;
 
  pthread_mutex_lock(&mymutex); 
  var = thread_var;   
  if(var == 0x00){ thread_var = 0xFF;}
  pthread_mutex_unlock(&mymutex);

  if(var == 0xFF){     
    return -2;
    }   
   
  if(pthread_create(&thread, NULL, handle_function, NULL)){
    //vlakno nebylo vytvoreno, musim shodit thread_var 
    pthread_mutex_lock(&mymutex);       
    thread_var = 0x00;
    pthread_mutex_unlock(&mymutex); 
     
    return -1;
    }
 
  pthread_detach(thread);
  return 1;
  }

static void *handle_function(void *arg){   
  sleep(1);
 
  pthread_mutex_lock(&mymutex);
  thread_var = 0x00;
  pthread_mutex_unlock(&mymutex);
 
  return NULL;
  }

Ze zacatku mi to nefungovalo. Po chvili mi doslo, ze problem bude asi v puvodnim volani funkce printf na konci vlakna. Kdyz jsem ji odstranil uz to zadne chyby nehlasilo. Uz mi jsou ty dotazy skoro trapny, ale je toto jiz korektni?

32
Vývoj / Re:Práce s vlákny v C
« kdy: 19. 01. 2021, 15:37:34 »
Jsem presvedecn, ze dotaz znel v podstate jasne...Ptal jsem se na to jestli ten muj prilozenej kod bude fungovat korektne. A cekal jsem ze dostanu odpoved. Take jsem presvedecn, ze jsem jednoznacnou odpoved nedostal, ale urcite ted vim neco vice o konfiguraci SQLite. Rada, ze existuje jiny zpusob napr. libuv neni odpoved na moji otazku. Tim se samozrejme nechci nikoho kdo prispival dotknout, na druhou stranu by me zajimalo kam uzivatel anonacct miri?

33
Vývoj / Re:Práce s vlákny v C
« kdy: 19. 01. 2021, 09:35:11 »
Diky za pripominky. Pokusim se to shnout...
1. muj jednoduchy priklad nebyl vylozene vyvracen ani pohanen a lze ho pouzit
2. pokud budou pouzity nejake knihovny, musi byt bud "thread safety" nebo je potreba pouzit nejakou pokrocilejsi techniku spravy vlaken aby se nestalo to, ze vlakna budou prustupovat k jednomu zdroji, ktery si budou navzajem menit napr. vyrovnavaci bufer nebo nejaky statusovy priznak. Zde zminim napr. mutex.
3. pri hledani problemu muze pomoci najeky ladici nastroj napr. valgrind apod.

Overil jsem si, ze knihovna pro SQlite je "thread safety", protoze kod:
Kód: [Vybrat]
ret = sqlite3_config(SQLITE_CONFIG_SERIALIZED);

vraci:
Kód: [Vybrat]
SQLITE_OK

coz podle dokumentace znamena, ze je mozne pouzit tento mod pracujici s vice vlakny. Tato knihovna se tedy zda byt OK.

U json-c si nejsem vubec jistej, protoze mi asi chybi zkusenosti s pochopenim principu. Tam je ale situace trochu jina, protoze json se pouziva pouze jednou pri uplne prvnim pripojeni klienta o krerem system nema zadne informace. Jakmile si informace vytvori, uz se pro tohoto clienta nikdy nepouzije. Volani funkci teto knihovny tedy neni potreba do jineho vlakna davat.

Zaverem mi tedy vyplyva, ze je pokud se mi to povede odladit a bude to fungovat, tak bych na vetsi problemy (nez uz ted mam) nemel narazit.

34
Vývoj / Re:prace s vlakny v C
« kdy: 18. 01. 2021, 19:49:20 »
O tom zamykani jsem uz neco malo cetl, ale podle me v tomto pripade neni nutne. System je postaven tak, ze kazdy client je jednoznacne pojmenovany a ma ke svemu jmenu prirazenou jednoznacnou databazi. Nemuze do ni tedy vstoput nikdo jiny, protoze system neumoznuje dva stejne pojmenovane clienty zaroven. Zatim to tedy asi pouziju tak, jak jsem si usmyslel dokud se mi to nekde nezhrouti. Mozna misto
Kód: [Vybrat]
static pthread_t thread_var pouziju neco jako
Kód: [Vybrat]
atomic_long thread_varPokud spravne chapu princip atomickych promenych, tak by ten program mohl maximalne nefungovat.

35
Vývoj / Práce s vlákny v C
« kdy: 18. 01. 2021, 18:33:07 »
Ahoj, chtel bych se trochu seznamit s programovanim vicevlaknovych programu v C na linuxu. Mam totiz napsany vlastni jednovlaknovy server a domnivam se, ze pokud mi client zacne delat nejakou slozitou operaci napr. pracovat s databazi (pouzivam SQLite v kombinaci s json-c), tak mi to blokuje dalsi klienty. Abych do stavajiciho jiz odladeneho programu co nejmene zasahoval, vymyslel jsem si tento postup...pokud bude chtit client pristupovat do databaze, tak se tento pozadavek otevre v novem vlakne a jakakoliv dalsi operace totoho clienta bude blokovana dokud vlakno neskonci.

Zjednodusene jsem se to pokusil napsat do kodu, tak jak bych to chtel realizovat a ten zde predkladam. Muj dotaz tedy zni, jestli takto napsany kod bude korektne fungovat a pokud ne, tak jak by to melo vypadat? Ani me nezajima jestli je to takto vhodne resit apod., jde mi jen o princip. Dik za radu.

Kód: [Vybrat]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

static int init_function(void *arg);
static void *handle_function(void *arg);

static pthread_t thread_var = -1;

int main(int argc, char *argv[]){
  int ret; 
   
  //printf("%ld, %ld\n", thread_var, (long)&thread_var); 
   
  while(1){
    ret = init_function((void *)&thread_var);
    if(ret == 1){
      printf("vytvoreno nove vlakno\n");
      }
    //else if(ret == -1){
    //  printf("vlakno se nepovedlo vytvorit\n");
    //  }
    //else if(ret == -2){
    //  printf("vlakno stale bezi\n");
    //  }
   
    //printf("%ld, %ld\n", thread_var, (long)&thread_var); 
    }
 
  return 0;
  }

static int init_function(void *arg){
  pthread_t *p_thread = (pthread_t*)arg;

  if(*p_thread != -1){
    return -2; 
    } 
   
  if(pthread_create(&thread_var, NULL, handle_function, arg)){
    return -1;
    }
 
  //printf("%ld, %ld\n", thread_var, (long)&thread_var);
 
  pthread_detach(thread_var); 
  return 1;
  }

static void *handle_function(void *arg){ 
  pthread_t *p_thread = (pthread_t*)arg; 
 
  //printf("%ld, %ld\n", *p_thread, (long)p_thread);
  sleep(5);
  printf("konec vlakna\n");
 
  *p_thread = -1;
 
  return NULL; 
  }

36
Vývoj / Re:Vývoj ve Windows: sériový port přes SSH
« kdy: 26. 11. 2020, 12:11:34 »
To založení virtuálního portu je proto, že ten pravěkej program může otevřít pouze COM1 - COM15. Je to fakt pravěk psanej v ještě starším Visual Basicu a v podstatě se s tím nedá už nic dělat.
Vývoj jde ale dál a tak jsem nechal napsat aplikaci v javě (kvůli portování na mobilní zařízení), která tento program supluje a ta používá pro připojení právě SSH. Jenže k ladění a vývoji je pořád ten pravěk lepší, protože ten je domyšlenej úplně do datailu, zatímco ta náhrada umí jen část. Ta appka s SSH ale umožňuje k jakýmukoliv zařízení v tom systému přistupovat odkukdoliv, protože přes username a heslo se vždy spojí se svým přiřazeným zařízením. Zkrátka každá ta věc se hodí na něco jinýho. Já jednoduše potřebuji využít možnosti toho dokonalého ladícího nástroje na vzdáleném zařízení s SSH. Hlavně bych chtěl současně pracovat s více zařízeníma, to je vlastně největší motivace tohoto vlákna.

Snad to jako vysvětlení stačí...

37
Vývoj / Re:Vývoj ve Windows: sériový port přes SSH
« kdy: 26. 11. 2020, 07:35:44 »
Ahoj a díky za názory. Asi se do toho pouštět sám nebudu a pokusím se sehnat programátora. Vysvětlení proč něco takového potřebuju je to, že používám pravěký program na komunikaci s průmyslovejma řídícíma jednotkama, který používaj z dnešního pohledu dost nestandartní komunikační protokol (kombinace IrLan a modbus). Aby se dalo k těmto jednotkám přistupovat odkudkoliv, pokud jsou připojeny k síti, mám napsaný SSH server, který umožňuje přetunelovat ten pravěkej program. Tohle funguje naprosto dokonale pro jednoho uživatele. Jenže ejhle, tenhle můj virtuální port funguje a uživatelů přibývá, nyní už to přesahuje rámec mých programátorských zkušeností.

38
Vývoj / Vývoj ve Windows: sériový port přes SSH
« kdy: 24. 11. 2020, 22:11:59 »
Ahoj, prosim o pomoc s vyvojem programu ve Windows (v linuxu to umim) aneb vim co chci, ale nevim jak na to. Program by mel umet nebo neumet nasledujici...

1. vytvorit virtualni seriovy port
2. pripojit se pres SSH jako client k definovanemu serveru pres uzivatelske jmeno a heslo
3. otevrit SSH kanal a preposilat pres nej data z virtualniho serioveho portu
4. nemusi mit GUI

Mel by nekdo nejaky napad jak na to?
Me osobne napadlo pouzit com0com jako emulaci serioveho portu a toho SSH klienta napsat v pythonu. Duvodem je to, ze s com0com uz jsem se v minulosti setkal a v pythonu pisu vsechno co chci aby bezelo na Windows. Prijde mi to ale jako dost kostrbaty reseni, protoze me by se nejvic libilo, kdybych pustil program. Vyskocilo by na me okno kam bych zadal uzivatelske jmeno, heslo, portu a dal OK. Dokud bych program nezavrel, tak by to fungovalo a mohl bych ho pustit i opakovane. Snad nechi tak moc ne? :)
Dik.

39
Server / Re:Uzavření uživatele v domovském adresáři
« kdy: 09. 06. 2020, 11:31:49 »
Ve výpisu práv se ten adresář jmenuje test a podle konfigurace posíláte uživatele do /home/brodsky.

To je tím, že jsem nechtěl vlákno zatěžovat jménem uživatele, protože to nikdo není co znamená. Použil jsem tedy jméno test, ale v systému je uživatel se skutečným jménem brodsky.

40
Server / Re:Uzavření uživatele v domovském adresáři
« kdy: 09. 06. 2020, 11:11:26 »
Zde je konfigurace ssh, kterou používám:

Kód: [Vybrat]
# $OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes

# Expect .ssh/authorized_keys2 to be disregarded by default in future.
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem sftp internal-sftp

# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand internal-sftp
#Subsystem sftp internal-sftp

#Match group sftpusers
# ChrootDirectory /home/%u
# ForceCommand internal-sftp
# X11Forwarding no
# AllowTcpForwarding no

#Match User horaci
Match User brodsky
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
PermitTunnel no
ChrootDirectory /home/%u


41
Server / Re:Uzavření uživatele v domovském adresáři
« kdy: 09. 06. 2020, 11:03:43 »
To, že se pro SFTP komunikaci má používat interní SFTP nakonfigurované máte?
Kód: [Vybrat]
Subsystem   sftp    internal-sftp

Ano toto mám. Pokusím se ještě získat přesně ten výpis konfigurace a dám ho sem.

42
Server / Re:Uzavření uživatele v domovském adresáři
« kdy: 09. 06. 2020, 11:01:11 »
Ten domovský adresář musí vlastnit root, v tom článku je to napsané.

To je úplně jedno, protože výsledek je stejný. Nyní mám:
Kód: [Vybrat]
drwx------ 5 root root 4096 Jun 9 08:05 test/

Chová se to stále stejně resp. uživatel se nemůže přihlásit. Pokud použiju příkaz sftp, vypíše to hlášku:
Kód: [Vybrat]
packet_write_wait: Connection to 192.168.1.240 port 22: Broken pipe
Connection closed

Je mi to líto, ale tento návod je sice krásný, ale jsem přesvědčen, že nefunguje nebo stále něco přehlížím...

43
Server / Re:Uzavření uživatele v domovském adresáři
« kdy: 09. 06. 2020, 08:55:49 »
Díky za reakce, opět jsem trochu pokročil, ale bezůspěšně...s největší pravděpodobností se stále točím v kruhu.

Nastavení ssh:

Kód: [Vybrat]
Match User test
  ForceCommand internal-sftp
  X11Forwarding no
  AllowTcpForwarding no
  PermitTunnel no
  ChrootDirectory /home/%u

Výpis uživatele a jeho práv:
Kód: [Vybrat]
drwx------ 5 test test 4096 Jun 9 08:05 test/

V této konfiguraci se mi stane to, že se uživatel nemůže přihlásit. Pokud zakomentuju volbu
Kód: [Vybrat]
ChrootDirectory /home/%u tak se přihlásit může. Pokud princip uzavření uživatele správně chápu, tak tuto volbu musím použít jinak to nejde.

Zapomněl jsem ještě na něco?
 

44
Server / Re:Uzavření uživatele v domovském adresáři
« kdy: 28. 05. 2020, 12:15:53 »
Ano přesně to potřebuje. Právě jsem ale zjistil dost něšťastnou věc, že pokud mu zakážu shell, tak se mi nejde připojit přes WIN SPC. Musel jsem shell opět zapnout resp. nefunkční /usr/sbin/nologin nahradit funkčním /bin/sh.
Na ty odkazy kouknu.

45
Server / Uzavření uživatele v domovském adresáři
« kdy: 28. 05. 2020, 10:59:33 »
Ahoj chtěl bych se zeptat na to, jak lze v linuxu zajistit, aby uživatel nemohl opustit jeho kořenový adresář. Už nějakou dobu se po tom pídím na internetu, ale přiznám se, že jsem nenašel nic čemu bych rozuměl. Nevíte tedy někdo o nějakém postupu jak to realizovat?

Zatím jsem se dostal tam, že mám vytvořené uživatele a jsou jim přidělená práva tak, aby každý měl přístup pouze do svého adresáře ve složce /home. V /etc/passwd jsem zrušil uživatelům přístup k shellu a nyní už mi zbývá jen to, aby nemohli opustit home a rochat se v sytému. Sice nemá práva na to aby něco poškodil, ale pro člověka, který tomu nerozumí je to dost matoucí, že něco takového může a pro člověka nepolíbeného linuxem je to neřešitelná situace se vrátit.

Důležité je asi poznamenat i to, že uživatelé mají přes svůj účet pouze vzdálený přístup ssh k souborům databáze. Jediné co tedy uživatel potřebuje je připojit se přeš ssh do své složky, stahnout si databázi a opustit sezení. Má někdo nějaký nápad. Dík.

Stran: 1 2 [3] 4