{"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\/pl\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2","title":{"rendered":"Termux krok po kroku (Cz\u0119\u015b\u0107 2)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>W <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444950\/\">poprzedniej cz\u0119\u015bci<\/a><\/noindex> Zrobili\u015bmy pierwsze kroki w podstawowych komendach Termux\u2019a, skonfigurowali\u015bmy po\u0142\u0105czenie SSH z PC, nauczyli\u015bmy si\u0119 tworzy\u0107 aliasy i zainstalowali\u015bmy kilka przydatnych narz\u0119dzi. Tym razem czeka nas kolejny krok naprz\u00f3d, a mianowicie:<\/p>\n<p><\/p>\n<ul>\n<li>dowiedz si\u0119 o Termux:API<\/li>\n<li>zainstalujemy Pythona i nano oraz napisujemy \u201eHello, world!\u201d w Pythonie<\/li>\n<li>dowiedz si\u0119 o skryptach bash i napiszemy skrypt wykorzystuj\u0105cy Termux:API<\/li>\n<li>u\u017cywaj\u0105c skryptu bash, Termux:API i Pythona napiszemy prosty program <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Teraz, gdy rozumiemy, co robi\u0105 wprowadzane komendy, od nast\u0119pnego kroku nie b\u0119d\u0119 tak szczeg\u00f3\u0142owo opisywa\u0142 ka\u017cdego dzia\u0142ania, ale tam, gdzie mog\u0105 wyst\u0105pi\u0107 trudno\u015bci, z pewno\u015bci\u0105 wyja\u015bni\u0119.<\/p>\n<p><\/p>\n<p>Cz\u0119sto korzystam z alias\u00f3w, dlatego u\u017cywane w tej cz\u0119\u015bci skr\u00f3ty zosta\u0142y pokazane tutaj:<\/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>Plan gotowy, mo\u017cemy zaczyna\u0107! I oczywi\u015bcie nie zapominajcie o \u201emagicznej \u0142awce\u201d (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444950\/\">Zob. Cz\u0119\u015b\u0107 1<\/a><\/noindex>).<\/p>\n<p><\/p>\n<h2>Krok 4<\/h2>\n<p><\/p>\n<h3>Zanurzamy si\u0119 w kr\u00f3lika Termux:API<\/h3>\n<p><\/p>\n<p><i>Ile\u017c to w tym s\u0142owie w jednym sercu kodera si\u0119 \u0142\u0105czy<\/i><\/p>\n<p><\/p>\n<p>Je\u015bli nie dotykamy tematu Termux:API, to wszystkie nasze kroki mo\u017cna by by\u0142o sprowadzi\u0107 do prostego streszczenia jakiej\u015b broszury typu \u201eLinux dla \u017c\u00f3\u0142todziob\u00f3w\u201d, jak s\u0142usznie zauwa\u017cono w komentarzach do pierwszej cz\u0119\u015bci.<\/p>\n<p><\/p>\n<p>Na pocz\u0105tek zainstalujemy Termux:API z Google Play Marketu (po instalacji warto zrestartowa\u0107 Termux):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux krok po kroku (Cz\u0119\u015b\u0107 2)\" src=\"\/wp-content\/uploads\/2019\/03\/415e25a8ddefc5d4f1741c97d742eeb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nast\u0119pnie musimy zainstalowa\u0107 pakiet API w konsoli Termux\u2019a:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">updg # Nie zapominaj o aliasach\napt install termux-api<\/code><\/pre>\n<p><\/p>\n<p>Do eksperyment\u00f3w u\u017cywam Androida 5.1.1, dla w\u0142a\u015bcicieli Androida 7 trzeba \u201ezabezpieczy\u0107\u201d Termux:API, wchodz\u0105c w \u201aUstawienia\u2019 &gt; \u201aZabezpieczone aplikacje\u2019, w przeciwnym razie wywo\u0142ania API, takie jak <code>termux-battery-status<\/code>, b\u0119d\u0105 si\u0119 zawiesza\u0107. (Zob. <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.termux.com\/wiki\/Termux:API\">wiki projektu<\/a><\/noindex>)<\/p>\n<p><\/p>\n<p>Teraz warto bli\u017cej pozna\u0107 zdobyte mo\u017cliwo\u015bci. Naj\u015bwie\u017cszy i najdok\u0142adniejszy opis Termux:API mo\u017cna znale\u017a\u0107 na <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.termux.com\/wiki\/Termux:API\">wiki projektu<\/a><\/noindex>. Postaram si\u0119 wybra\u0107 najja\u015bniejsze i najbardziej interesuj\u0105ce, co pozwoli nabra\u0107 wprawy do samodzielnej pracy w przysz\u0142o\u015bci.<\/p>\n<p><\/p>\n<h3>Kilka przyk\u0142ad\u00f3w Termux:API <\/h3>\n<p><\/p>\n<ul>\n<li>termux-battery-status<br \/>\nZwraca stan baterii<br \/>\n<img decoding=\"async\" alt=\"Termux krok po kroku (Cz\u0119\u015b\u0107 2)\" src=\"\/wp-content\/uploads\/2019\/03\/9a5f793d1b028905b3ee9ceab0fbcdec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-brightness<br \/>\nUstala jasno\u015b\u0107 ekranu od 0 do 255<br \/>\n<img decoding=\"async\" alt=\"Termux krok po kroku (Cz\u0119\u015b\u0107 2)\" src=\"\/wp-content\/uploads\/2019\/03\/23e5f3726607921d7f52d5d0de543968.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-toast<br \/>\nWykazuje tymczasowe powiadomienie wyskakuj\u0105ce<br \/>\n<img decoding=\"async\" alt=\"Termux krok po kroku (Cz\u0119\u015b\u0107 2)\" src=\"\/wp-content\/uploads\/2019\/03\/5c75ad9b678773801ea9975b23422384.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-torch<br \/>\nW\u0142\u0105cza latark\u0119<br \/>\n<img decoding=\"async\" alt=\"Termux krok po kroku (Cz\u0119\u015b\u0107 2)\" src=\"\/wp-content\/uploads\/2019\/03\/7695202f5972e93e5b7a8f4bd952882c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-wifi-scaninfo<br \/>\nZwraca informacje o ostatnim skanowaniu sieci Wi-Fi<br \/>\n<img decoding=\"async\" alt=\"Termux krok po kroku (Cz\u0119\u015b\u0107 2)\" src=\"\/wp-content\/uploads\/2019\/03\/f10669f8e7dff1046ab4f9b7d68228e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>Nie trudno zauwa\u017cy\u0107, \u017ce zwracane warto\u015bci to ci\u0105gi, s\u0142owniki, listy s\u0142ownik\u00f3w, og\u00f3lnie typy danych, z kt\u00f3rymi Python \u015bwietnie sobie radzi, wi\u0119c nast\u0119pnym krokiem b\u0119dzie jego zainstalowanie.<\/p>\n<p><\/p>\n<h2>Krok 5<\/h2>\n<p><\/p>\n<h3>Zainstalujemy Pythona i nano<\/h3>\n<p><\/p>\n<p>Aby zainstalowa\u0107 Pythona, wpisujemy w terminalu:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">updg\napt install python\napt install python2<\/code><\/pre>\n<p><\/p>\n<p>Teraz mamy zainstalowanych Pythona w wersjach 2 i 3.<\/p>\n<p><\/p>\n<p>Podczas pracy nad artyku\u0142em odkry\u0142em kolejny edytor tekstu nano, kt\u00f3ry bardziej mi si\u0119 spodoba\u0142 ni\u017c vim, wi\u0119c zainstalujmy go:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">apt install nano<\/code><\/pre>\n<p><\/p>\n<p>Korzystanie z niego jest prostsze ni\u017c z vim\u2019a, a nano ma bardziej przyjazny interfejs. <i>Na urz\u0105dzeniu z Androidem jednak wygodniej jest korzysta\u0107 z vima.<\/i><\/p>\n<p><\/p>\n<h3>HelloWorld w Pythonie w Termux<\/h3>\n<p><\/p>\n<p>Generalnie mo\u017cna by si\u0119 bez tego obej\u015b\u0107, ale postawi\u0107 Pythona w Termux i nie napisa\u0107 HelloWorld, moim zdaniem to faux pas.<\/p>\n<p><\/p>\n<p>Nie mam na celu nauczania kogokolwiek Pythona, wi\u0119c ci, kt\u00f3rzy nie znaj\u0105, mog\u0105 po prostu skopiowa\u0107 kod (lub zacz\u0105\u0107 uczy\u0107 si\u0119 samodzielnie, bo literatury jest pod dostatkiem), a ci, kt\u00f3rzy wiedz\u0105, mog\u0105 sami co\u015b stworzy\u0107. A ja \u201eprzy okazji\u201d jeszcze poka\u017c\u0119 spos\u00f3b wprowadzania tekstu w terminalu bez edytora.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cat &gt;hello-world.py     \n# Je\u015bli nie okre\u015blisz \u017ar\u00f3d\u0142a (przypominam cat 1.txt &gt; 2.txt)\n# to cat b\u0119dzie pobiera\u0142 dane z domy\u015blnego strumienia wej\u015bciowego,\n# pro\u015bciej m\u00f3wi\u0105c, z klawiatury.\n\nstr = 'Hello, world!' # przypisujemy zmiennej str warto\u015b\u0107 \"Hello, world!\"\nprint(str) # wy\u015bwietlamy na ekranie warto\u015b\u0107 zmiennej str\n\n# Ctrl + D aby zako\u0144czy\u0107 wprowadzanie i zapisa\u0107 plik (hello-world.py)\n\npy hello-world.py # uruchamiamy plik (py to alias dla pythona)<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux krok po kroku (Cz\u0119\u015b\u0107 2)\" src=\"\/wp-content\/uploads\/2019\/03\/e9086da1ce27f723681f142dad11d878.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je\u015bli w trakcie wprowadzania nie zauwa\u017cy\u0142e\u015b b\u0142\u0119du i ju\u017c nacisn\u0105\u0142e\u015b Enter, nie b\u0119dziesz m\u00f3g\u0142 przej\u015b\u0107 do poprzedniego wiersza, dlatego zako\u0144cz wprowadzanie naciskaj\u0105c Ctrl + D (mo\u017cesz tak\u017ce przerwa\u0107 Ctrl + Z) i powt\u00f3rz wszystko od nowa. Poniewa\u017c u\u017cyli\u015bmy '&gt;', plik zostanie ca\u0142kowicie nadpisany. Z tego powodu nie zalecam u\u017cywania takiej metody wprowadzania, je\u015bli nie jeste\u015b pewien, \u017ce od razu napiszesz kod bez b\u0142\u0119d\u00f3w.<\/p>\n<p><\/p>\n<h2>Krok 6<\/h2>\n<p><\/p>\n<h3>Skrypty Bash<\/h3>\n<p><\/p>\n<p>Skrypty Bash to doskona\u0142y spos\u00f3b na automatyzacj\u0119 pracy w terminalu. Skrypt to plik z rozszerzeniem .sh (rozszerzenie nie jest obowi\u0105zkowe) zawieraj\u0105cy zestaw polece\u0144 terminala, z kt\u00f3rych cz\u0119\u015b\u0107 ju\u017c poznali\u015bmy. Oto <noindex><a rel=\"nofollow\" href=\"https:\/\/tproger.ru\/translations\/bash-cheatsheet\/\">lista wi\u0119kszo\u015bci polece\u0144<\/a><\/noindex>, wszystko powinno dzia\u0142a\u0107, ale zwr\u00f3\u0107cie uwag\u0119, \u017ce to lista dla \u201edoros\u0142ego\u201d Linux\u2019a, a nie dla Termux\u2019a, a oto po prostu <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/325522\/\">wspania\u0142y materia\u0142 na temat skrypt\u00f3w bash<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Dzi\u0119ki skryptom mo\u017cna zautomatyzowa\u0107 praktycznie wszystkie monotonne czynno\u015bci. Napiszemy prosty skrypt bash, kt\u00f3ry wy\u015bwietli warto\u015b\u0107 z ju\u017c utworzonej przez niego zmiennej; ponownie skorzystam z cat\u2019a, ale ty mo\u017cesz u\u017cy\u0107 zwyk\u0142ego edytora tekstu, a szczeg\u00f3lnie ch\u0119tni mog\u0105 spr\u00f3bowa\u0107 u\u017cy\u0107 echo.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cat &gt;test.sh\n\nexport str=\"Cze\u015b\u0107, Habr!\"\n# export tworzy zmienn\u0105 str\n# i przypisuje jej warto\u015b\u0107 \"Cze\u015b\u0107, Habr!\"\n# Nie umieszczaj spacji przed i po \u2018=\u2019\n\necho $str # Aby odwo\u0142a\u0107 si\u0119 do zmiennych, przed nimi nale\u017cy postawi\u0107 \u2018$\u2019\n\n# Ctrl + D\n\n# .\\\/test.sh aby uruchomi\u0107 skrypt, ale je\u015bli to zrobisz teraz, wyst\u0105pi b\u0142\u0105d\n# aby pozby\u0107 si\u0119 b\u0142\u0119du, musisz nada\u0107 plikowi test.sh uprawnienia do wykonania\n\nchmod +x test.sh\n# chmod zmienia prawa dost\u0119pu (+ doda\u0107 \/ - usun\u0105\u0107)\n# \u2018+x\u2019 oznacza, \u017ce nadajemy plikowi uprawnienia do wykonania\n\n.\\\/test.sh # Uruchamiamy nasz skrypt<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux krok po kroku (Cz\u0119\u015b\u0107 2)\" src=\"\/wp-content\/uploads\/2019\/03\/7c56f1aaf938a711f3a30dd3eed3eec7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3>Skrypt Bash z Termux:API<\/h3>\n<p><\/p>\n<p>Napiszmy co\u015b r\u00f3\u017cni\u0105cego si\u0119 od s\u0142ynnych HelloWorld\u2019\u00f3w, ale r\u00f3wnie nieprzydatnego. Nasz skrypt b\u0119dzie:<\/p>\n<p><\/p>\n<ol>\n<li>dokonywa\u0107 zapytania API termux-battery-status<\/li>\n<li>zapisywa\u0107 uzyskane dane do pliku test.txt<\/li>\n<li>wy\u015bwietla\u0107 dane z pliku na ekranie<\/li>\n<li>wykonywa\u0107 wcze\u015bniej napisan\u0105 program hello-world.py<\/li>\n<li>uzyskane od programu dane zapisywa\u0107 do pliku test.txt<\/li>\n<li>wy\u015bwietla\u0107 dane z pliku na ekranie<\/li>\n<li>przenie\u015b\u0107 dane z pliku do schowka<\/li>\n<li>wy\u015bwietla\u0107 na ekranie zawarto\u015b\u0107 schowka<\/li>\n<li>wy\u015bwietla\u0107 powiadomienie z danymi ze schowka<\/li>\n<\/ol>\n<p><\/p>\n<p>Najpierw utw\u00f3rzmy folder roboczy i skopiujmy do niego hello-world.py jako test.py, stworzymy w tym folderze pliki test.sh i 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 tworzy pliki\n\nchmod +x test.sh<\/code><\/pre>\n<p><\/p>\n<p>Teraz w jakikolwiek wygodny spos\u00f3b zapiszmy skrypt do pliku 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>Teraz, b\u0119d\u0105c w folderze bashscript, piszemy <code>.\\\/test.sh<\/code> obserwujemy w terminalu na urz\u0105dzeniu z Androidem:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux krok po kroku (Cz\u0119\u015b\u0107 2)\" src=\"\/wp-content\/uploads\/2019\/03\/44c6632c7a3903dad1113017dc81ee61.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Stworzyli\u015bmy zaplanowany skrypt bash. Mo\u017cemy urozmaici\u0107 jego dzia\u0142anie, wy\u015bwietlaj\u0105c w konsoli informacje na temat wykonania ka\u017cdego dzia\u0142ania (za pomoc\u0105 echo), to pozostawi\u0119 czytelnikom.<\/p>\n<p><\/p>\n<h2>Krok 7<\/h2>\n<p><\/p>\n<h3>Zr\u00f3bmy co\u015b u\u017cytecznego<\/h3>\n<p><\/p>\n<p><i>Relatywnie u\u017cyteczne<\/i><\/p>\n<p><\/p>\n<p>Sformu\u0142ujmy wymagania techniczne<br \/>\nAplikacja po uruchomieniu ma umie\u015bci\u0107 losowy wiersz z pliku w schowku oraz powiadamia\u0107 o tym powiadomieniem.<\/p>\n<p><\/p>\n<p>Na podstawie skryptu bash, losowy wiersz z pliku b\u0119dziemy wydobywa\u0107 przy pomocy podprogramu w Pythonie. Opracujemy plan dzia\u0142ania skryptu:<\/p>\n<p><\/p>\n<ol>\n<li>Uruchomi\u0107 podprogram<\/li>\n<li>Przenie\u015b wynik dzia\u0142ania podprogramu do schowka<\/li>\n<li>Wy\u015bwietl komunikat pop-up<\/li>\n<\/ol>\n<p><\/p>\n<p>Zdefiniujmy nazwy katalogu i plik\u00f3w aplikacji:<\/p>\n<p><\/p>\n<ul>\n<li>folder rndstr w katalogu domowym\n<ul>\n<li>source \u2014 plik, z kt\u00f3rego b\u0119dziemy pobiera\u0107 linie<\/li>\n<li>rndstr.py \u2014 podprogram wypisuj\u0105cy na konsol\u0119 losowy ci\u0105g z pliku source<\/li>\n<li>rndstr.sh \u2014 plik skryptu<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Tworzymy katalog aplikacji, a nast\u0119pnie, przeszli\u015bmy do niego, tworzymy tam pliki.<\/p>\n<p><\/p>\n<p>Pierwsze dwa punkty planu skryptu mo\u017cna po\u0142\u0105czy\u0107 potokiem, ostatecznie, korzystaj\u0105c z Termux:API uzyskujemy:<\/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>Do pliku source mo\u017cesz umie\u015bci\u0107 dowolny tekst logicznie podzielony na wiersze, postanowi\u0142em umie\u015bci\u0107 aforyzmy:<\/p>\n<p>\n<b class=\"spoiler_title\">Listing pliku source<\/b><\/p>\n<pre><code class=\"plaintext\">Szczero\u015b\u0107 nie jest prawd\u0105. L. Lavelle\nCierp i powstrzymuj si\u0119. Epiktet\nTylko to, co jest bezinteresowne, jest szlachetne. J. La Bruy\u00e8re\nB\u0105d\u017a rozwa\u017cnie odwa\u017cny. B. Gracjan\nDobro\u0107 jest lepsza ni\u017c pi\u0119kno. G. Heine\nDo wielkich czyn\u00f3w potrzebna jest nieust\u0119pliwa konsekwencja. F. Voltaire\nJe\u015bli chcesz, aby ludzie ci si\u0119 podobali, s\u0142u\u017c sobie sam. B. Franklin\nNadmierna skromno\u015b\u0107 to nic innego jak ukryta pycha. A. Chenier\nBardzo inteligentni ludzie zaczynaj\u0105 budzi\u0107 nieufno\u015b\u0107, gdy wida\u0107 ich zak\u0142opotanie. F. Nietzsche\nBieda wskazuje na brak \u015brodk\u00f3w, a nie na brak szlachetno\u015bci. D. Boccaccio\nNale\u017cy unika\u0107 skromno\u015bci prowadz\u0105cej do upokorzenia. A. Bakihanov\nKto wyrzeka si\u0119 wielu rzeczy, mo\u017ce sobie wiele pozwoli\u0107. J. Chardon\nGdy p\u0142ac\u0105 nam za szlachetny czyn, odbieraj\u0105 nam go. N. Chamfort\nNie straszne jest nic nie dosta\u0107, lecz zasmuca utrata tego, co si\u0119 otrzyma\u0142o. Klaudiusz Elian\n\u0141atwiej jest cierpliwie znosi\u0107 to, czego nie mo\u017cemy naprawi\u0107. Horacy\nM\u0119czy ci\u0119 czekanie, ale jak\u017ce gorsze by\u0142oby czekanie, gdyby nie by\u0142o na co czeka\u0107. B. Shaw\nWszystko przychodzi na czas, je\u015bli ludzie potrafi\u0105 czeka\u0107. F. Rabelais\nDzi\u0119ki naszemu cierpliwo\u015bci mo\u017cemy osi\u0105gn\u0105\u0107 wi\u0119cej ni\u017c dzi\u0119ki sile. E. Burke\nNale\u017cy umie\u0107 znosi\u0107 to, czego nie mo\u017cna unikn\u0105\u0107. M. Montaigne\nKto w dzia\u0142aniu jest odwa\u017cny, ten nie boi si\u0119 s\u0142\u00f3w. Sofokles\nNie lubi\u0119 walczy\u0107, lubi\u0119 wygrywa\u0107. B. Shaw\nZastraszony i przyci\u015bni\u0119ty do muru kot zamienia si\u0119 w tygrysa. M. Cervantes\nGodny cz\u0142owiek nie chodzi \u015bladami innych. Konfucjusz\nWielki umys\u0142 ujawni swoj\u0105 si\u0142\u0119 nie tylko w umiej\u0119tno\u015bci my\u015blenia, ale i w umiej\u0119tno\u015bci \u017cycia. R. Emerson\nChwa\u0142a to towar, kt\u00f3ry nie przynosi korzy\u015bci. Kosztuje du\u017co, a kiepsko si\u0119 utrzymuje. O. Balzac\nPow\u015bci\u0105gliwo\u015b\u0107 i stosowno\u015b\u0107 w rozmowach s\u0105 cenniejsze ni\u017c elokwencja. F. Bacon\nKto nie potrafi milcze\u0107, ten nie potrafi te\u017c m\u00f3wi\u0107. Seneka M\u0142odszy\nDobre maniery polegaj\u0105 na ma\u0142ych wyrzeczeniach. F. Chesterfield\nDobry cz\u0142owiek to nie ten, kto potrafi czyni\u0107 dobro, ale ten, kto nie potrafi czyni\u0107 z\u0142a. W. Kliuczewski\nNie formu\u0142uj nieodwracalnych s\u0105d\u00f3w! Augustyn\nNic w nadmiarze! Solon<\/code><\/pre>\n<p><\/p>\n<p>Pozosta\u0142o nam stworzy\u0107 podprogram, kt\u00f3ry wyci\u0105ga losowy wiersz z pliku source.<br \/>\nSformu\u0142ujmy algorytm dzia\u0142ania podprogramu:<\/p>\n<p><\/p>\n<ol>\n<li>Otwieramy plik source<\/li>\n<li>Liczymy liczb\u0119 wierszy w otwartym pliku<\/li>\n<li>Zamykamy plik (nie ma potrzeby trzyma\u0107 go otwartego d\u0142u\u017cej ni\u017c to konieczne)<\/li>\n<li>Generujemy losow\u0105 liczb\u0119 ca\u0142kowit\u0105 w zakresie liczby wierszy pliku source<\/li>\n<li>Otwieramy plik source<\/li>\n<li>Wy\u015bwietlamy wiersz o numerze wylosowanej liczby<\/li>\n<li>Zamykamy plik<\/li>\n<\/ol>\n<p><\/p>\n<p>Realizujemy algorytm w Pythonie (pisz\u0119 pod Python 3.7):<\/p>\n<p><\/p>\n<pre><code class=\"python\">import random  # importujemy do generowania losowych liczb\nimport os  # do uzyskania \u015bcie\u017cki\n\npath = os.path.abspath(__file__)  # uzyskujemy bezpo\u015bredni\u0105 \u015bcie\u017ck\u0119 do pliku rndstr.py\npath = os.path.dirname(path)  # przekszta\u0142camy w \u015bcie\u017ck\u0119 do katalogu\npath = path  + ' \/source'  # przekszta\u0142camy w \u015bcie\u017ck\u0119 do pliku source\n\nf = open(path)  # otwieramy plik\ni = 0  # zerujemy licznik\nfor str in f: i+=1  # liczymy wiersze w pliku\nf.close  # zamykamy plik\n\nj = int(round(i * random.random()))  # generujemy liczb\u0119 ca\u0142kowit\u0105 losow\u0105 od 0 do i\n\nf = open(path)  # otwieramy plik\ni = 0  # zerujemy licznik\nfor str in f:  # iterujemy wiersze z pliku\n    if i == j:  # je\u015bli licznik wierszy jest r\u00f3wny wylosowanej liczbie\n        print (str, end='')  # wy\u015bwietlamy wiersz bez przechodzenia do nowej linii\n        break  # wychodzimy z p\u0119tli\n    i+=1  # zwi\u0119kszamy licznik o 1\nf.close  # zamykamy plik<\/code><\/pre>\n<p><\/p>\n<p>Po utworzeniu i zapisaniu plik\u00f3w, musimy nada\u0107 plikowi uprawnienia do wykonania <code>rndstr.sh<\/code>, i stworzy\u0107 alias do szybkiego uruchamiania.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">alias rnst=\"~\/rndstr\/rndstr.sh\"<\/code><\/pre>\n<p><\/p>\n<p>Teraz wprowadzaj\u0105c w terminalu <code>rnst<\/code> otrzymamy losowy aforyzm w schowku, kt\u00f3ry mo\u017cna na przyk\u0142ad wykorzysta\u0107 w korespondencji.<\/p>\n<p><\/p>\n<p>W ten spos\u00f3b napisali\u015bmy co\u015b u\u017cytecznego. Stosunkowo u\u017cytecznego.<\/p>\n<p><\/p>\n<h3>P.s.<\/h3>\n<p><\/p>\n<p>Zamierzenie w ostatnim kroku nie zamie\u015bci\u0142em zrzut\u00f3w ekranu i nie om\u00f3wi\u0142em szczeg\u00f3\u0142owo niekt\u00f3rych dzia\u0142a\u0144, opisuj\u0105c tylko zawarto\u015b\u0107 plik\u00f3w, aby czytelnicy mieli mo\u017cliwo\u015b\u0107 samodzielnej pracy.<\/p>\n<p><\/p>\n<p>Na tym \u201eTermux krok po kroku\u201d my\u015bl\u0119, \u017ce warto zako\u0144czy\u0107. Oczywi\u015bcie to tylko pierwsze kroki, ale teraz mo\u017cecie i\u015b\u0107 naprz\u00f3d sami.<\/p>\n<p><\/p>\n<p>Pocz\u0105tkowo planowa\u0142em pokaza\u0107 w tym cyklu, jak korzysta\u0107 z nmap, sqlmap, ale bez mnie ju\u017c jest wiele artyku\u0142\u00f3w na ten temat. Je\u015bli macie ochot\u0119, abym kontynuowa\u0142 cykl \u201eTermux krok po kroku\u201d, to poni\u017cej jest ankieta, a w komentarzach mo\u017cecie zaproponowa\u0107, o czym jeszcze napisa\u0107.<\/p>\n<p class=\"for_users_only_msg\">Tylko zarejestrowani u\u017cytkownicy mog\u0105 bra\u0107 udzia\u0142 w ankiecie. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Zaloguj si\u0119<\/a><\/noindex>, prosz\u0119.<\/p>\n<h2 class=\"default-block__polling-title\">Kontynuowa\u0107 \u201eTermux krok po kroku\u201d?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Tak<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nie<\/p>\n<\/li>\n<\/ul>\n<p>    G\u0142osowa\u0142o 2 u\u017cytkownik\u00f3w. Nie ma wstrzymuj\u0105cych si\u0119.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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 krok po kroku (Cz\u0119\u015b\u0107 2) | ProHoster","description":"W poprzedniej cz\u0119\u015bci zapoznali\u015bmy si\u0119 z podstawowymi poleceniami Termux'a, skonfigurowali\u015bmy po\u0142\u0105czenie SSH z komputerem, nauczyli\u015bmy si\u0119 tworzy\u0107 aliasy i.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/30531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=30531"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/30531\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/22529"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=30531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=30531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=30531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}