Linux Kung Fu: gerenciamento conveniente de arquivos por SSH

Se você tem mais de um computador Linux, provavelmente o usa o tempo todo ssh. É uma ótima ferramenta, mas um detalhe sempre me pareceu estranho. Apesar do fato de que as conexões ssh permitem a transferência de arquivos usando scpe sftp, não temos a capacidade de mover arquivos entre os sistemas local e remoto sem executar o programa no host local ou sem nos conectarmos à máquina local do remoto.







Este último é um problema real, uma vez que os servidores muitas vezes são conectados enquanto estão atrás de um firewall ou de um roteador NAT, ou seja, sem um endereço IP permanente. Com isso, o servidor, em qualquer caso, não poderá se conectar ao sistema local a partir do qual foi acessado anteriormente. Se em uma sessão ssh você pudesse apenas pegar um arquivo local ou remoto e transferi-lo para onde você precisar, seria muito conveniente.



Na verdade, não consegui atingir esse objetivo, mas cheguei muito perto de alcançá-lo. Neste artigo, falarei sobre um script que permite montar diretórios remotos em seu computador local. Na máquina local, você precisará instalarsshfs, mas em um local remoto onde não seja possível instalar programas, você não precisará alterar nada. Se você gastar algum tempo configurando sistemas, e se houver um servidor ssh funcionando no computador cliente, você também pode montar diretórios locais em sistemas remotos. Você não precisa se preocupar em bloquear endereços IP ou portas. Na verdade, se você conseguir se conectar a uma máquina remota, isso significa que você terá sucesso no que quero falar.



Como resultado, se tudo isso for combinado, descobri que estou muito perto da meta. Posso trabalhar com um shell de comando no cliente ou no servidor e ter a capacidade de ler e gravar arquivos convenientemente em ambos os lados da conexão. Para fazer isso, você só precisa configurar tudo corretamente.



Existe um problema aqui?



Talvez você decida que existe algum tipo de problema. Afinal, estamos, de fato, falando sobre o uso de duas conexões ssh. Um é usado para montar o sistema de arquivos e o outro é usado para fazer login no computador. E isso, de fato, é o caso. Mas, se configurada corretamente ssh, a autenticação precisará ser realizada apenas uma vez, sem gastar muito tempo organizando duas conexões.



Além disso, o trabalho é muito facilitado pelo roteiro, do qual falarei. Ele esconde os detalhes do usuário, então o procedimento de conexão fica (quase) normal, e depois disso tudo funciona como deveria.



Algumas palavras sobre sshfs



O utilitário sshfspermite que você trabalhe com o sistema de arquivos no espaço do usuário (sistema de arquivos no espaço do usuário, FUSE). Ou seja, estamos falando sobre o fato de que existe uma camada no espaço do usuário que fica no topo do sistema de arquivos base. Neste caso, tal sistema de arquivos é o servidor ssh que suporta sftp. Isso permite que você trabalhe com arquivos em um sistema remoto, tratando-os como se estivessem em um sistema de arquivos real no computador local. Se você ainda não experimentou sshfs, experimente. Este utilitário funciona muito bem.



Suponha que você esteja conectado ao seu computador myservere execute o seguinte comando em sua máquina local: 



sshfs myserver:/home/admin ~/mounts/myserver


Isso tornará o diretório do computador remoto /home/adminacessível no sistema local ao longo do caminho ~/mounts/myserver.



Ao usar, sshfsvocê pode usar várias opções. Por exemplo, você pode se reconectar após perder a conexão. Para obter detalhes, sshfsconsulte a ajuda.



Como ele sshfsusa uma versão montada remotamente do arquivo, todas as alterações feitas no arquivo são salvas na máquina remota. E depois que a conexão sshfs é fechada, nada permanece no computador local. Vamos consertar isso agora.



Preparação preliminar



Antes de passar para a descrição do script que foi mencionado acima, gostaria de falar sobre algumas das configurações do cliente, que você, se quiser, pode modificar por si mesmo. Então, aqui eu crio um diretório ~/remotee nele crio subdiretórios para cada computador remoto. Por exemplo - podem ser diretórios ~/remote/fileservere ~/remote/lab.



O script é chamado sshmount. Leva os mesmos argumentos que ssh. Para simplificar o trabalho com o script, as informações sobre o host remoto devem ser armazenadas em um arquivo ~/.ssh/config, o que permitirá o uso de nomes de host simples e abreviados. Por exemplo, as informações do computador labpodem ser assim:



Host lab
Hostname lab.wd5gnr-dyn.net
Port 444
User alw
ForwardX11 yes
ForwardX11Trusted yes
TCPKeepAlive yes
Compression yes
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p


Isso não é realmente necessário, mas com esta abordagem você tem um diretório de boa aparência à sua disposição ~/remote/lab, não uma construção de visão complexa ~/remote/alw@lab.wd5gnr-dyn.net:444. Não há nada de misterioso em todos esses parâmetros. Só quero chamar sua atenção para isso ControlMastere ControlPathpermitir que você se organize para rodar mais rápido com compostos que, neste caso, são muito importantes.



