{"id":37019,"date":"2019-10-31T22:15:20","date_gmt":"2019-10-31T19:15:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/sistema-udalennogo-fajlovogo-dostupa-cage\/"},"modified":"2019-10-31T22:15:20","modified_gmt":"2019-10-31T19:15:20","slug":"sistema-udalennogo-fajlovogo-dostupa-cage","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/sistema-udalennogo-fajlovogo-dostupa-cage","title":{"rendered":"Sistema de Acesso Remoto a Arquivos Cage","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h3>Objetivo do sistema<\/h3>\n<p><\/p>\n<p>Suporte ao acesso remoto a arquivos em computadores na rede. O sistema \"virtualmente\" suporta todas as opera\u00e7\u00f5es b\u00e1sicas de arquivos (cria\u00e7\u00e3o, exclus\u00e3o, leitura, grava\u00e7\u00e3o, etc.) atrav\u00e9s da troca de transa\u00e7\u00f5es (mensagens) pelo protocolo TCP.<\/p>\n<p><\/p>\n<h3>\u00c1reas de aplica\u00e7\u00e3o<\/h3>\n<p><\/p>\n<p>O funcionamento do sistema \u00e9 eficaz nas seguintes situa\u00e7\u00f5es:<\/p>\n<ul>\n<li> em aplicativos nativos para dispositivos m\u00f3veis e embutidos (smartphones, sistemas de controle embarcados, etc.), que exigem acesso r\u00e1pido a arquivos em servidores remotos em condi\u00e7\u00f5es de poss\u00edveis interrup\u00e7\u00f5es tempor\u00e1rias de conex\u00e3o (quando saindo do modo offline);<\/li>\n<li> em bancos de dados carregados, se o processamento das solicita\u00e7\u00f5es \u00e9 realizado em servidores, enquanto o armazenamento de dados ocorre em outros;<\/li>\n<li> em redes corporativas distribu\u00eddas para coleta e processamento de informa\u00e7\u00f5es, que exigem alta velocidade na troca de dados, reserva e confiabilidade;<\/li>\n<li> em sistemas complexos com arquitetura de microservi\u00e7os, onde os atrasos na troca de informa\u00e7\u00f5es entre m\u00f3dulos s\u00e3o cr\u00edticos.<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<h3>Estrutura<\/h3>\n<p><\/p>\n<p>O sistema Cage (possui uma implementa\u00e7\u00e3o \u2014 vers\u00e3o beta em Python 3.7 no Windows) inclui duas partes principais: <\/p>\n<ol>\n<li> <b>Cageserver<\/b> \u2014 um programa servidor de arquivos (pacote de fun\u00e7\u00f5es) que \u00e9 executado em computadores na rede, cujos arquivos requerem acesso remoto;<\/li>\n<li> classe <b>Cage<\/b> com uma biblioteca de m\u00e9todos para software cliente, facilitando a codifica\u00e7\u00e3o da intera\u00e7\u00e3o com servidores.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Uso do sistema do lado do cliente<\/h3>\n<p><\/p>\n<p>Os m\u00e9todos da classe Cage substituem opera\u00e7\u00f5es \"rotineiras\" comuns do sistema de arquivos: <i>cria\u00e7\u00e3o, abertura, fechamento, exclus\u00e3o <\/i>de arquivos, bem como <i>leitura\/grava\u00e7\u00e3o de dados em formato bin\u00e1rio<\/i> (indicando a posi\u00e7\u00e3o e o tamanho dos dados). Conceitualmente, esses m\u00e9todos s\u00e3o semelhantes \u00e0s fun\u00e7\u00f5es de arquivo da linguagem C, onde a abertura\/fechamento de arquivos \u00e9 realizada \"em canais\" de entrada\/sa\u00edda. <\/p>\n<p><\/p>\n<p>Em outras palavras, o programador trabalha n\u00e3o com os m\u00e9todos de objetos de \"arquivo\" (classe <b>_io<\/b> em Python), mas sim com os m\u00e9todos da classe Cage.<\/p>\n<p><\/p>\n<p>Ao criar uma inst\u00e2ncia do objeto Cage, ele estabelece a conex\u00e3o inicial com o servidor (ou v\u00e1rios servidores), passa pela autentica\u00e7\u00e3o com o Id do cliente e recebe a confirma\u00e7\u00e3o com o n\u00famero da porta designada para realizar todas as opera\u00e7\u00f5es de arquivo. Ao remover o objeto Cage, ele envia ao servidor um comando para encerrar a conex\u00e3o e fechar os arquivos. A interrup\u00e7\u00e3o da conex\u00e3o pode ser iniciada pelos pr\u00f3prios servidores.<\/p>\n<p><\/p>\n<p>O sistema aumenta o desempenho de leitura\/grava\u00e7\u00e3o com base no armazenamento em cache de fragmentos de arquivos frequentemente utilizados nas aplica\u00e7\u00f5es clientes na mem\u00f3ria RAM.<br \/>\nO software cliente pode utilizar qualquer n\u00famero de objetos Cage com diferentes configura\u00e7\u00f5es (tamanho da mem\u00f3ria cache, tamanho dos blocos na troca com o servidor, etc.). <\/p>\n<p><\/p>\n<p>Um objeto Cage pode trocar dados com v\u00e1rios arquivos em v\u00e1rios servidores. Os par\u00e2metros de conex\u00e3o (endere\u00e7o IP ou DNS do servidor, porta principal para autoriza\u00e7\u00e3o, caminho e nome do arquivo) s\u00e3o definidos na cria\u00e7\u00e3o do objeto.<\/p>\n<p><\/p>\n<p>Como cada objeto Cage pode trabalhar simultaneamente com muitos arquivos, um espa\u00e7o de mem\u00f3ria comum \u00e9 utilizado para o armazenamento em cache. O tamanho do cache - a quantidade de p\u00e1ginas e o seu tamanho - \u00e9 definido dinamicamente na cria\u00e7\u00e3o do objeto Cage. Por exemplo, um cache de 1 GB equivale a 1000 p\u00e1ginas de 1 MB, ou 10.000 p\u00e1ginas de 100 KB, ou 1 milh\u00e3o de p\u00e1ginas de 1 KB. A escolha do tamanho e da quantidade de p\u00e1ginas \u00e9 uma tarefa espec\u00edfica para cada caso de uso.<\/p>\n<p><\/p>\n<p>\u00c9 poss\u00edvel utilizar v\u00e1rios objetos Cage simultaneamente para definir diferentes configura\u00e7\u00f5es de mem\u00f3ria cache, dependendo das caracter\u00edsticas de acesso \u00e0s informa\u00e7\u00f5es em diferentes arquivos. Um algoritmo de buffering simples \u00e9 aplicado como padr\u00e3o: ap\u00f3s o esgotamento da quantidade definida de mem\u00f3ria, novas p\u00e1ginas substituem antigas com base no princ\u00edpio da substitui\u00e7\u00e3o com o m\u00ednimo de acessos. O armazenamento em cache \u00e9 particularmente eficaz em caso de acesso desigual (em um sentido estat\u00edstico), tanto a diferentes arquivos quanto a fragmentos de cada arquivo. <\/p>\n<p><\/p>\n<p>A classe Cage suporta entrada\/sa\u00edda n\u00e3o apenas por endere\u00e7os de dados (especificando a posi\u00e7\u00e3o e o comprimento do array, \"substituindo\" opera\u00e7\u00f5es do sistema de arquivos), mas tamb\u00e9m em um n\u00edvel mais baixo, \"f\u00edsico\" - por n\u00fameros de p\u00e1ginas na mem\u00f3ria cache. <\/p>\n<p><\/p>\n<p>Para os objetos Cage, \u00e9 suportada uma fun\u00e7\u00e3o original <i>\"hiberna\u00e7\u00e3o\"<\/i> (\u00abhiberna\u00e7\u00e3o\u00bb) \u2013 eles podem ser \u00abencerrados\u00bb (por exemplo, em caso de interrup\u00e7\u00e3o da conex\u00e3o com os servidores ou ao parar o aplicativo, etc.) em um arquivo de despejo local do lado do cliente e rapidamente restaurados a partir desse arquivo (ap\u00f3s a restaura\u00e7\u00e3o da conex\u00e3o, ao reiniciar o aplicativo). Isso permite uma redu\u00e7\u00e3o significativa do tr\u00e1fego ao ativar o programa cliente ap\u00f3s uma sa\u00edda tempor\u00e1ria \u00aboffline\u00bb, j\u00e1 que fragmentos frequentemente usados dos arquivos estar\u00e3o em cache.<\/p>\n<p><\/p>\n<p>Cage \u2014 s\u00e3o cerca de 3600 linhas de c\u00f3digo.<\/p>\n<p><\/p>\n<h3>Princ\u00edpios de constru\u00e7\u00e3o de servidores<\/h3>\n<p><\/p>\n<p>Os servidores de arquivo Cageserver podem ser iniciados com um n\u00famero qualquer de portas, uma das quais (\u00abprincipal\u00bb) \u00e9 usada apenas para a autoriza\u00e7\u00e3o de todos os clientes, enquanto as outras s\u00e3o para troca de dados. O programa do servidor Cage requer apenas Python. Paralelamente, o computador com o servidor de arquivos pode realizar qualquer outro trabalho. <\/p>\n<p><\/p>\n<p>O servidor \u00e9 iniciado inicialmente como uma combina\u00e7\u00e3o de dois processos principais:<\/p>\n<ol>\n<li><b>\u00abConex\u00f5es\u00bb<\/b> \u2013 processo para realizar opera\u00e7\u00f5es de estabelecimento e encerramento de conex\u00e3o com os clientes por iniciativa do servidor;<\/li>\n<li><b>\u00abOpera\u00e7\u00f5es\u00bb<\/b> \u2013 processo para realizar tarefas (opera\u00e7\u00f5es) dos clientes relacionadas a arquivos, bem como para fechar sess\u00f5es de conex\u00e3o por comandos dos clientes.<\/li>\n<\/ol>\n<p><\/p>\n<p>Ambos os processos n\u00e3o s\u00e3o sincronizados e s\u00e3o organizados como ciclos infinitos de recebimento e envio de mensagens baseadas em filas multiprocessadas, proxies, sem\u00e1foros e sockets.<br \/>\nO processo \u00abConex\u00f5es\u00bb atribui a cada cliente uma porta para transmiss\u00e3o de dados. O n\u00famero de portas \u00e9 definido ao iniciar o servidor. A correspond\u00eancia entre portas e clientes \u00e9 armazenada na mem\u00f3ria proxy compartilhada entre processos.<\/p>\n<p><\/p>\n<p>O processo \u00abOpera\u00e7\u00f5es\u00bb mant\u00e9m a divis\u00e3o de recursos de arquivos, onde v\u00e1rios clientes diferentes podem ler (<i>quase paralelamente<\/i>, uma vez que o acesso \u00e9 controlado por bloqueios) dados de um \u00fanico arquivo, se isso foi permitido no seu primeiro acesso pelo \u00abprimeiro\u00bb cliente. \n<\/p>\n<p>O processamento de comandos para criar\/excluir\/abrir\/fechar arquivos \u00e9 <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pt\/server\/dts-dronten\/\"   title=\"servidor\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2497\">servidor<\/a> realizado dentro do pr\u00f3prio processo \u00abOpera\u00e7\u00f5es\u00bb de forma estritamente sequencial, utilizando o subsistema de arquivos do sistema operacional do servidor.<\/p>\n<p><\/p>\n<p>Para acelerar a leitura\/grava\u00e7\u00e3o, essas opera\u00e7\u00f5es s\u00e3o realizadas em threads criadas pelo processo \"Opera\u00e7\u00f5es\". O n\u00famero de threads geralmente \u00e9 igual ao n\u00famero de arquivos abertos. As tarefas de leitura\/grava\u00e7\u00e3o dos clientes s\u00e3o enviadas a uma fila geral, e a primeira thread livre pega uma tarefa do in\u00edcio da fila. Uma l\u00f3gica especial permite excluir opera\u00e7\u00f5es de reescrita de dados na mem\u00f3ria RAM do servidor.<\/p>\n<p><\/p>\n<p>O processo \"Opera\u00e7\u00f5es\" monitora a atividade dos clientes e interrompe seu atendimento tanto por seus comandos quanto quando o tempo limite de inatividade \u00e9 excedido.<\/p>\n<p><\/p>\n<p>Para garantir a confiabilidade, o Cageserver mant\u00e9m registros de todas as transa\u00e7\u00f5es. Um registro geral cont\u00e9m c\u00f3pias das mensagens dos clientes com tarefas de criar\/abrir\/renomear\/remover arquivos. Para cada arquivo em uso, \u00e9 criado um registro separado, onde s\u00e3o registradas c\u00f3pias das mensagens com tarefas de leitura e grava\u00e7\u00e3o de dados nesse arquivo, assim como matrizes de dados gravados (novos) e matrizes de dados que foram destru\u00eddos durante a reescrita (grava\u00e7\u00e3o de novos dados \"sobre\" os antigos). <\/p>\n<p><\/p>\n<p>Esses registros permitem tanto a recupera\u00e7\u00e3o de novas altera\u00e7\u00f5es em backups quanto o \"rollback\" do conte\u00fado atual para um momento desejado no passado. <\/p>\n<p><\/p>\n<p>Cageserver consiste em cerca de 3100 linhas de c\u00f3digo.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Sistema de Acesso Remoto a Arquivos Cage\" src=\"\/wp-content\/uploads\/2019\/08\/606d593347d73274b0c172dae34da0d7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>In\u00edcio do programa servidor de arquivos Cageserver<\/h3>\n<p><\/p>\n<p>Ao iniciar, deve-se definir no di\u00e1logo:<br \/>\n \u2014 a porta principal para autoriza\u00e7\u00e3o;<br \/>\n \u2014 o n\u00famero de portas para troca de transa\u00e7\u00f5es com clientes autorizados (de 1 ou mais, o pool de n\u00fameros come\u00e7a a partir do n\u00famero seguinte \u00e0 porta principal).<\/p>\n<p><\/p>\n<h3>Uso da classe Cage<\/h3>\n<p><\/p>\n<p><b>classe<\/b> cage.<b>Cage<\/b>( <i>cage_name=\u00ab\u00bb, pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=\u00ab\u00bb<\/i> )<\/p>\n<p><\/p>\n<p>Objetos s\u00e3o criados a partir dessa classe, que interagem com servidores de arquivos e cont\u00eam mem\u00f3ria buffer.<\/p>\n<p><\/p>\n<p><b><u>Par\u00e2metros<\/u><\/b><\/p>\n<p><\/p>\n<ul>\n<li> <b>cage_name<\/b>(<i>str<\/i>) \u2014 nome condicional do objeto, que \u00e9 usado na identifica\u00e7\u00e3o dos clientes no lado do servidor <\/li>\n<li> <b>pagesize<\/b>(<i>int<\/i>) \u2014 tamanho de uma p\u00e1gina de mem\u00f3ria buffer (em bytes)<\/li>\n<li> <b>numpages<\/b>(<i>int<\/i>) \u2014 n\u00famero de p\u00e1ginas de mem\u00f3ria buffer<\/li>\n<li> <b>maxstrlen<\/b>(<i>int<\/i>) \u2014 comprimento m\u00e1ximo da string em bytes nas opera\u00e7\u00f5es de grava\u00e7\u00e3o e leitura<\/li>\n<li> <b>server_ip<\/b>(<i>dict<\/i>) \u2014 dicion\u00e1rio com os endere\u00e7os utilizados <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pt\/server\/\"   title=\"servidores\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1347\">servidores<\/a>, onde a chave \u00e9 o nome condicional do servidor (id do servidor dentro do aplicativo), e o valor \u00e9 uma string com o endere\u00e7o: \u201cip address:port\u201d ou \u201cDNS:port\u201d (mapeamento de nomes e endere\u00e7os reais \u00e9 tempor\u00e1rio, pode ser alterado)<\/li>\n<li> <b>wait<\/b>(<i>int<\/i>) \u2014 tempo de espera pela resposta do servidor ao receber portas (em seg.)<\/li>\n<li> <b>despertar<\/b>(<i>booleano<\/i>) \u2014 flag do m\u00e9todo de cria\u00e7\u00e3o do objeto (<i>False<\/i> \u2014 se um novo objeto \u00e9 criado, <i>Verdadeiro<\/i> \u2014 se o objeto \u00e9 criado a partir de um anteriormente \u2018suspendido\u2019 \u2014 usando a opera\u00e7\u00e3o \u2018hiberna\u00e7\u00e3o\u2019, por padr\u00e3o Falso)<\/li>\n<li> <b>arquivo_cache<\/b>(<i>str<\/i>) \u2014 nome do arquivo para hiberna\u00e7\u00e3o<\/li>\n<\/ul>\n<p><\/p>\n<p><b><u>M\u00e9todos<\/u><\/b><\/p>\n<p><\/p>\n<p>Cage.<b>criar_arquivo<\/b>( <i>servidor, caminho<\/i> ) \u2013 criar um novo arquivo<\/p>\n<p><\/p>\n<p>Cage.<b>renomear_arquivo<\/b>( <i>servidor, caminho, novo_nome<\/i> ) \u2013 renomear arquivo<\/p>\n<p><\/p>\n<p>Cage.<b>remover_arquivo<\/b>( <i>servidor, caminho<\/i>) \u2013 excluir arquivo<\/p>\n<p><\/p>\n<p>Cage.<b>open<\/b>( <i>servidor, caminho, mod <\/i>) \u2013 abrir arquivo<\/p>\n<p><\/p>\n<p>Retorna <i>fchannel<\/i> n\u00famero do canal. O par\u00e2metro <i>mod<\/i> \u2014 \u00e9 o modo de abertura do arquivo: \u2018wm\u2019 \u2014 monopolizado (leitura\/grava\u00e7\u00e3o), \u2018rs\u2019 \u2014 apenas leitura, e compartilhado apenas para leitura por outros clientes, \u2018ws\u2019 \u2014 leitura\/grava\u00e7\u00e3o, e compartilhado apenas para leitura por outros clientes. <\/p>\n<p><\/p>\n<p>Cage.<b>fechar<\/b> (<i>fchannel<\/i>) \u2013 fechar arquivo<\/p>\n<p><\/p>\n<p>Cage.<b>exit <\/b>(<i>fchannel, begin, dados <\/i>) \u2013 gravar uma string de bytes no arquivo<\/p>\n<p><\/p>\n<p>Cage.<b>write <\/b>(<i>fchannel, begin, len_dados<\/i> ) \u2013 ler uma string de bytes do arquivo<\/p>\n<p><\/p>\n<p>Cage.<b>colocar_p\u00e1ginas <\/b>( <i>fchannel<\/i> ) \u2013 \u2018empurra\u2019 do buffer para o servidor todas as p\u00e1ginas do canal especificado que foram modificadas. Usado nos pontos do algoritmo onde \u00e9 necess\u00e1rio ter certeza de que todas as opera\u00e7\u00f5es no canal est\u00e3o fisicamente salvas no arquivo no servidor.<\/p>\n<p><\/p>\n<p>Cage.<b>push_all<\/b> () \u2013 \u2018empurra\u2019 do buffer para o servidor todas as p\u00e1ginas de todos os canais para a inst\u00e2ncia da classe Cage, que foram modificadas. Usado quando \u00e9 necess\u00e1rio ter certeza de que todas as opera\u00e7\u00f5es em todos os canais est\u00e3o salvas no servidor.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/463085\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0432 \u0441\u0435\u0442\u0438. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u00ab\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u00bb \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u0435\u043d\u0438\u0435, \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0434\u0440.) \u043f\u0443\u0442\u0451\u043c \u043e\u0431\u043c\u0435\u043d\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438 (\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438) \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0422\u0421\u0420. \u041e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445: \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0438 embedded \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (\u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u044b, \u0431\u043e\u0440\u0442\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0442.\u043f.), \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27748,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37019","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=\"\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0432 \u0441\u0435\u0442\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\/sistema-udalennogo-fajlovogo-dostupa-cage\" \/>\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\udd47\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 Cage | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0432 \u0441\u0435\u0442\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/sistema-udalennogo-fajlovogo-dostupa-cage\" \/>\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-31T19:15:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:15:20+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\udd47Sistema de acesso remoto a arquivos Cage | ProHoster","description":"Prop\u00f3sito do sistema Suporte ao acesso remoto a arquivos nos computadores da rede.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/sistema-udalennogo-fajlovogo-dostupa-cage","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\udd47\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 Cage | ProHoster","og:description":"\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0432 \u0441\u0435\u0442\u0438.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/sistema-udalennogo-fajlovogo-dostupa-cage","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-31T19:15:20+00:00","article:modified_time":"2019-10-31T19:15:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37019","title":null,"description":null,"keywords":null,"keyphrases":null,"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-02-09 21:52:49","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:34:26","updated":"2026-02-09 21:52:49","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\/37019","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=37019"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/37019\/revisions"}],"predecessor-version":[{"id":159779,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/37019\/revisions\/159779"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/27748"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=37019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=37019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=37019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}