{"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\/pt\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2","title":{"rendered":"Termux passo a passo (Parte 2)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Em <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444950\/\">parte anterior<\/a><\/noindex> N\u00f3s conhecemos os comandos b\u00e1sicos do Termux, configuramos a conex\u00e3o SSH com o PC, aprendemos a criar aliases e instalamos algumas utilidades \u00fateis. Desta vez, vamos avan\u00e7ar ainda mais, e faremos o seguinte:<\/p>\n<p><\/p>\n<ul>\n<li>aprender sobre Termux:API<\/li>\n<li>vamos instalar Python e nano, al\u00e9m de escrever 'Hello, world!' em Python.<\/li>\n<li>aprender sobre scripts bash e escrever um script utilizando Termux:API<\/li>\n<li>usando um script bash, Termux:API e Python, escreveremos um programa simples <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Agora que entendemos o que os comandos inseridos fazem, a partir deste passo, n\u00e3o explicarei cada a\u00e7\u00e3o em detalhes, mas onde houver d\u00favidas, eu explicarei com certeza.<\/p>\n<p><\/p>\n<p>Eu uso frequentemente aliases, portanto, os atalhos usados nesta parte est\u00e3o listados aqui:<\/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>O plano est\u00e1 pronto, podemos come\u00e7ar! E claro, n\u00e3o se esque\u00e7am do 'm\u00e1gico Tab' (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444950\/\">Ver Parte 1<\/a><\/noindex>).<\/p>\n<p><\/p>\n<h2>Passo 4<\/h2>\n<p><\/p>\n<h3>Mergulhando na toca do coelho Termux:API<\/h3>\n<p><\/p>\n<p><i>API, qu\u00e3o profundo \u00e9 este termo para o cora\u00e7\u00e3o de um programador<\/i><\/p>\n<p><\/p>\n<p>Se n\u00e3o considerarmos o Termux:API, todas as nossas etapas poderiam ser resumidas a um simples resumo de algum folheto tipo 'Linux para iniciantes', como foi devidamente apontado nos coment\u00e1rios da primeira parte.<\/p>\n<p><\/p>\n<p>Para come\u00e7ar, vamos instalar o Termux:API da Google Play Store (depois, ser\u00e1 bom reiniciar o Termux):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux passo a passo (Parte 2)\" src=\"\/wp-content\/uploads\/2019\/03\/415e25a8ddefc5d4f1741c97d742eeb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Em seguida, precisamos instalar o pacote API no console do Termux:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">updg # N\u00e3o se esque\u00e7a dos aliases\napt install termux-api<\/code><\/pre>\n<p><\/p>\n<p>Para experimentos, estou usando Android 5.1.1; os propriet\u00e1rios do Android 7 precisam \"proteger\" o Termux: API, indo em 'Configura\u00e7\u00f5es' &gt; 'Aplicativos protegidos', caso contr\u00e1rio, chamadas de API, como <code>termux-battery-status<\/code>, ficar\u00e3o travadas. (Veja <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.termux.com\/wiki\/Termux:API\">wiki do projeto<\/a><\/noindex>)<\/p>\n<p><\/p>\n<p>Agora \u00e9 hora de nos familiarizarmos mais de perto com as novas funcionalidades adquiridas. A descri\u00e7\u00e3o mais recente e detalhada do Termux:API pode ser encontrada em <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.termux.com\/wiki\/Termux:API\">wiki do projeto<\/a><\/noindex>. Tentarei selecionar as partes mais ilustrativas e interessantes, que permitir\u00e3o adquirir pr\u00e1tica para trabalhos independentes no futuro.<\/p>\n<p><\/p>\n<h3>Alguns exemplos do Termux:API <\/h3>\n<p><\/p>\n<ul>\n<li>termux-battery-status<br \/>\nRetorna o estado da bateria<br \/>\n<img decoding=\"async\" alt=\"Termux passo a passo (Parte 2)\" src=\"\/wp-content\/uploads\/2019\/03\/9a5f793d1b028905b3ee9ceab0fbcdec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-brightness<br \/>\nDefine o brilho da tela de 0 a 255<br \/>\n<img decoding=\"async\" alt=\"Termux passo a passo (Parte 2)\" src=\"\/wp-content\/uploads\/2019\/03\/23e5f3726607921d7f52d5d0de543968.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-toast<br \/>\nMostra uma notifica\u00e7\u00e3o tempor\u00e1ria<br \/>\n<img decoding=\"async\" alt=\"Termux passo a passo (Parte 2)\" src=\"\/wp-content\/uploads\/2019\/03\/5c75ad9b678773801ea9975b23422384.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-torch<br \/>\nLiga a lanterna<br \/>\n<img decoding=\"async\" alt=\"Termux passo a passo (Parte 2)\" src=\"\/wp-content\/uploads\/2019\/03\/7695202f5972e93e5b7a8f4bd952882c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>termux-wifi-scaninfo<br \/>\nRetorna informa\u00e7\u00f5es sobre a \u00faltima varredura das redes Wi-Fi<br \/>\n<img decoding=\"async\" alt=\"Termux passo a passo (Parte 2)\" src=\"\/wp-content\/uploads\/2019\/03\/f10669f8e7dff1046ab4f9b7d68228e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>N\u00e3o \u00e9 dif\u00edcil perceber que os valores retornados s\u00e3o strings, dicion\u00e1rios, listas de dicion\u00e1rios, ou seja, tipos de dados com os quais o Python trabalha muito bem, portanto, o pr\u00f3ximo passo \u00e9 instal\u00e1-lo.<\/p>\n<p><\/p>\n<h2>Passo 5<\/h2>\n<p><\/p>\n<h3>Instalaremos Python e nano<\/h3>\n<p><\/p>\n<p>Para instalar o Python, escreva no terminal:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">updg\napt install python\napt install python2<\/code><\/pre>\n<p><\/p>\n<p>Agora temos o Python 2 e 3 instalados.<\/p>\n<p><\/p>\n<p>Durante o trabalho neste artigo, descobri outro editor de texto, o nano, que me agradou mais do que o vim, vamos instal\u00e1-lo:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">apt install nano<\/code><\/pre>\n<p><\/p>\n<p>Us\u00e1-lo \u00e9 mais f\u00e1cil do que usar o vim, e o nano tem uma interface mais amig\u00e1vel. <i>Em um dispositivo Android, o vim ainda \u00e9 mais conveniente.<\/i><\/p>\n<p><\/p>\n<h3>Hello World em Python no Termux<\/h3>\n<p><\/p>\n<p>Em grande parte, poder\u00edamos ter pulado este ponto, mas instalar o Python no Termux e n\u00e3o escrever um Hello World, na minha opini\u00e3o, \u00e9 inaceit\u00e1vel.<\/p>\n<p><\/p>\n<p>N\u00e3o tenho como objetivo ensinar ningu\u00e9m a programar em Python, ent\u00e3o aqueles que n\u00e3o sabem podem simplesmente copiar o c\u00f3digo (ou come\u00e7ar a estudar por conta pr\u00f3pria, felizmente h\u00e1 bastante literatura), e aqueles que j\u00e1 sabem podem criar algo por conta pr\u00f3pria. E eu, 'aproveitando a deixa', ainda mostrarei como inserir texto no terminal sem um editor.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cat &gt;hello-world.py     \n# Se n\u00e3o especificar a fonte (lembro que cat 1.txt &gt; 2.txt)\n# o cat pegar\u00e1 dados do fluxo de entrada padr\u00e3o,\n# em outras palavras, do que \u00e9 digitado no teclado.\n\nstr = 'Hello, world!' # atribuimos \u00e0 vari\u00e1vel str o valor \"Hello, world!\"\nprint (str) # exibimos no console o valor da vari\u00e1vel str\n\n# Ctrl + D para finalizar a entrada e gravar o arquivo (hello-world.py)\n\npy hello-world.py # executamos o arquivo (py \u00e9 um alias para python)<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux passo a passo (Parte 2)\" src=\"\/wp-content\/uploads\/2019\/03\/e9086da1ce27f723681f142dad11d878.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se durante a entrada voc\u00ea n\u00e3o notar um erro e j\u00e1 pressionar Enter, n\u00e3o poder\u00e1 voltar para a linha anterior, para isso finalize a entrada pressionando Ctrl + D (pode at\u00e9 cancelar com Ctrl + Z) e repita tudo do come\u00e7o. Como usamos \u2018&gt;\u2019, o arquivo ser\u00e1 completamente sobrescrito. Por essa raz\u00e3o, n\u00e3o recomendo usar esse m\u00e9todo de entrada se voc\u00ea n\u00e3o tiver certeza de que escrever\u00e1 o c\u00f3digo de uma s\u00f3 vez, sem erros.<\/p>\n<p><\/p>\n<h2>Passo 6<\/h2>\n<p><\/p>\n<h3>Scripts Bash<\/h3>\n<p><\/p>\n<p>Scripts Bash s\u00e3o uma \u00f3tima maneira de automatizar o trabalho com o terminal. Um script \u00e9 um arquivo com a extens\u00e3o .sh (a extens\u00e3o n\u00e3o \u00e9 obrigat\u00f3ria) que cont\u00e9m um conjunto de comandos do terminal, alguns dos quais j\u00e1 estudamos. Aqui est\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/tproger.ru\/translations\/bash-cheatsheet\/\">uma lista da maioria dos comandos<\/a><\/noindex>, tudo deve funcionar, mas observe que esta \u00e9 uma lista para 'Linux para adultos', e n\u00e3o para o Termux, mas simplesmente <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/325522\/\">material incr\u00edvel sobre scripts bash<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Com scripts, \u00e9 poss\u00edvel automatizar praticamente todas as a\u00e7\u00f5es mon\u00f3tonas. Vamos escrever um simples script bash que exibe o valor de uma vari\u00e1vel criada por ele mesmo; usarei o cat, mas voc\u00ea pode usar um editor de texto normal, e aqueles que desejam treinar podem usar o echo.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cat &gt;test.sh\n\nexport str=\"Ol\u00e1, Habr!\"\n# export cria a vari\u00e1vel str\n# e atribui a ela o valor \"Ol\u00e1, Habr!\"\n# N\u00e3o coloque espa\u00e7os antes e depois de \u2018=\u2019\n\necho $str # Para acessar vari\u00e1veis, coloca-se \u2018$\u2019 antes delas\n\n# Ctrl + D\n\n# .\/test.sh para executar o script, mas se voc\u00ea fizer isso agora, haver\u00e1 um erro\n# para evitar o erro, \u00e9 preciso tornar o arquivo test.sh execut\u00e1vel\n\nchmod +x test.sh\n# chmod altera as permiss\u00f5es (+ adicionar \/ - remover)\n# \u2018+x\u2019 significa que estamos tornando o arquivo execut\u00e1vel\n\n.\/test.sh # Executamos nosso script<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux passo a passo (Parte 2)\" src=\"\/wp-content\/uploads\/2019\/03\/7c56f1aaf938a711f3a30dd3eed3eec7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3>Script Bash com Termux:API<\/h3>\n<p><\/p>\n<p>Vamos escrever algo que se distinga dos clich\u00eas de HelloWorld, mas que seja igualmente in\u00fatil. Nosso script ir\u00e1:<\/p>\n<p><\/p>\n<ol>\n<li>executar a solicita\u00e7\u00e3o API termux-battery-status<\/li>\n<li>salvar os dados obtidos no arquivo test.txt<\/li>\n<li>exibir os dados do arquivo na tela<\/li>\n<li>executar o programa hello-world.py que foi escrito anteriormente<\/li>\n<li>salvar os dados do programa no arquivo test.txt<\/li>\n<li>exibir os dados do arquivo na tela<\/li>\n<li>copiar os dados do arquivo para a \u00e1rea de transfer\u00eancia<\/li>\n<li>exibir o conte\u00fado da \u00e1rea de transfer\u00eancia na tela<\/li>\n<li>mostrar uma mensagem pop-up com os dados da \u00e1rea de transfer\u00eancia<\/li>\n<\/ol>\n<p><\/p>\n<p>Primeiro, vamos criar uma pasta para trabalhar e copiar hello-world.py para l\u00e1 como test.py, em seguida, vamos criar os arquivos test.sh e test.txt nessa pasta:<\/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 cria arquivos\n\nchmod +x test.sh<\/code><\/pre>\n<p><\/p>\n<p>Agora, de qualquer forma conveniente, vamos gravar o script no arquivo 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>Agora, estando na pasta bashscript, escrevemos <code>.\/test.sh<\/code> observamos no terminal do dispositivo Android:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Termux passo a passo (Parte 2)\" src=\"\/wp-content\/uploads\/2019\/03\/44c6632c7a3903dad1113017dc81ee61.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Finalmente, escrevemos o script bash planejado. Podemos adicionar \u00e0 sua sa\u00edda informa\u00e7\u00f5es sobre a execu\u00e7\u00e3o de cada a\u00e7\u00e3o (usando echo), deixo isso para os leitores.<\/p>\n<p><\/p>\n<h2>Passo 7<\/h2>\n<p><\/p>\n<h3>Vamos fazer algo \u00fatil<\/h3>\n<p><\/p>\n<p><i>Relativamente \u00fatil<\/i><\/p>\n<p><\/p>\n<p>Vamos formular as especifica\u00e7\u00f5es<br \/>\nO aplicativo deve, ap\u00f3s o lan\u00e7amento, colocar uma string aleat\u00f3ria de um arquivo na \u00e1rea de transfer\u00eancia e notificar sobre isso com uma mensagem pop-up.<\/p>\n<p><\/p>\n<p>Vamos usar um script bash como base e vamos extrair uma string aleat\u00f3ria de um arquivo usando um subprograma em Python. Vamos elaborar um plano de trabalho para o script:<\/p>\n<p><\/p>\n<ol>\n<li>Executar o subprograma<\/li>\n<li>Copiar o resultado da sub-rotina para a \u00e1rea de transfer\u00eancia<\/li>\n<li>Mostrar uma mensagem pop-up<\/li>\n<\/ol>\n<p><\/p>\n<p>Vamos definir os nomes do diret\u00f3rio e dos arquivos do aplicativo:<\/p>\n<p><\/p>\n<ul>\n<li>pasta rndstr no diret\u00f3rio inicial\n<ul>\n<li>source \u2014 arquivo do qual vamos pegar as linhas<\/li>\n<li>rndstr.py \u2014 sub-rotina que exibe uma linha aleat\u00f3ria do arquivo source no console<\/li>\n<li>rndstr.sh \u2014 arquivo de script<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Criamos o diret\u00f3rio do aplicativo e, ao nos movermos para ele, criamos os arquivos l\u00e1.<\/p>\n<p><\/p>\n<p>Os dois primeiros itens do plano do script podem ser combinados em um pipeline, assim, usando Termux:API, obtemos:<\/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>No arquivo source, voc\u00ea pode colocar qualquer texto logicamente dividido em linhas; decidi inserir aforismos:<\/p>\n<p>\n<b class=\"spoiler_title\">Listagem do arquivo source<\/b><\/p>\n<pre><code class=\"plaintext\">A sinceridade n\u00e3o \u00e9 a verdade. L. Lavelle\nSuporte e abstenha-se. Epicteto\nS\u00f3 \u00e9 nobre o que \u00e9 desinteressado. J. La Bruy\u00e8re\nSeja cautelosamente corajoso. B. Graci\u00e1n\nA bondade \u00e9 melhor do que a beleza. H. Heine\nPara grandes feitos, \u00e9 necess\u00e1rio um inconformado persist\u00eancia. F. Voltaire\nSe voc\u00ea quer agradar sempre, sirva a si mesmo. B. Franklin\nA excessiva mod\u00e9stia n\u00e3o \u00e9 nada al\u00e9m de orgulho oculto. A. Chenier\nPessoas muito inteligentes come\u00e7am a n\u00e3o ser confi\u00e1veis quando mostram embara\u00e7o. F. Nietzsche\nA pobreza indica a falta de recursos, n\u00e3o a falta de nobreza. D. Boccaccio\n\u00c9 preciso ter cuidado para n\u00e3o levar a mod\u00e9stia ao ponto de humilha\u00e7\u00e3o. A. Bakihanov\nQuem renuncia a muito, pode se permitir muito. J. Chardon\nQuando somos pagos por um ato nobre, ele nos \u00e9 tirado. N. Chamfort\nN\u00e3o conseguir nada n\u00e3o \u00e9 terr\u00edvel, mas perder o que se conseguiu \u00e9 decepcionante. Cl\u00e1udio Eliano\n\u00c9 mais f\u00e1cil suportar pacientemente o que n\u00e3o podemos corrigir. Hor\u00e1cio\nVoc\u00ea se cansa de esperar, mas o que seria pior \u00e9 se n\u00e3o houvesse nada para esperar. B. Shaw\nTudo chega a seu tempo, se as pessoas sabem esperar. F. Rabelais\nCom nossa paci\u00eancia, podemos alcan\u00e7ar mais do que com a for\u00e7a. E. Burke\n\u00c9 preciso saber suportar o que n\u00e3o se pode evitar. M. Montaigne\nQuem \u00e9 corajoso nos neg\u00f3cios, n\u00e3o teme as palavras. S\u00f3focles\nEu n\u00e3o gosto de lutar, eu gosto de vencer. B. Shaw\nUm gato acuado e encurralado se transforma em tigre. M. Cervantes\nUma pessoa digna n\u00e3o segue os passos de outras. Conf\u00facio\nUma grande mente mostrar\u00e1 sua for\u00e7a n\u00e3o apenas na capacidade de pensar, mas tamb\u00e9m na de viver. R. Emerson\nA fama \u00e9 uma mercadoria pouco vantajosa. Custa caro e se conserva mal. O. Balzac\nModera\u00e7\u00e3o e adequa\u00e7\u00e3o nas conversas valem mais do que a eloqu\u00eancia. F. Bacon\nQuem n\u00e3o sabe calar, tamb\u00e9m n\u00e3o sabe falar. S\u00eaneca, o Jovem\nBoas maneiras consistem em pequenas ren\u00fancias. F. Chesterfield\nUm bom homem n\u00e3o \u00e9 aquele que sabe fazer o bem, mas aquele que n\u00e3o sabe fazer o mal. V. Kliuchevsky\nN\u00e3o emita ju\u00edzos irrevog\u00e1veis! Agostinho\nNada demais! Solon<\/code><\/pre>\n<p><\/p>\n<p>Ainda precisamos criar um subprograma que extraia uma linha aleat\u00f3ria do arquivo source.<br \/>\nVamos descrever o algoritmo de funcionamento do subprograma:<\/p>\n<p><\/p>\n<ol>\n<li>Abrimos o arquivo source<\/li>\n<li>Contamos o n\u00famero de linhas no arquivo aberto<\/li>\n<li>Fechamos o arquivo (n\u00e3o faz sentido deix\u00e1-lo aberto desnecessariamente)<\/li>\n<li>Geramos um n\u00famero inteiro aleat\u00f3rio dentro do n\u00famero de linhas do arquivo source<\/li>\n<li>Abrimos o arquivo source<\/li>\n<li>Exibimos a linha correspondente ao n\u00famero gerado<\/li>\n<li>Fechamos o arquivo<\/li>\n<\/ol>\n<p><\/p>\n<p>Implementamos o algoritmo em Python (estou escrevendo para Python 3.7):<\/p>\n<p><\/p>\n<pre><code class=\"python\">import random  # importamos para gerar n\u00fameros aleat\u00f3rios\nimport os  # para obter o caminho\n\npath = os.path.abspath(__file__)  # obtemos o caminho direto at\u00e9 o arquivo rndstr.py\npath = os.path.dirname(path)  # transformamos no caminho at\u00e9 o diret\u00f3rio\npath = path  + 'source'  # transformamos no caminho at\u00e9 o arquivo source\n\nf = open(path)  # abrimos o arquivo\ni = 0  # zeramos o contador\nfor str in f: i+=1  # contamos as linhas do arquivo\nf.close  # fechamos o arquivo\n\nj = int(round(i * random.random()))  # geramos um n\u00famero inteiro aleat\u00f3rio de 0 a i\n\nf = open(path)  # abrimos o arquivo\ni = 0  # zeramos o contador\nfor str in f:  # percorremos as linhas do arquivo\n    if i == j:  # se o contador de linhas for igual ao n\u00famero gerado\n        print(str, end='')  # exibimos a linha sem pular linha\n        break  # sa\u00edmos do loop\n    i+=1  # aumentamos o contador em 1\nf.close  # fechamos o arquivo<\/code><\/pre>\n<p><\/p>\n<p>Ap\u00f3s os arquivos serem criados e gravados, \u00e9 necess\u00e1rio conceder permiss\u00f5es de execu\u00e7\u00e3o ao arquivo <code>rndstr.sh<\/code>, e criar um alias para um acesso r\u00e1pido.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">alias rnst=\"~\/rndstr\/rndstr.sh\"<\/code><\/pre>\n<p><\/p>\n<p>Agora, ao digitar no terminal <code>rnst<\/code> teremos um aforismo aleat\u00f3rio na \u00e1rea de transfer\u00eancia, que, por exemplo, pode ser usado em conversas.<\/p>\n<p><\/p>\n<p>Assim, escrevemos algo \u00fatil. Relativamente \u00fatil.<\/p>\n<p><\/p>\n<h3>P.S.<\/h3>\n<p><\/p>\n<p>Propositalmente, no \u00faltimo passo n\u00e3o coloquei capturas de tela e n\u00e3o detalhei algumas a\u00e7\u00f5es, apenas descrevi o conte\u00fado dos arquivos, para que os leitores pudessem trabalhar por conta pr\u00f3pria.<\/p>\n<p><\/p>\n<p>Com isso, penso que o 'Termux passo a passo' deve chegar ao fim. Claro que estes s\u00e3o apenas os primeiros passos, mas agora voc\u00eas podem seguir adiante sozinhos.<\/p>\n<p><\/p>\n<p>Inicialmente, eu planejava mostrar neste ciclo como usar nmap, sqlmap, mas j\u00e1 existem muitos artigos sobre esse tema. Se houver interesse em que eu continue o ciclo 'Termux passo a passo', h\u00e1 uma enquete abaixo e nos coment\u00e1rios voc\u00eas podem sugerir sobre o que mais escrever.<\/p>\n<p class=\"for_users_only_msg\">Apenas usu\u00e1rios registrados podem participar da pesquisa. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Entre<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">Continuar com \u201cTermux passo a passo\u201d?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Sim<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    N\u00e3o<\/p>\n<\/li>\n<\/ul>\n<p>    2 usu\u00e1rios votaram. N\u00e3o houve absten\u00e7\u00f5es.<br \/>\n<br \/>Fonte: <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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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 passo a passo (Parte 2) | ProHoster","description":"Na parte anterior, nos familiarizamos com os comandos b\u00e1sicos do Termux, configuramos a conex\u00e3o SSH com o PC, aprendemos a criar aliases e.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/termux-shag-za-shagom-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/30531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=30531"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/30531\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/22529"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=30531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=30531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=30531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}