Além disso, você pode organizar uma conexão automática a um sistema remoto usando chaves ssh privadas. Aqui está o material sobre isso.



Roteiro



Nosso script pode ser usado de duas maneiras. Portanto, se chamado por meio de um link para sshunmount, ele desmontará o sistema de arquivos associado ao host remoto especificado. Se chamado de forma diferente (geralmente como sshmount), ele executa as três ações a seguir:



  1. Ele verifica se o diretório contém um ~/remotesubdiretório com o mesmo nome do nome do host (por exemplo - lab). Se não houver tal diretório, ele exibe uma mensagem de erro e continua trabalhando.
  2. Se tal diretório existir, o script examinará a lista de sistemas de arquivos montados, caso o sistema de arquivos necessário já esteja montado. Nesse caso, ele continua a trabalhar.
  3. Se o diretório não estiver montado, ele chama sshfse continua.


Este script pode ser encontrado no GitHub . E aqui está seu código, do qual alguns comentários foram removidos:



#!/bin/bash
 
if [ "$1" == "" ]
then
echo Usage: sshmount host [ssh_options] - Mount remote home folder on ~/remote/host and log in
echo or: sshunmount host - Remove mount from ~/remote/host
exit 1
fi
 
#    sshunmount...
if [ $(basename "$0") == sshunmount ]
then
echo Unmounting... 1>&2
fusermount -u "$HOME/remote/$1"
exit $?
fi
 
#  ...
if [ -d "$HOME/remote/$1" ] #   ?
then
if mount | grep "$HOME/remote/$1 " #    ?
then
echo Already mounted 1>&2
else
sshfs -o reconnect $1: $HOME/remote/$1 # mount
fi
else
echo No remote directory ~/remote/$1 exists 1>&2
fi
ssh $@ #  


Este script me dá metade do que preciso. Ou seja, ele permite que você trabalhe convenientemente com arquivos remotos no computador local ao qual estou conectado. Mas fazer com que de um computador remoto seja possível trabalhar com arquivos localizados na máquina local é um pouco mais difícil.



Resolvendo o problema inverso



Se você quiser experimentar montar pastas em sua máquina local em um servidor, você precisará ter um servidor ssh rodando na máquina local. Obviamente, se o seu computador local estiver visível e acessível ao servidor, é simples: basta executá-lo no computador remoto sshfse montar a pasta no computador local. Mas, em muitos casos, não temos acesso ao sistema local, que pode estar localizado atrás de firewalls ou roteadores. Isso é especialmente verdadeiro se a função de um sistema local for desempenhada por um laptop que pode se conectar à rede de diferentes lugares.



Mas nossa tarefa, apesar de todas essas dificuldades, ainda pode ser resolvida. Existem duas partes para sua solução.



Em primeiro lugar - é necessário, ao ligarsshmount, especifique um argumento adicional (o arquivo pode ser editado se você precisar executar esse comando constantemente):



sshmount MyServer -R 5555:localhost:22


Em segundo lugar, depois de se conectar ao host, você precisa executar o seguinte comando:



sshfs -p 5555 localhost:/home/me ~/local


Graças à opção -R, um socket na porta é criado na máquina remota 5555(que, claro, deve ser gratuito) e sua conexão com a porta da 22máquina local é realizada . Assumindo que o servidor ssh está sendo executado na porta 22, isso permitirá que o servidor se conecte à máquina local pela mesma conexão. Não precisa saber nosso endereço IP ou ter uma porta aberta.



O comando sshfs, que pode ser executado na inicialização do sistema, vincula o diretório local /home/meao diretório no ~/localservidor remoto. Se, além disso, você estiver conectado localmente, poderá dar uma olhada nas variáveis ​​de ambiente que começam com SSH_e aprender mais sobre a conexão SSH. Por exemplo, são variáveis $SSH_CLIENTe $SSH_TTY.



Obviamente, para que os comandos acima funcionem para você, você precisará alterar os nomes de host e diretórios, bem como os endereços de porta para aqueles usados ​​em seus sistemas. Mas depois que tudo estiver configurado, todos os arquivos de que você precisa estarão disponíveis em máquinas locais e remotas. A propósito, não tentei organizar a montagem circular de diretórios. Se você tentar fazer isso, algo muito estranho pode acontecer.



Resultado



Suponho que você precise ter cuidado ao montar pastas remotas na máquina local e pastas locais na máquina remota ao mesmo tempo. Por exemplo, utilitários que examinam todo o sistema de arquivos podem ser confundidos em tais configurações. Além disso, ainda estou procurando uma resposta para a questão de como desconectar-se adequadamente do sistema de arquivos do servidor ao sair da última sessão.



Mas, mesmo agora, tudo isso nos fornece boas ferramentas para organizar o trabalho conveniente e confiável com arquivos de software ssh. Deve-se notar que outra opção para resolver o problema de trabalhar com arquivos em sistemas remotos pode ser sincronizar pastas e usá-las para transferir arquivos entre computadores.



O que você usa para trabalhar com arquivos em sistemas Linux remotos?










All Articles