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 scp
e 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á instalar
sshfs
, 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
sshfs
permite 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
myserver
e execute o seguinte comando em sua máquina local:
sshfs myserver:/home/admin ~/mounts/myserver
Isso tornará o diretório do computador remoto
/home/admin
acessível no sistema local ao longo do caminho ~/mounts/myserver
.
Ao usar,
sshfs
você pode usar várias opções. Por exemplo, você pode se reconectar após perder a conexão. Para obter detalhes, sshfs
consulte a ajuda.
Como ele
sshfs
usa 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
~/remote
e nele crio subdiretórios para cada computador remoto. Por exemplo - podem ser diretórios ~/remote/fileserver
e ~/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 lab
podem 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 ControlMaster
e ControlPath
permitir 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:
- Ele verifica se o diretório contém um
~/remote
subdiretó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. - 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.
- Se o diretório não estiver montado, ele chama
sshfs
e 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
sshfs
e 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 ligar
sshmount
, 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 22
má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/me
ao diretório no ~/local
servidor 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_CLIENT
e $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?

