{"id":30531,"date":"2019-10-31T21:36:03","date_gmt":"2019-10-31T18:36:03","guid":{"rendered":"https:\/\/prohoster.info\/blog\/termux-shag-za-shagom-chast-2\/"},"modified":"2019-10-31T21:36:03","modified_gmt":"2019-10-31T18:36:03","slug":"termux-shag-za-shagom-chast-2","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2","title":{"rendered":"Termux pas cu pas (Partea 2)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00cen <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444950\/\">partea anterioar\u0103<\/a><\/noindex> Am f\u0103cut cuno\u0219tin\u021b\u0103 cu comenzile de baz\u0103 ale Termux, am configurat o conexiune SSH cu PC-ul, am \u00eenv\u0103\u021bat s\u0103 cre\u0103m aliasuri \u0219i am instalat c\u00e2teva utilitare utile. De data aceasta, trebuie s\u0103 facem un pas \u0219i mai departe, noi:<\/p>\n<p><\/p>\n<ul>\n<li>vom \u00eenv\u0103\u021ba despre Termux:API<\/li>\n<li>vom instala Python \u0219i nano, \u0219i vom scrie \u00abHello, world!\u00bb \u00een Python.<\/li>\n<li>vom \u00eenv\u0103\u021ba despre scripturi bash \u0219i vom scrie un script utiliz\u00e2nd Termux:API<\/li>\n<li>folosind scripturi bash, Termux:API \u0219i Python vom scrie un program simplu <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Deoarece acum \u00een\u021belegem ce fac comenzile introduse, de la acest pas nu voi mai explica at\u00e2t de detaliat fiecare ac\u021biune, dar acolo unde pot exista dificult\u0103\u021bi, voi explica cu siguran\u021b\u0103.<\/p>\n<p><\/p>\n<p>Folosesc adesea aliasuri, a\u0219a c\u0103 scurt\u0103turile utilizate \u00een aceast\u0103 sec\u021biune sunt prezentate aici:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">alias updg='apt update &amp;&amp; apt upgrade'\nalias py='python'<\/code><\/pre>\n<p><\/p>\n<p>Planul este gata, putem \u00eencepe! \u0218i, desigur, nu uita\u021bi de \u00abtab-ul magic\u00bb (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444950\/\">Vezi Partea 1<\/a><\/noindex>).<\/p>\n<p><\/p>\n<h2>Pasul 4<\/h2>\n<p><\/p>\n<h3>S\u0103 ne ad\u00e2ncim \u00een lumea Termux:API<\/h3>\n<p><\/p>\n<p><i>API, c\u00e2t de mult s-a contopit acest cuv\u00e2nt \u00een inima unui coder<\/i><\/p>\n<p><\/p>\n<p>Dac\u0103 nu discut\u0103m despre Termux:API, atunci toate pa\u0219ii no\u0219tri ar putea fi rezuma\u021bi printr-o simpl\u0103 poveste dintr-o bro\u0219ur\u0103 de tip \u00abLinux pentru \u00eencep\u0103tori\u00bb, a\u0219a cum a fost corect observat \u00een comentariile de la prima parte.<\/p>\n<p><\/p>\n<p>Pentru \u00eenceput, s\u0103 instal\u0103m Termux:API din Google Play Store (ulterior ar fi bine s\u0103 reporni\u021bi Termux):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux pas cu pas (Partea 2)\" src=\"\/wp-content\/uploads\/2019\/03\/415e25a8ddefc5d4f1741c97d742eeb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Apoi, trebuie s\u0103 instal\u0103m pachetul API \u00een consola Termux:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">updg # S\u0103 nu uit\u0103m de alias-uri\napt install termux-api<\/code><\/pre>\n<p><\/p>\n<p>Pentru experimente, folosesc Android 5.1.1; utilizatorii de Android 7 trebuie s\u0103 \u201eprotec\u021bie\u201d Termux:API, merg\u00e2nd la \u2018Set\u0103ri\u2019 &gt; \u2018Aplica\u021bii protejate\u2019, altfel apelurile API, cum ar fi <code>termux-battery-status<\/code>, se vor bloca. (Vezi. <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.termux.com\/wiki\/Termux:API\">wiki-ul proiectului<\/a><\/noindex>)<\/p>\n<p><\/p>\n<p>Acum merit\u0103 s\u0103 ne apropiem mai mult de posibilit\u0103\u021bile dob\u00e2ndite. Cea mai proasp\u0103t\u0103 \u0219i detaliat\u0103 descriere a Termux:API poate fi g\u0103sit\u0103 pe <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.termux.com\/wiki\/Termux:API\">wiki-ul proiectului<\/a><\/noindex>. \u00cemi voi propune s\u0103 aleg cele mai sugestive \u0219i interesante exemple, care vor permite exersarea pentru munc\u0103 autonom\u0103 \u00een continuare.<\/p>\n<p><\/p>\n<h3>C\u00e2teva exemple ale Termux:API <\/h3>\n<p><\/p>\n<ul>\n<li>termux-battery-status<br \/>\nReturneaz\u0103 starea bateriei<br \/>\n<img decoding=\"async\" alt=\"Termux pas cu pas (Partea 2)\" src=\"\/wp-content\/uploads\/2019\/03\/9a5f793d1b028905b3ee9ceab0fbcdec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-brightness<br \/>\nSeteaz\u0103 luminozitatea ecranului de la 0 la 255<br \/>\n<img decoding=\"async\" alt=\"Termux pas cu pas (Partea 2)\" src=\"\/wp-content\/uploads\/2019\/03\/23e5f3726607921d7f52d5d0de543968.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-toast<br \/>\nAfi\u0219eaz\u0103 o notificare pop-up temporar\u0103<br \/>\n<img decoding=\"async\" alt=\"Termux pas cu pas (Partea 2)\" src=\"\/wp-content\/uploads\/2019\/03\/5c75ad9b678773801ea9975b23422384.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-torch<br \/>\nActiveaz\u0103 lanterna<br \/>\n<img decoding=\"async\" alt=\"Termux pas cu pas (Partea 2)\" src=\"\/wp-content\/uploads\/2019\/03\/7695202f5972e93e5b7a8f4bd952882c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-wifi-scaninfo<br \/>\nReturneaz\u0103 informa\u021biile despre ultima scanare a re\u021belelor Wi-Fi<br \/>\n<img decoding=\"async\" alt=\"Termux pas cu pas (Partea 2)\" src=\"\/wp-content\/uploads\/2019\/03\/f10669f8e7dff1046ab4f9b7d68228e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>Nu este greu s\u0103 observi c\u0103 valorile returnate sunt \u0219iruri, dic\u021bionare, liste de dic\u021bionare, \u00een general tipuri de date cu care Python lucreaz\u0103 foarte bine, a\u0219a c\u0103 urm\u0103torul pas este s\u0103-l instal\u0103m.<\/p>\n<p><\/p>\n<h2>Pasul 5<\/h2>\n<p><\/p>\n<h3>Vom instala Python \u0219i nano<\/h3>\n<p><\/p>\n<p>Pentru a instala Python, scriem \u00een terminal:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">updg\napt install python\napt install python2<\/code><\/pre>\n<p><\/p>\n<p>Acum avem instalate versiunile 2 \u0219i 3 de Python.<\/p>\n<p><\/p>\n<p>\u00cen timpul lucrului la articol, am descoperit un alt editor de text, nano, care mi-a pl\u0103cut mai mult dec\u00e2t vim; hai s\u0103-l instal\u0103m:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">apt install nano<\/code><\/pre>\n<p><\/p>\n<p>Este mai simplu de utilizat dec\u00e2t vim, iar nano are o interfa\u021b\u0103 mai prietenoas\u0103. <i>Pe un dispozitiv Android, totu\u0219i, vim este mai convenabil.<\/i><\/p>\n<p><\/p>\n<h3>HelloWorld \u00een Python \u00een Termux<\/h3>\n<p><\/p>\n<p>\u00cen mare parte, s-ar fi putut s\u0103ri peste acest punct, dar a pune Python \u00een Termux \u0219i a nu scrie HelloWorld este, \u00een opinia mea, o gaf\u0103.<\/p>\n<p><\/p>\n<p>Nu \u00eemi propun s\u0103 \u00eenv\u0103\u021b pe cineva Python, a\u0219a c\u0103 cei care nu \u0219tiu pot doar s\u0103 copieze codul (sau s\u0103 \u00eenceap\u0103 s\u0103 studieze singuri, av\u00e2nd \u00een vedere c\u0103 literatura este suficient\u0103), iar cei care \u0219tiu pot s\u0103 creeze \u0219i ei ceva. Iar eu, \u00ab\u00een timp ce discut\u00bb, voi ar\u0103ta \u0219i o modalitate de a introduce text \u00een terminal f\u0103r\u0103 editor.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cat &gt;hello-world.py     \n# Dac\u0103 nu specifica\u021bi sursa (amintesc cat 1.txt &gt; 2.txt)\n# atunci cat va lua datele din fluxul standard de intrare,\n# pe scurt, din ceea ce introduce\u021bi de la tastatur\u0103.\n\nstr = 'Hello, world!' # atribuim variabilei str valoarea \"Hello, world!\"\nprint (str) # afi\u0219\u0103m pe ecran valoarea din variabila str\n\n# Ctrl + D pentru a termina introducerea \u0219i a salva fi\u0219ierul (hello-world.py)\n\npy hello-world.py # rul\u0103m fi\u0219ierul (py este un alias pentru python)<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux pas cu pas (Partea 2)\" src=\"\/wp-content\/uploads\/2019\/03\/e9086da1ce27f723681f142dad11d878.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dac\u0103, \u00een timpul introducerii, nu a\u021bi observat o eroare \u0219i a\u021bi ap\u0103sat deja Enter, atunci nu ve\u021bi putea s\u0103 reveni\u021bi pe linia de mai sus; pentru aceasta, termina\u021bi introducerea ap\u0103s\u00e2nd Ctrl + D (pute\u021bi opri complet cu Ctrl + Z) \u0219i reface\u021bi totul de la \u00eenceput. Deoarece am folosit '&gt;', fi\u0219ierul va fi complet rescris. Din acest motiv, nu recomand folosirea acestei metode de introducere, dac\u0103 nu sunte\u021bi siguri c\u0103 ve\u021bi scrie codul dintr-o dat\u0103 f\u0103r\u0103 erori.<\/p>\n<p><\/p>\n<h2>Pasul 6<\/h2>\n<p><\/p>\n<h3>Scripturi Bash<\/h3>\n<p><\/p>\n<p>Scripturile Bash sunt o modalitate excelent\u0103 de a automatiza munca cu terminalul. Un script este un fi\u0219ier cu extensia .sh (extensia nu este obligatorie) care con\u021bine un set de comenzi ale terminalului, dintre care unele le-am studiat deja. Iat\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/tproger.ru\/translations\/bash-cheatsheet\/\">lista celor mai multe comenzi<\/a><\/noindex>, totul ar trebui s\u0103 func\u021bioneze, dar re\u021bine\u021bi c\u0103 aceasta este o list\u0103 pentru Linux \u00abadult\u00bb, nu pentru Termux, ci pur \u0219i simplu <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/325522\/\">un material extraordinar despre scripturile bash<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Cu ajutorul scripturilor, putem automatiza aproape toate ac\u021biunile monotone. Vom scrie un script bash simplu care va afi\u0219a valoarea dintr-o variabil\u0103 creat\u0103 de el \u00eensu\u0219i; voi folosi din nou cat, dar voi l\u0103sa pe voi s\u0103 folosi\u021bi un editor de text normal, iar cei care vor s\u0103 se antreneze pot folosi echo.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cat &gt;test.sh\n\nexport str=\"Salut, Habr!\"\n# export creeaz\u0103 variabila str\n# \u0219i \u00eei asigneaz\u0103 valoarea \"Salut, Habr!\"\n# Nu pune\u021bi spa\u021bii \u00eenainte \u0219i dup\u0103 \u2018=\u2019\n\necho $str # Pentru a accesa variabilele, \u00een fa\u021ba lor se pune \u2018$\u2019\n\n# Ctrl + D\n\n# .\\\/test.sh pentru a rula scriptul, dar dac\u0103 facem asta acum, va ap\u0103rea o eroare\n# pentru a sc\u0103pa de eroare, trebuie s\u0103 facem fi\u0219ierul test.sh executabil\n\nchmod +x test.sh\n# chmod modific\u0103 permisiunile (+ ad\u0103uga\u021bi \\\/ - elimina\u021bi)\n# \u2018+x\u2019 \u00eenseamn\u0103 c\u0103 facem fi\u0219ierul executabil\n\n.\\\/test.sh # Rul\u0103m execu\u021bia scriptului nostru<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux pas cu pas (Partea 2)\" src=\"\/wp-content\/uploads\/2019\/03\/7c56f1aaf938a711f3a30dd3eed3eec7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3>Script Bash cu Termux:API<\/h3>\n<p><\/p>\n<p>Hai s\u0103 scriem deja ceva diferit de celebrele HelloWorld-uri, dar la fel de inutile. Scriptul nostru va fi:<\/p>\n<p><\/p>\n<ol>\n<li>apelarea API termux-battery-status<\/li>\n<li>salvarea datelor ob\u021binute \u00een fi\u0219ierul test.txt<\/li>\n<li>afi\u0219area datelor din fi\u0219ier pe ecran<\/li>\n<li>executarea programului scris anterior hello-world.py<\/li>\n<li>\u00eenregistrarea datelor primite de la program \u00een fi\u0219ierul test.txt<\/li>\n<li>afi\u0219area datelor din fi\u0219ier pe ecran<\/li>\n<li>transferarea datelor din fi\u0219ier \u00een clipboard<\/li>\n<li>afi\u0219area pe ecran a con\u021binutului clipboard-ului<\/li>\n<li>afi\u0219area unei notific\u0103ri cu datele din clipboard<\/li>\n<\/ol>\n<p><\/p>\n<p>Mai \u00eent\u00e2i, vom crea un folder pentru lucru \u0219i vom copia hello-world.py \u00een test.py, vom crea \u00een acest folder fi\u0219ierele test.sh \u0219i test.txt:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">mkdir bashscript\n\ncat hello-world.py &gt;&gt; bashscript\/test.py\n\ncd bashscript\/\n\ntouch test.sh test.txt # touch creeaz\u0103 fi\u0219iere\n\nchmod +x test.sh<\/code><\/pre>\n<p><\/p>\n<p>Acum, prin orice metod\u0103 convenabil\u0103, vom scrie scriptul \u00een fi\u0219ierul test.sh:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">#!\/bin\/bash\n\n# \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c #! (\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0448\u0435\u0431\u0430\u043d\u0433)\n# \u043f\u043e\u0441\u043b\u0435 \u0438\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043d\u0430 \u0448\u0435\u043b\u043b \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0441\u043a\u0440\u0438\u043f\u0442\n\nclear # \u043e\u0447\u0438\u0441\u0442\u0438\u043c \u043e\u043a\u043d\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\n\ntermux-battery-status &gt; test.txt # \u043f\u0443\u043d\u043a\u0442\u044b 1 \u0438 2 \u0438\u0437 \u043d\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430\n\ncat test.txt # \u043f\u0443\u043d\u043a\u0442 3\n\npython test.py &gt; test.txt # \u043f\u0443\u043d\u043a\u0442 4 \u0438 5\n\ncat test.txt # \u043f\u0443\u043d\u043a\u0442 6\n\ncat test.txt | termux-clipboard-set # \u043f\u0443\u043d\u043a\u0442 7\n# | \u044d\u0442\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440. \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0432\u044b\u0445\u043e\u0434\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0433\u043e\n\ntermux-clipboard-get # \u043f\u0443\u043d\u043a\u0442 8\n\ntermux-clipboard-get | termux-toast # \u043f\u0443\u043d\u043a\u0442 9<\/code><\/pre>\n<p><\/p>\n<p>Acum, afl\u00e2ndu-ne \u00een folderul bashscript, scriem <code>.\\\/test.sh<\/code> observ\u0103m \u00een terminalul pe dispozitivul Android:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux pas cu pas (Partea 2)\" src=\"\/wp-content\/uploads\/2019\/03\/44c6632c7a3903dad1113017dc81ee61.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iat\u0103 c\u0103 am scris scriptul bash planificat. Putem s\u0103-l complet\u0103m cu informa\u021bii despre execu\u021bia fiec\u0103rei ac\u021biuni (prin echo), asta las \u00een seama cititorilor.<\/p>\n<p><\/p>\n<h2>Pasul 7<\/h2>\n<p><\/p>\n<h3>S\u0103 facem ceva util<\/h3>\n<p><\/p>\n<p><i>Relativ util<\/i><\/p>\n<p><\/p>\n<p>S\u0103 formul\u0103m cerin\u021bele tehnice<br \/>\nAplica\u021bia ar trebui, dup\u0103 lansare, s\u0103 plaseze \u00een clipboard un \u0219ir aleator din fi\u0219ier \u0219i s\u0103 anun\u021be despre aceasta printr-o notificare.<\/p>\n<p><\/p>\n<p>Ne vom baza pe un script bash, iar \u0219irul aleator din fi\u0219ier \u00eel vom extrage folosind o subprogram\u0103 \u00een Python. Vom elabora un plan de lucru pentru script:<\/p>\n<p><\/p>\n<ol>\n<li>Rularea subprogramului<\/li>\n<li>Transfera\u021bi rezultatul subprogramului \u00een clipboard<\/li>\n<li>Afi\u0219a\u021bi un mesaj pop-up<\/li>\n<\/ol>\n<p><\/p>\n<p>S\u0103 stabilim numele directorului \u0219i al fi\u0219ierelor aplica\u021biei:<\/p>\n<p><\/p>\n<ul>\n<li>folderul rndstr din directorul acas\u0103\n<ul>\n<li>source \u2014 fi\u0219ierul din care vom lua liniile<\/li>\n<li>rndstr.py \u2014 subprogramul care afi\u0219eaz\u0103 \u00een consol\u0103 o linie aleatorie din fi\u0219ierul source<\/li>\n<li>rndstr.sh \u2014 fi\u0219ierul script<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Cre\u0103m directorul aplica\u021biei \u0219i, mut\u00e2ndu-ne acolo, cre\u0103m fi\u0219ierele.<\/p>\n<p><\/p>\n<p>Primele dou\u0103 puncte ale planului scriptului pot fi combinate printr-un canal, ob\u021bin\u00e2nd astfel, folosind Termux:API:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">#!\/bin\/bash\n\npython ~\/rndstr\/rndstr.py | termux-clipboard-set # 1 \u0438 2 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u043b\u0430\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u044b\n\ntermux-toast \"OK\" # 3 \u043f\u0443\u043d\u043a\u0442. \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \"\u041e\u041a\"<\/code><\/pre>\n<p><\/p>\n<p>\u00cen fi\u0219ierul source pute\u021bi introduce orice text logic \u00eemp\u0103r\u021bit \u00een linii, eu am decis s\u0103 introduc aforisme:<\/p>\n<p>\n<b class=\"spoiler_title\">Listingul fi\u0219ierului source<\/b><\/p>\n<pre><code class=\"plaintext\">Sinceritatea nu este adev\u0103rul. L. Lavelle\n\u00cendur\u0103-te \u0219i ab\u021bine-te. Epictet\nNumai ceea ce este altruist este nobil. J. La Bruy\u00e8re\nFii prudent \u0219i curajos. B. Gracian\nBun\u0103tatea este mai valoroas\u0103 dec\u00e2t frumuse\u021bea. G. Heine\nPentru faptele mari este nevoie de o perseveren\u021b\u0103 neobosit\u0103. F. Voltaire\nDac\u0103 vrei s\u0103 le placi tuturor, r\u0103sfa\u021b\u0103-te singur. B. Franklin\nModestia excesiv\u0103 nu este altceva dec\u00e2t m\u00e2ndrie ascuns\u0103. A. Chenier\nOamenii foarte inteligen\u021bi \u00eencep s\u0103 nu fie de \u00eencredere atunci c\u00e2nd le vezi confuzia. F. Nietzsche\nS\u0103r\u0103cia indic\u0103 o lips\u0103 de mijloace, nu o lips\u0103 de noble\u021be. D. Boccaccio\nTrebuie s\u0103 ne ferim de transformarea modestiei \u00een umilin\u021b\u0103. A. Bakihanov\nCine renun\u021b\u0103 la multe, \u00ee\u0219i poate permite multe. J. Chardon\nC\u00e2nd suntem pl\u0103ti\u021bi pentru o fapt\u0103 nobil\u0103, ea ne este r\u0103pit\u0103. N. Chamfort\nA nu ob\u021bine deloc nu este \u00eenfrico\u0219\u0103tor, dar a pierde ceea ce ai ob\u021binut este sup\u0103r\u0103tor. Claudius Elian\nEste mai u\u0219or s\u0103 suport\u0103m r\u0103bd\u0103tor ceea ce nu putem schimba. Horatiu\nTe-ai s\u0103turat de a\u0219teptat, dar c\u00e2t de r\u0103u ar fi fost s\u0103 nu ai nimic de a\u0219teptat. B. Shaw\nTotul vine la timpul s\u0103u, dac\u0103 oamenii \u0219tiu s\u0103 a\u0219tepte. F. Rabelais\nPrin r\u0103bdarea noastr\u0103 putem atinge mai mult dec\u00e2t prin putere. E. Burke\nTrebuie s\u0103 \u0219tim s\u0103 suport\u0103m ceea ce nu putem evita. M. Montaigne\nCine este curajos \u00een afacere, nu se teme de cuvinte. Sofocle\nNu-mi place s\u0103 lupt, \u00eemi place s\u0103 c\u00e2\u0219tig. B. Shaw\nO pisic\u0103 zb\u0103tut\u0103 \u0219i \u00eempins\u0103 la zid se transform\u0103 \u00eentr-un tigru. M. Cervantes\nUn om demn nu merge pe urmele altora. Confucius\nO minte mare \u00ee\u0219i va ar\u0103ta puterea nu numai \u00een abilitatea de a g\u00e2ndi, ci \u0219i \u00een abilitatea de a tr\u0103i. R. Emerson\nGloria este o marf\u0103 neprofitabil\u0103. Cost\u0103 mult \u0219i se p\u0103streaz\u0103 prost. O. Balzac\nModerarea \u0219i relevan\u021ba \u00een conversa\u021bii valoreaz\u0103 mai mult dec\u00e2t elocven\u021ba. F. Bacon\nCine nu \u0219tie s\u0103 tac\u0103, nu este capabil s\u0103 vorbeasc\u0103. Seneca T\u00e2n\u0103rul\nManierele bune constau din mici sacrificii. F. Chesterfield\nUn om bun nu este acela care \u0219tie s\u0103 fac\u0103 bine, ci acela care nu \u0219tie s\u0103 fac\u0103 r\u0103u. V. Kluchevski\nNu emite judec\u0103\u021bi irevocabile! Augustin\nNimic \u00een exces! Solon<\/code><\/pre>\n<p><\/p>\n<p>Ne-a r\u0103mas s\u0103 cre\u0103m un subprogram care extrage o linie aleatoare din fi\u0219ierul source.<br \/>\nS\u0103 detaliem algoritmul de func\u021bionare al subprogramului:<\/p>\n<p><\/p>\n<ol>\n<li>Deschidem fi\u0219ierul source<\/li>\n<li>Num\u0103r\u0103m r\u00e2ndurile din fi\u0219ierul deschis<\/li>\n<li>\u00cenchidem fi\u0219ierul (nu este cazul s\u0103-l \u021binem deschis mai mult dec\u00e2t este necesar)<\/li>\n<li>Gener\u0103m un num\u0103r \u00eentreg aleatoriu \u00een limita num\u0103rului de linii din fi\u0219ierul source<\/li>\n<li>Deschidem fi\u0219ierul source<\/li>\n<li>Afi\u0219\u0103m linia cu num\u0103rul generat<\/li>\n<li>\u00cenchidem fi\u0219ierul<\/li>\n<\/ol>\n<p><\/p>\n<p>Implement\u0103m algoritmul \u00een Python (scriu pentru Python 3.7):<\/p>\n<p><\/p>\n<pre><code class=\"python\">import random  #  import\u0103m pentru generarea numerelor aleatorii\nimport os  #  pentru ob\u021binerea c\u0103ii\n\npath = os.path.abspath(__file__)  #  ob\u021binem calea absolut\u0103 c\u0103tre fi\u0219ierul rndstr.py\npath = os.path.dirname(path)  #  transform\u0103m \u00een calea c\u0103tre director\npath = path  + 'source'  #  transform\u0103m \u00een calea c\u0103tre fi\u0219ierul source\n\nf = open(path)  #  deschidem fi\u0219ierul\ni = 0  #  reset\u0103m contorul\nfor str in f: i+=1  #  num\u0103r\u0103m liniile din fi\u0219ier\nf.close  #  \u00eenchidem fi\u0219ierul\n\nj = int(round(i * random.random()))  #  gener\u0103m un num\u0103r \u00eentreg aleatoriu de la 0 la i\n\nf = open(path)  #  deschidem fi\u0219ierul\ni = 0  #  reset\u0103m contorul\nfor str in f:  #  iter\u0103m prin liniile din fi\u0219ier\n    if i == j:  #  dac\u0103 contorul liniilor este egal cu num\u0103rul generat\n        print(str, end='')  #  afi\u0219\u0103m linia f\u0103r\u0103 a trece la o nou\u0103 linie\n        break  #  ie\u0219im din ciclu\n    i+=1  #  increment\u0103m contorul cu 1\nf.close  #  \u00eenchidem fi\u0219ierul<\/code><\/pre>\n<p><\/p>\n<p>Dup\u0103 ce fi\u0219ierele sunt create \u0219i scrise, trebuie s\u0103 d\u0103m permisiuni de execu\u021bie fi\u0219ierului <code>rndstr.sh<\/code>, \u0219i s\u0103 cre\u0103m un alias pentru a rula rapid.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">alias rnst=\"~\/rndstr\/rndstr.sh\"<\/code><\/pre>\n<p><\/p>\n<p>Acum, introduc\u00e2nd \u00een terminal <code>rnst<\/code> vom ob\u021bine \u00een clipboard un aforism aleatoriu, pe care, de exemplu, \u00eel putem folosi \u00een coresponden\u021b\u0103.<\/p>\n<p><\/p>\n<p>Iat\u0103 c\u0103 am scris m\u0103car ceva util. Relativ util.<\/p>\n<p><\/p>\n<h3>P.s.<\/h3>\n<p><\/p>\n<p>Am ales inten\u021bionat s\u0103 nu includ capturi de ecran \u00een ultimul pas \u0219i nu am explicat detaliat c\u00e2teva ac\u021biuni, enun\u021b\u00e2nd doar con\u021binutul fi\u0219ierelor, astfel cititorii au posibilitatea s\u0103 lucreze singuri.<\/p>\n<p><\/p>\n<p>Acesta a fost \u00abTermux pas cu pas\u00bb, cred c\u0103 ar trebui s\u0103 \u00eencheiem. Desigur, acestea sunt doar primele pa\u0219i, dar acum pute\u021bi merge mai departe singuri.<\/p>\n<p><\/p>\n<p>Ini\u021bial, am planificat s\u0103 ar\u0103t \u00een aceast\u0103 serie cum s\u0103 folosesc nmap, sqlmap, dar \u0219i f\u0103r\u0103 mine sunt deja multe articole pe aceast\u0103 tem\u0103. Dac\u0103 ave\u021bi dorin\u021ba ca eu s\u0103 continui seria \u00abTermux pas cu pas\u00bb, atunci mai jos este un sondaj, iar \u00een comentarii pute\u021bi propune despre ce altceva s\u0103 scriu.<\/p>\n<p class=\"for_users_only_msg\">Numai utilizatorii \u00eenregistra\u021bi pot participa la sondaj. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Conecta\u021bi-v\u0103<\/a><\/noindex>, v\u0103 rug\u0103m.<\/p>\n<h2 class=\"default-block__polling-title\">Continu\u0103m \u00abTermux pas cu pas\u00bb?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Da<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nu<\/p>\n<\/li>\n<\/ul>\n<p>    Au votat 2 utilizatori. Nu sunt ab\u021bineri.<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/445868\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 Termux&#8217;\u0430, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 SSH \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u041f\u041a, \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c alias&#8217;\u044b \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0448\u0430\u0433\u043d\u0443\u0442\u044c \u0435\u0449\u0435 \u0434\u0430\u043b\u044c\u0448\u0435, \u043c\u044b \u0441 \u0432\u0430\u043c\u0438: \u0443\u0437\u043d\u0430\u0435\u043c \u043f\u0440\u043e Termux:API \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Python \u0438 nano, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c &#171;Hello, world!&#187; \u043d\u0430 Python \u0443\u0437\u043d\u0430\u0435\u043c \u043f\u0440\u043e bash-\u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22529,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-30531","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 Termux&#039;\u0430, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 SSH \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u041f\u041a, \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c alias&#039;\u044b \u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Termux \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c (\u0427\u0430\u0441\u0442\u044c 2) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 Termux&#039;\u0430, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 SSH \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u041f\u041a, \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c alias&#039;\u044b \u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:36:03+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:36:03+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Termux pas cu pas (Partea 2) | ProHoster","description":"\u00cen partea anterioar\u0103, ne-am familiarizat cu comenzile de baz\u0103 ale Termux, am configurat conexiunea SSH cu PC-ul, am \u00eenv\u0103\u021bat s\u0103 cre\u0103m alias-uri \u0219i.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Termux \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c (\u0427\u0430\u0441\u0442\u044c 2) | ProHoster","og:description":"\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 Termux'\u0430, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 SSH \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u041f\u041a, \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c alias'\u044b \u0438.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:36:03+00:00","article:modified_time":"2019-10-31T18:36:03+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30531","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 01:39:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:16:48","updated":"2026-08-11 12:50:36","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/30531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=30531"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/30531\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/22529"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=30531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=30531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=30531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}