Arquivos de transferência entre máquinas Linux sobre SSH
Overvisão geral
Por vezes queremos transferir ficheiros de uma máquina Linux para outra de forma segura. Talvez queiramos carregar alguns ficheiros para um servidor de produção ou fazer uma cópia de segurança.
Neste artigo, vamos olhar para diferentes ferramentas para transferir ficheiros entre máquinas Linux sobre ssh, o protocolo mais popular para ligação remota entre máquinas Linux.
Vamos olhar para as duas ferramentas mais populares de transferência de ficheiros: scp e rsync.
Basic Tool Usage
2.1. Um Exemplo Rápido
Vamos imaginar que queremos copiar o ficheiro text.log do nosso sistema local para o caminho /var/log num servidor Linux remoto no endereço IP 111.111.111.111, e queremos usar as credenciais de utilizador root.
Isto pode ser conseguido com scp ou rsync usando a mesma sintaxe básica:
scp text.log :/var/logrsync text.log :/var/log
P>Damos compreender o que estes comandos têm em comum antes de aprendermos as suas variações e diferenças.
2.2. A sintaxe geral
A sintaxe geral para scp ou rsync é:
scp/rsync ]Source_File ]Destination_file
A secção OPÇÃO permite-nos utilizar comutadores de linha de comando para modificar o comportamento da operação de cópia. Os dois caminhos para a origem e destino permitem-nos especificar o caminho para o ficheiro em ambos os lados da operação de cópia, bem como a(s) conta(s) de utilizador a utilizar.
No exemplo acima, o ficheiro local é copiado para um local remoto – . Como veremos mais adiante, podemos utilizar o formato remoto para descrever a fonte ou o alvo, permitindo que estes comandos tanto para carregar ficheiros para um servidor como para descarregar ficheiros de um servidor.
2.3. Coisas importantes a notar
Existem poucos pontos a lembrar quando estamos a transferir ficheiros sobre ssh utilizando qualquer ferramenta:
- O comando scp/rsync pedirá a palavra-passe do utilizador para iniciar sessão no servidor remoto se não tivermos configuração de login automático através da troca de chaves RSA
- Não precisamos de fornecer o nosso nome de utilizador ou IP do servidor para o nosso servidor local
- Podemos fornecer ou um caminho absoluto ou um caminho relativo para o ficheiro de origem/destino, onde os caminhos relativos são relativos ao directório de trabalho actual ou ao directório home do utilizador remoto
2.4. Especificar um nome de ficheiro
Não é obrigatório fornecer um nome de ficheiro no caminho de destino. Se não fornecermos um nome de ficheiro, será utilizado o nome do ficheiro fonte.
No nosso primeiro exemplo, o ficheiro será criado no directório de destino com o nome text.log. Se quiséssemos que o ficheiro fosse armazenado com um nome diferente, poderíamos ter fornecido um nome de ficheiro como parte do caminho de destino.
Utilizando o nome de ficheiro implícito, podemos copiar um ficheiro do servidor remoto Linux para o directório actual com o seu nome original:
scp :/var/log/text.log .rsync :/var/log/text.log .
Aqui, o parâmetro “.” representa o directório de trabalho actual. Podemos também fornecer um caminho diferente se desejar:
scp :/var/log/text.log /opt/path/mytextlog.logrsync :/var/log/text.log /opt/path/mytextlog.log
2.5. Cópia Entre Servidores
Podemos até utilizar estas ferramentas para copiar entre dois servidores remotos. Por exemplo, vamos copiar o ficheiro text.log do servidor 111.111.111.111. para o servidor 222.222.222 para o utilizador raiz:
scp :/var/log/text.log :/var/logrsync :/var/log/text.log :/var/log
Agora que temos uma compreensão básica de scp e rsync, vejamo-los com mais profundidade.
scp (Secure Copy)
scp significa Secure Copy e é utilizado para transferir ficheiros através de uma ligação ssh. É uma cópia em bruto, o que significa que apenas irá ler os dados da pasta de origem e escrevê-los na pasta de destino. Portanto, se estamos à procura de uma cópia rápida que não deve demorar mais do que alguns minutos, então devemos ir para scp.
Se estamos a transferir um ficheiro grande, devemos assegurar-nos de que temos uma ligação estável à Internet. Como o scp não é retomável, o tempo pode ser perdido se a ligação cair durante uma grande transferência, e toda a operação de cópia terá de ser reiniciada.
3.1. Instalação
A maioria das distribuições Linux vêm com o scp pré-instalado. Podemos verificar facilmente se o scp está ou não instalado:
which scp
Veremos o caminho para o comando scp se este já estiver instalado. Uma resposta vazia significa que o scp não está instalado.
Se ainda não o temos, então para instalar o scp, precisamos de instalar o pacote cliente OpenSSH a partir do repositório oficial de pacotes:
sudo apt-get install openssh-clients # For Debian based systems like Ubuntu sudo yum install openssh-clients # For Red Hat based systems like CentOS and Fedora
P>Vamos passar por alguns cenários comuns para usar o scp.
3.2. Transferir Ficheiros Múltiplos
Podemos fornecer uma lista de ficheiros separados por espaço para transferir ficheiros múltiplos:
scp text.log text1.log text2.log :/var/log
Podemos também usar a opção -r para copiar recursivamente todo o directório. Por exemplo, para copiar todos os ficheiros do directório /home/app/log/:
scp -r /home/app/log :/var/log
Podemos usar * para enviar ficheiros que correspondam a um determinado padrão de nomenclatura. Por exemplo, temos quatro ficheiros text.log, text2.log, app.log, e app2.log, e queremos enviar apenas ficheiros começando por app:
scp /home/app/log/app* :/var/log
3.3. Transferir ficheiros usando ficheiros de identidade
A autenticação baseada em chaves é preferida na maioria das distribuições Linux. No comando scp, podemos especificar o ficheiro de identidade usando a opção -i:
scp -i key.pem text.log :/var/log
Muitos administradores de sistema usam autenticação baseada em chaves para transferir ficheiros uma vez que não requer as credenciais do utilizador em cada transferência.
3.4. Compressão On-the-Fly
Podemos reduzir o tempo de transferência usando compressão on-the-fly com a opção -C. Isto irá comprimir e descomprimir o ficheiro na fonte e caminhos de destino respectivamente:
scp -C text.log :/var/log
3.5. Largura de banda limite durante a transferência
Podemos especificar a largura de banda em Kbit/s com a opção -l:
scp -l 500 text.log :/var/log
3.6. Modo verbose para depuração
Podemos activar o modo verbose com a opção -v:
scp -v text.log :/var/log
A saída pareceria algo como:
Executing: program /usr/bin/ssh host prod-reporting-b, user jain, command scp -v -t /tmp OpenSSH_7.9p1, LibreSSL 2.7.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 48: Applying options for * debug1: Connecting to prod-reporting-b port 22. debug1: Connection established. ------ Transferred: sent 2856, received 2932 bytes, in 2.1 seconds Bytes per second: sent 1366.8, received 1403.1 debug1: Exit status 0
A saída Verbose (depuração) imprime os passos exactos que o scp está a executar, o que é útil para depurar ligações, autenticação, e problemas de configuração.
rsync (Sincronização remota)
rsync é rápido e versátil. É bom para sincronizar e transferir ficheiros de forma inteligente, porque mantém o registo da quantidade de dados copiados e da quantidade restante.
Devemos usar o rsync quando temos grandes ficheiros para transferir – mesmo que haja problemas de ligação à rede, os dados copiados até esse ponto não serão perdidos, e quando a ligação for restabelecida, a cópia será retomada a partir desse ponto.
rsync é mais rápido do que o comando scp quando temos de transferir o mesmo ficheiro várias vezes, uma vez que utiliza um protocolo de actualização remota, o que permite transferir apenas as diferenças entre dois conjuntos de ficheiros.
4.1. Instalação
Vamos verificar se o rsync está instalado invocando-o para mostrar a sua versão:
rsync --version
Se obtivermos um erro, então podemos instalá-lo:
sudo apt-get install rsync # For Debian based systems like Ubuntu sudo yum install rsync # For Red Hat based systems like CentOS and Fedora
Vamos passar por alguns cenários comuns onde podemos utilizar o rsync.
4.2. Faça uma Dry Run
Desde que o rsync seja tão potente, pode ser perigoso utilizá-lo sem verificar o que está prestes a fazer. Felizmente, o rsync fornece a opção -dry-run, que realiza uma execução experimental sem realmente transferir ficheiros:
rsync --dry-run text.log :/var/log
4.3. Copy Attributes and Metadata
rsync fornece a opção -a, que copia ligações simbólicas, tempos de modificação, grupo, propriedade, e permissões juntamente com o conteúdo do ficheiro.
Outra opção importante é -h, que imprimirá a saída de uma forma legível por humanos. Isto pode ser especialmente útil ao correr juntamente com a opção -dry-run:
rsync -ah --dry-run text.log :/var/log
4.4. Transferir ficheiros múltiplos num directório
Podemos fornecer uma lista de ficheiros separados por um espaço para transferir ficheiros múltiplos:
rsync text.log text1.log text2.log :/var/log
A opção -r copia recursivamente todos os ficheiros dentro do directório:
rsync -r /home/app/log :/var/log
O operador * envia ficheiros correspondentes a um determinado padrão:
rsync /home/app/log/app* :/var/log
Podemos usar a opção -include e a opção -exclude para incluir e excluir ficheiros da lista de ficheiros dentro do directório. Por exemplo, para enviar todos os ficheiros de um directório excluindo os que começam com ‘R’:
rsync --include '*' --exclude 'R*' text.log :/urs/log
4.5. On-The-Fly Compression
Podemos reduzir o tempo de transferência usando a compressão on-the-fly com a opção -z. Isto irá comprimir e descomprimir o ficheiro na fonte e caminhos de destino respectivamente:
rsync -z text.log :/var/log
4.6. Apagar ficheiros existentes no caminho de destino antes da transferência
A opção -delete apaga ficheiros existentes do destino antes de transferir novos ficheiros:
rsync --delete text.log :/var/log
4.7. Remove automaticamente os ficheiros de origem após a transferência
Vamos dizer que queremos levar um backup dos registos do servidor de produção para um servidor de backup. Neste cenário, gostaríamos provavelmente de remover ficheiros do servidor de produção depois de transferir todos os ficheiros para o nosso servidor de backup.
servidor de backup fornece a opção -remove-source-files para remover ficheiros-fonte após a transferência estar completa:
rsync --remove-source-files text.log :/var/log
Qual a ferramenta a escolher?
Podemos usar ambas estas ferramentas para transferir ficheiros entre máquinas Linux. Contudo, devemos considerar o scp quando o tamanho do ficheiro é pequeno – é uma ferramenta de cópia simples e está amplamente disponível. No nosso uso quotidiano, o scp é a escolha fácil para transferências pequenas e pontuais.
Beneficiaríamos mais da rsync quando o tamanho do ficheiro é grande ou quando precisamos de sincronização mais complexa e eficiente. É também a melhor escolha para tarefas recorrentes como cron jobs e scripts.
Conclusion
Neste artigo, analisámos duas ferramentas de transferência de ficheiros: scp e rsync.
Analisámos também as diferenças entre elas, e que ferramentas correspondem a certos casos de utilização.