É possível usar comandos Unix para cp um arquivo no meu subdiretório em um computador remoto via SSH?

17

Eu tenho uma série de arquivos de software baixados no meu subdiretório ~/Downloadsno meu computador pessoal. Também estou usando o bash para conectar-me remotamente a um computador usando ssh.

É possível transferir esse arquivo via sshpara o computador remoto?

ShanZhengYang
fonte
A pergunta se refere a um arquivo singular ( this file) e vários arquivos ( a series of software files), a melhor solução depende se você possui um único arquivo ou vários arquivos.
user2768

Respostas:

42

Você pode usar scppara esse fim. É um meio seguro de transferir arquivos usando o protocolo SSH.

Por exemplo, para copiar um arquivo nomeado yourfile.txtde ~/Downloadspara um computador remoto, use:

scp ~/Downloads/yourfile.txt [email protected]:/some/remote/directory

Você pode ver mais exemplos aqui .

ARG
fonte
5
Eu acho que rsynco trabalho pode muito bem, agora que penso nisso
ShanZhengYang
1
rsync está longe de complexo para apenas um ou uma mão cheia de arquivos ...
Paebbels
14
@Paebbels Pelo contrário, substitua scpacima por rsynce deve funcionar muito bem.
8bittree
Costumo usar rsyncpara tudo, até arquivos únicos, porque "simplesmente funciona" nos casos simples e pode ser muito mais eficiente em outros casos. Se estiver usando algo scpou ainda rsyncnão compactado e / ou criptografado, lembre-se de ativar a opção de compactação ( -Cpara scp, -zou --compresspara rsync). Na verdade, eu o ligo por hábito - é muito raro você encontrar uma circunstância em que isso diminui a velocidade (talvez se você estiver usando um dispositivo lento de baixa potência com poder de CPI limitado, como um rPi).
precisa
37

Embora scpseja claramente a ferramenta certa para isso, se por algum motivo você não puder usá-lo, poderá fazer algo como o seguinte na sua máquina local para copiar, por exemplo, uma estrutura de diretórios para a máquina remota:

tar -c . | ssh <remote> tar -x

Este será taro diretório atual na máquina local, e escrever que tara stdoutque será então canalizada para um sshcomando onde ele irá executar um comando remoto para descompactar o arquivo que ele lê a partirstdin

Editado para refletir o comentário de Dietrich Epp sobre -f -o padrão na criação e extração, para que não seja necessário especificar explicitamente.

Eric Renouf
fonte
7
Você provavelmente desejará adicionar um -C basedirargumento para tarextrair outro lugar que não seja o seu diretório pessoal, se estiver fazendo isso.
Dougal
17

Se você quiser fazer isso em mais do que uma ocasião rara, sugiro montar o sistema de arquivos remoto sshfsse estiver usando um tipo Unix que suporte FUSE (Linux, * BSD, Mac OS X). Crie um diretório em seu diretório pessoal, digamos, chamado ~ / remote-server:

    $ mkdir ~/remote-server

Em seguida, monte o sistema de arquivos remoto com sshfs. Substitua "ourserver.com" pelo nome do host da sua máquina remota e "nome do diretório remoto" pelo diretório que você está usando no sistema remoto.

    $ sudo sshfs [email protected]:/name/of/remote/directory ~/remote-server/

Feito isso, o diretório remoto faz parte do seu sistema de arquivos e você pode usar todas as suas ferramentas normais, incluindo cp:

    $ cp ~/Downloads/your-files ~/remote-server

Se você ainda não o sshfsinstalou, poderá instalá-lo no seu computador usando o gerenciador de pacotes (procure pacotes com o nome sshfsou fuse-sshfs). Para mais informações, você pode ler um tutorial online .

A propósito, essa é a minha maneira favorita de gerenciar arquivos em servidores remotos. Normalmente, mantenho um servidor de produção e dois servidores de desenvolvimento montados dessa maneira e uso meu fluxo de trabalho normal de navegação de arquivos com eles.

Benjamin Staton
fonte
E, em seguida, verifique quais opções do sshfs o ajudarão a realizar melhor o seu trabalho. Por exemplo, começando com o mapeamento de ID de usuário / grupo -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_othere -Cpara compactação, se a largura de banda for ruim. Assim que funciona bem, eu adiciono pessoalmente aliases para os comandos para montar rapidamente os sistemas de arquivos distantes no ssh. @Benjamin_Staton Eu não usaria sudo ou root aqui, não sem pelo menos um mapeamento de usuário / grupo adequado.
tuk0z
9

Na primeira vez, não há diferença real entre scp(copiar ssh) e rsync.

As execuções subsequentes se beneficiarão se o rsync não copiar arquivos que já existem.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a para todos os arquivos
  • -v para verboso
  • -H para "apenas descubra links simbólicos e faça a coisa certa"
  • depois, caminhos de origem e destino. Você pode usar curingas na fonte ou apenas sincronizar o diretório inteiro.

Outros sinalizadores úteis incluem:

  • --delete para excluir arquivos no destino que não existem mais na origem.
  • --dry-run para teste - muito útil quando combinado com --delete.

Isso usará sshchaves para fazer um login sem senha também, se você as tiver configurado.

No final da execução, rsyncvocê informará quantas vezes mais rápido acabou fazendo a cópia simples novamente.

Criggie
fonte
1
-Hé realmente para links físicos, impede que o mesmo conteúdo seja enviado duas ou mais vezes quando estiver vinculado a mais de um local na estrutura de diretórios de origem (mas pode tornar o processo menos eficiente para grandes estruturas de diretórios). não afeta os links simbólicos, mas algumas das opções incluídas por -a/ --archiveafetam como os links simbólicos são processados.
precisa
4

Para adicionar às respostas acima. Às vezes, não tenho exatamente certeza sobre o caminho remoto. Nesses casos, eu uso sftppara navegar primeiro para o local necessário e, em seguida, usar get ou put para realmente baixar ou fazer upload de um arquivo.

Se você também deseja manter algo sempre sincronizado e até mesmo executar localmente algum arquivo localizado na máquina remota, sshfsfunciona muito bem.

aragaer
fonte
-1

Estou fazendo algo muito semelhante com o ssh. Criei uma ferramenta de compilação personalizada para o Visual Studio e, basicamente, o VS executa um comando ssh que copia meu código em um computador de destino e o compila nesse computador de destino.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand '

Observe o uso de aspas simples e ponto-e-vírgula. O primeiro encapsula seus comandos para o hostB via ssh e o último permite executar vários comandos do sistema hostB em um comando ssh do hostA.

Para que isso funcione, você precisará configurar as chaves ssh em sua máquina inicial para poder ser usuário A @ hostA e efetuar login no hostB como usuárioB. O processo para criar uma chave ssh pública para userA @ hostA está bem documentado. Se você não criar uma chave pública no hostA para o usuárioA e copiar essa chave para o hostB como usuárioB, será forçado a inserir sua senha todas as vezes - o que arruina a alegria da automação.

Andrew
fonte
Alguém que tenha votado com voto negativo pode deixar um comentário sobre o motivo pelo qual votou com voto negativo? Os votos negativos não têm sentido sem feedback informativo. Abordei a pergunta específica do OP com uma resposta diretamente relacionada. Não estou introduzindo novas tecnologias ou sugerindo rotas alternativas. Por quê? talvez o OP não queira usar rotas alternativas.
23815 Andrew Andrew