{"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\/da\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2","title":{"rendered":"Termux trin for trin (Del 2)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444950\/\">den forrige del<\/a><\/noindex> Vi har l\u00e6rt de grundl\u00e6ggende kommandoer i Termux, opsat en SSH-forbindelse til PC'en, l\u00e6rt at oprette aliases og installeret nogle nyttige v\u00e6rkt\u00f8jer. Denne gang skal vi tage et skridt videre, vi skal:<\/p>\n<p><\/p>\n<ul>\n<li>f\u00e5 indsigt i Termux:API<\/li>\n<li>installere Python og nano, samt skrive 'Hello, world!' i Python.<\/li>\n<li>f\u00e5 kendskab til bash-scripts og skrive et script ved hj\u00e6lp af Termux:API<\/li>\n<li>ved hj\u00e6lp af et bash-script, Termux:API og Python skrive et simpelt program <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Da vi nu forst\u00e5r, hvad de indtastede kommandoer g\u00f8r, vil jeg ikke g\u00e5 s\u00e5 grundigt ind i hvert skridt fra nu af, men hvor der m\u00e5tte opst\u00e5 vanskeligheder, vil jeg bestemt give forklaringer.<\/p>\n<p><\/p>\n<p>Jeg bruger ofte aliases, s\u00e5 de forkortelser, der anvendes i denne del, er vist her:<\/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>Planen er klar, lad os komme i gang! Og glem selvf\u00f8lgelig ikke den 'magiske Tab' (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444950\/\">Se Del 1<\/a><\/noindex>).<\/p>\n<p><\/p>\n<h2>Trin 4<\/h2>\n<p><\/p>\n<h3>Dykker ned i Termux:API kaninhullet<\/h3>\n<p><\/p>\n<p><i>API, hvor meget er der ikke i dette ord for kodernes hjerter<\/i><\/p>\n<p><\/p>\n<p>Hvis vi ser bort fra emnet Termux:API, kunne alle vores skridt opsummeres til en simpel gengivelse af en brochure som 'Linux for dummies', som det blev korrekt bem\u00e6rket i kommentarerne til den f\u00f8rste del.<\/p>\n<p><\/p>\n<p>F\u00f8rst skal vi installere Termux:API fra Google Play Butik (det kan v\u00e6re en god id\u00e9 at genstarte Termux efterf\u00f8lgende):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux trin for trin (Del 2)\" src=\"\/wp-content\/uploads\/2019\/03\/415e25a8ddefc5d4f1741c97d742eeb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dern\u00e6st skal vi installere API-pakken i Termux-konsollen:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">updg # Glem ikke aliaserne\napt install termux-api<\/code><\/pre>\n<p><\/p>\n<p>Til eksperimenter bruger jeg Android 5.1.1, for ejere af Android 7 er det n\u00f8dvendigt at \"beskytte\" Termux: API ved at g\u00e5 ind i \u2018Indstillinger\u2019 &gt; \u2018Beskyttede applikationer\u2019, ellers vil API-opkald som <code>termux-battery-status<\/code>, h\u00e6nge. (Se. <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.termux.com\/wiki\/Termux:API\">projektets wiki<\/a><\/noindex>)<\/p>\n<p><\/p>\n<p>Nu er det tid til at l\u00e6re n\u00e6rmere om de opn\u00e5ede funktioner. Den nyeste og mest detaljerede beskrivelse af Termux:API kan findes p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.termux.com\/wiki\/Termux:API\">projektets wiki<\/a><\/noindex>. Jeg vil fors\u00f8ge at v\u00e6lge de mest illustrative og interessante elementer, som g\u00f8r det muligt at f\u00e5 erfaring til selvst\u00e6ndigt arbejde i fremtiden.<\/p>\n<p><\/p>\n<h3>Flere eksempler p\u00e5 Termux:API <\/h3>\n<p><\/p>\n<ul>\n<li>termux-battery-status<br \/>\nReturnerer batteristatus<br \/>\n<img decoding=\"async\" alt=\"Termux trin for trin (Del 2)\" src=\"\/wp-content\/uploads\/2019\/03\/9a5f793d1b028905b3ee9ceab0fbcdec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-brightness<br \/>\nS\u00e6tter sk\u00e6rmens lysstyrke fra 0 til 255<br \/>\n<img decoding=\"async\" alt=\"Termux trin for trin (Del 2)\" src=\"\/wp-content\/uploads\/2019\/03\/23e5f3726607921d7f52d5d0de543968.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-toast<br \/>\nViser en midlertidig pop-up-meddelelse<br \/>\n<img decoding=\"async\" alt=\"Termux trin for trin (Del 2)\" src=\"\/wp-content\/uploads\/2019\/03\/5c75ad9b678773801ea9975b23422384.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-torch<br \/>\nT\u00e6nder lygten<br \/>\n<img decoding=\"async\" alt=\"Termux trin for trin (Del 2)\" src=\"\/wp-content\/uploads\/2019\/03\/7695202f5972e93e5b7a8f4bd952882c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-wifi-scaninfo<br \/>\nReturnerer information om den seneste scanning af Wi-Fi-netv\u00e6rk<br \/>\n<img decoding=\"async\" alt=\"Termux trin for trin (Del 2)\" src=\"\/wp-content\/uploads\/2019\/03\/f10669f8e7dff1046ab4f9b7d68228e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>Det er ikke sv\u00e6rt at se, at de returnerede v\u00e6rdier er strenge, ordb\u00f8ger, lister over ordb\u00f8ger, med andre ord datatyper, som Python h\u00e5ndterer fint, s\u00e5 n\u00e6ste skridt er at installere det.<\/p>\n<p><\/p>\n<h2>Trin 5<\/h2>\n<p><\/p>\n<h3>Vi installerer Python og nano<\/h3>\n<p><\/p>\n<p>For at installere Python skriver vi i terminalen:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">updg\napt install python\napt install python2<\/code><\/pre>\n<p><\/p>\n<p>Nu har vi installeret b\u00e5de Python 2 og 3.<\/p>\n<p><\/p>\n<p>I f\u00e6rd med at skrive artiklen, st\u00f8dte jeg p\u00e5 en anden teksteditor, nano, som jeg fandt mere tiltalende end vim; lad os installere den:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">apt install nano<\/code><\/pre>\n<p><\/p>\n<p>Det er lettere at bruge end vim, og nano har et mere brugervenligt interface. <i>P\u00e5 Android-enheder er vim dog mere praktisk.<\/i><\/p>\n<p><\/p>\n<h3>HelloWorld p\u00e5 Python i Termux<\/h3>\n<p><\/p>\n<p>I det store og hele kunne vi have undg\u00e5et dette punkt, men at installere Python i Termux og ikke skrive HelloWorld ville v\u00e6re en skam.<\/p>\n<p><\/p>\n<p>Jeg har ikke til hensigt at l\u00e6re nogen Python, s\u00e5 dem der ikke ved noget, kan bare kopiere koden (eller begynde at l\u00e6re selv, der er heldigvis masser af litteratur), og de der ved noget kan ogs\u00e5 finde p\u00e5 noget selv. Og jeg vil 'uden videre' ogs\u00e5 vise en metode til at indtaste tekst i terminalen uden en editor.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cat &gt;hello-world.py\n# Hvis man ikke angiver kilden (jeg minder om cat 1.txt &gt; 2.txt)\n# s\u00e5 vil cat tage data fra standard input,\n# sagt p\u00e5 en anden m\u00e5de, det der skrives p\u00e5 tastaturet.\n\nstr = 'Hello, world!' # tildeler variablen str v\u00e6rdien \"Hello, world!\"\nprint (str) # udskriver v\u00e6rdien fra variablen str p\u00e5 sk\u00e6rmen\n\n# Ctrl + D for at afslutte indtastningen og gemme filen (hello-world.py)\n\npy hello-world.py # k\u00f8rer filen (py er et alias for python)<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux trin for trin (Del 2)\" src=\"\/wp-content\/uploads\/2019\/03\/e9086da1ce27f723681f142dad11d878.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvis du under indtastningen ikke bem\u00e6rker en fejl og allerede har trykket Enter, vil du ikke kunne g\u00e5 tilbage til linjen ovenfor; afslut indtastningen ved at trykke Ctrl + D (du kan ogs\u00e5 bare afbryde med Ctrl + Z) og start forfra. Da vi brugte \u2018&gt;\u2019, vil filen blive overskrevet helt. Derfor anbefaler jeg ikke at bruge denne indtastningsmetode, hvis du ikke er sikker p\u00e5 at skrive koden korrekt f\u00f8rste gang.<\/p>\n<p><\/p>\n<h2>Trin 6<\/h2>\n<p><\/p>\n<h3>Bash-scripts<\/h3>\n<p><\/p>\n<p>Bash-scripts er en fremragende m\u00e5de at automatisere arbejdet i terminalen. Et script er en fil med filtypen .sh (filtypen er ikke obligatorisk) indeholdende et s\u00e6t terminalkommandoer, hvoraf nogle vi allerede har l\u00e6rt. Her er <noindex><a rel=\"nofollow\" href=\"https:\/\/tproger.ru\/translations\/bash-cheatsheet\/\">listen over de fleste kommandoer<\/a><\/noindex>, alt b\u00f8r fungere, men v\u00e6r opm\u00e6rksom p\u00e5, at dette er en liste til 'voksen' Linux og ikke til Termux, men bare <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/325522\/\">fantastisk materiale om bash-scripts<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Ved hj\u00e6lp af scripts kan man automatisere stort set alle monotone handlinger. Lad os skrive et simpelt bash-script, der viser v\u00e6rdien fra en variabel, som det selv har oprettet; jeg vil igen bruge cat, men du kan bruge en almindelig teksteditor, og de, der \u00f8nsker at tr\u00e6ne, kan bruge echo.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cat &gt;test.sh\n\nexport str=\"Hej, Habr!\"\n# export opretter variablen str\n# og tildeler den v\u00e6rdien \"Hej, Habr!\"\n# S\u00e6t ikke mellemrum f\u00f8r og efter '='\n\necho $str # For at referere til variabler s\u00e6ttes '$' f\u00f8r dem\n\n# Ctrl + D\n\n# .\\\/test.sh for at k\u00f8re scriptet, men hvis du g\u00f8r det nu, vil der v\u00e6re en fejl\n# For at undg\u00e5 fejlen skal du g\u00f8re test.sh-filen eksekverbar\n\nchmod +x test.sh\n# chmod \u00e6ndrer adgangsrettigheder (+ tilf\u00f8je \/ - fjerne)\n# \u2018+x\u2019 betyder, at vi g\u00f8r filen eksekverbar\n\n.\\\/test.sh # Starter udf\u00f8relsen af vores script<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux trin for trin (Del 2)\" src=\"\/wp-content\/uploads\/2019\/03\/7c56f1aaf938a711f3a30dd3eed3eec7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3>Bash-script med Termux:API<\/h3>\n<p><\/p>\n<p>Lad os skrive noget, der adskiller sig fra de velkendte HelloWorlds, men som er lige s\u00e5 unyttigt. Vores script vil v\u00e6re:<\/p>\n<p><\/p>\n<ol>\n<li>at udf\u00f8re API-anmodningen termux-battery-status<\/li>\n<li>at gemme de modtagne data i filen test.txt<\/li>\n<li>at vise data fra filen p\u00e5 sk\u00e6rmen<\/li>\n<li>at udf\u00f8re det tidligere skrevne program hello-world.py<\/li>\n<li>at skrive de modtagne data fra programmet til filen test.txt<\/li>\n<li>at vise data fra filen p\u00e5 sk\u00e6rmen<\/li>\n<li>at overf\u00f8re data fra filen til udklipsholderen<\/li>\n<li>at vise indholdet af udklipsholderen p\u00e5 sk\u00e6rmen<\/li>\n<li>at vise en pop-op-meddelelse med data fra udklipsholderen<\/li>\n<\/ol>\n<p><\/p>\n<p>F\u00f8rst opretter vi en mappe til arbejdet og kopierer hello-world.py derover som test.py; vi opretter i denne mappe filerne test.sh og 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 opretter filer\n\nchmod +x test.sh<\/code><\/pre>\n<p><\/p>\n<p>Nu skriver vi scriptet til filen test.sh p\u00e5 enhver bekvem m\u00e5de:<\/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>Nu, mens vi er i mappen bashscript, skriver vi <code>.\\\/test.sh<\/code> ser p\u00e5 terminalen p\u00e5 Android-enheden:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux trin for trin (Del 2)\" src=\"\/wp-content\/uploads\/2019\/03\/44c6632c7a3903dad1113017dc81ee61.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5 har vi skrevet det planlagte bash-script. Man kan supplere det med at vise information om udf\u00f8relsen af hver handling i konsollen (ved hj\u00e6lp af echo), det overlader jeg til l\u00e6serne.<\/p>\n<p><\/p>\n<h2>Trin 7<\/h2>\n<p><\/p>\n<h3>Lad os g\u00f8re noget nyttigt<\/h3>\n<p><\/p>\n<p><i>Relativt nyttigt<\/i><\/p>\n<p><\/p>\n<p>Lad os formulere en teknisk specifikation<br \/>\nProgrammet skal efter opstart placere en tilf\u00e6ldig s\u00e6tning fra filen i udklipsholderen og underrette om dette med en pop-op-meddelelse.<\/p>\n<p><\/p>\n<p>Vi tager udgangspunkt i et bash-script; den tilf\u00e6ldige s\u00e6tning fra filen vil vi udtr\u00e6kke ved hj\u00e6lp af en underprogram p\u00e5 Python. Lad os lave en arbejdsplan for scriptet:<\/p>\n<p><\/p>\n<ol>\n<li>K\u00f8re underprogrammet<\/li>\n<li>Overf\u00f8r resultatet af underskudsprogrammet til udklipsholderen<\/li>\n<li>Vis en pop op-besked<\/li>\n<\/ol>\n<p><\/p>\n<p>Lad os bestemme navne til applikationens mapper og filer:<\/p>\n<p><\/p>\n<ul>\n<li>mappen rndstr i hjemmebiblioteket\n<ul>\n<li>source \u2014 filen vi henter strenge fra<\/li>\n<li>rndstr.py \u2014 underskudsprogrammet der viser en tilf\u00e6ldig streng fra filen source i konsollen<\/li>\n<li>rndstr.sh \u2014 skriptfilen<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi opretter applikationens mappe og flytter ind i den for at oprette filerne.<\/p>\n<p><\/p>\n<p>De f\u00f8rste to punkter i skriptplanen kan kombineres i en pipeline, og ved at bruge Termux:API f\u00e5r vi:<\/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>I filen source kan du placere enhver tekst logisk adskilt p\u00e5 linjer, jeg besluttede at placere aforismer:<\/p>\n<p>\n<b class=\"spoiler_title\">Listing af filen source<\/b><\/p>\n<pre><code class=\"plaintext\">\u00c6rlighed er ikke sandhed. L. Lavelle\nHold ud og afhold dig. Epiktet\nKun det, der er uselvisk, er \u00e6del. J. La Bruy\u00e8re\nV\u00e6r fornuftigt modig. B. Graci\u00e1n\nGodhed er bedre end sk\u00f8nhed. G. Heine\nFor store bedrifter er utr\u00e6ttelig vedholdenhed n\u00f8dvendig. F. Voltaire\nHvis du vil have, at andre altid skal tilfredsstille dig, skal du tjene dig selv. B. Franklin\nOverdrevent beskedenhed er ikke andet end skjult stolthed. A. Ch\u00e9nier\nMeget kloge mennesker begynder at blive mist\u00e6nkt, hvis man ser deres forlegenhed. F. Nietzsche\nFattigdom indikerer mangel p\u00e5 midler, ikke mangel p\u00e5 \u00e6re. D. Boccaccio\nMan skal passe p\u00e5 ikke at lade beskedenhed blive til ydmygelse. A. Bakihanov\nDen, der giver afkald p\u00e5 meget, kan tillade sig meget. J. Chardon\nN\u00e5r vi f\u00e5r betalt for en \u00e6del gerning, bliver den taget fra os. N. Chamfort\nDet er ikke skr\u00e6mmende at f\u00e5 ingenting, men det er trist at miste det, man har f\u00e5et. Claudius Aelianus\nDet er lettere at t\u00e5lmodigt udholde det, vi ikke kan \u00e6ndre. Horats\nMan bliver tr\u00e6t af at vente, men hvor meget v\u00e6rre ville det v\u00e6re, hvis der ikke var noget at vente p\u00e5. B. Shaw\nAlt kommer til tiden, hvis folk kan vente. F. Rabelais\nMed vores t\u00e5lmodighed kan vi opn\u00e5 mere end med styrke. E. Burke\nMan m\u00e5 kunne udholde det, man ikke kan undg\u00e5. M. Montaigne\nDen, der er modig i handling, er ikke skr\u00e6mt af ord. Sofokles\nJeg elsker ikke at k\u00e6mpe, jeg elsker at vinde. B. Shaw\nEn jaget og presset kat bliver til en tiger. M. Cervantes\nEn v\u00e6rdig person f\u00f8lger ikke andre menneskers spor. Konfucius\nEt stort sind vil udtrykke sin styrke ikke kun ved at t\u00e6nke, men ogs\u00e5 ved at leve. R. Emerson\n\u00c6re er en ufordelagtig vare. Den er dyr, men sv\u00e6r at bevare. O. Balzac\nBeherskelse og passende samtaler er mere v\u00e6rd end veltalenhed. F. Bacon\nDen, der ikke kan holde mund, kan heller ikke tale. Seneca den Yngre\nGode manerer best\u00e5r af sm\u00e5 ofre. F. Chesterfield\nEn god mand er ikke den, der kan g\u00f8re godt, men den, der ikke kan g\u00f8re ondt. V. Klyuchevsky\nUds\u00e6t ikke uigenkaldelige domme! Augustin\nIntet er for meget! Solon<\/code><\/pre>\n<p><\/p>\n<p>Vi skal oprette et underprogram, der tr\u00e6kker en tilf\u00e6ldig linje fra filen source.<br \/>\nLad os beskrive algoritmen for underprogrammets arbejde:<\/p>\n<p><\/p>\n<ol>\n<li>\u00c5bn filen source<\/li>\n<li>T\u00e6l antallet af linjer i den \u00e5bne fil<\/li>\n<li>Luk filen (der er ikke grund til at holde den \u00e5ben un\u00f8digt)<\/li>\n<li>Generer et tilf\u00e6ldigt heltal inden for antallet af linjer i filen source<\/li>\n<li>\u00c5bn filen source<\/li>\n<li>Udskriver linjen med det genererede nummer<\/li>\n<li>Lukker filen<\/li>\n<\/ol>\n<p><\/p>\n<p>Implementerer algoritmen i Python (jeg skriver til Python 3.7):<\/p>\n<p><\/p>\n<pre><code class=\"python\">import random  #  importerer til generering af tilf\u00e6ldige tal\nimport os  #  til at f\u00e5 stien\n\npath = os.path.abspath(__file__)  #  f\u00e5r den direkte sti til filen rndstr.py\npath = os.path.dirname(path)  #  konverterer til stien til mappen\npath = path + 'source'  #  konverterer til stien til filen source\n\nf = open(path)  #  \u00e5bner filen\ni = 0  #  nulstiller t\u00e6lleren\nfor str in f: i+=1  #  t\u00e6ller linjerne i filen\nf.close  #  lukker filen\n\nj = int(round(i * random.random()))  #  genererer et tilf\u00e6ldigt heltal fra 0 til i\n\nf = open(path)  #  \u00e5bner filen\ni = 0  #  nulstiller t\u00e6lleren\nfor str in f:  #  gennemg\u00e5r linjerne i filen\n    if i == j:  #  hvis linjet\u00e6lleren svarer til det genererede nummer\n        print (str, end='')  #  udskriver linjen uden at g\u00e5 til en ny linje\n        break  #  forlader l\u00f8kken\n    i+=1  #  \u00f8ger t\u00e6lleren med 1\nf.close  #  lukker filen<\/code><\/pre>\n<p><\/p>\n<p>N\u00e5r filerne er oprettet og skrevet, skal du give filen rettigheder til at k\u00f8re <code>rndstr.sh<\/code>, og oprette et alias for hurtig opstart.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">alias rnst=\"~\/rndstr\/rndstr.sh\"<\/code><\/pre>\n<p><\/p>\n<p>Nu kan vi skrive i terminalen <code>rnst<\/code> og f\u00e5 et tilf\u00e6ldigt aforisme i udklipsholderen, som f.eks. kan bruges i korrespondance.<\/p>\n<p><\/p>\n<p>S\u00e5 har vi skrevet noget nyttigt. Relativt nyttigt.<\/p>\n<p><\/p>\n<h3>P.s.<\/h3>\n<p><\/p>\n<p>Jeg undlod bevidst at inkludere sk\u00e6rmbilleder i det sidste trin og gik ikke i dybden med nogle handlinger, men kun beskrevet indholdet af filerne, s\u00e5 l\u00e6serne havde mulighed for at arbejde selvst\u00e6ndigt.<\/p>\n<p><\/p>\n<p>Med dette 'Termux trin for trin', tror jeg, det er v\u00e6rd at afslutte. Dette er selvf\u00f8lgelig kun de allerf\u00f8rste skridt, men nu kan I bev\u00e6ge jer fremad selv.<\/p>\n<p><\/p>\n<p>Oprindeligt planlagde jeg at vise, hvordan man bruger nmap, sqlmap i denne cyklus, men der er allerede mange artikler om emnet uden min hj\u00e6lp. Hvis I har lyst til, at jeg forts\u00e6tter cyklussen 'Termux trin for trin', er der en unders\u00f8gelse nedenfor, og i kommentarer kan I foresl\u00e5, hvad jeg ellers skal skrive om.<\/p>\n<p class=\"for_users_only_msg\">Kun registrerede brugere kan deltage i unders\u00f8gelsen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log ind<\/a><\/noindex>, please.<\/p>\n<h2 class=\"default-block__polling-title\">Vil du forts\u00e6tte 'Termux trin for trin'?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ja<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nej<\/p>\n<\/li>\n<\/ul>\n<p>    To brugere har stemt. Ingen afholdte sig.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 trin for trin (Del 2) | ProHoster","description":"I den tidligere del l\u00e6rte vi grundl\u00e6ggende kommandoer for Termux, opsatte SSH-forbindelse til PC'en, l\u00e6rte at oprette alias'er og.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/30531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=30531"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/30531\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/22529"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=30531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=30531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=30531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}