Eu gostaria de copiar arquivos de / para servidor remoto em diferentes diretórios. Por exemplo, eu quero executar esses 4 comandos de uma só vez.
scp remote:A/1.txt local:A/1.txt
scp remote:A/2.txt local:A/2.txt
scp remote:B/1.txt local:B/1.txt
scp remote:C/1.txt local:C/1.txt
Qual é a maneira mais fácil de fazer isso?
rsync
, talvez ele possa ajudá-lo neste caso e em muitos casos futuros. Então, para evitar a digitação de senhas (sem falar várias vezes), você deve ler sobressh
chaves públicas / privadas, por exemplo, digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2scp [email protected]:'/etc/openvpn/ca.crt /etc/openvpn/client/client0.crt /etc/openvpn/client/client0.key /etc/openvpn/client/ta.key' ./
.Respostas:
Copie vários arquivos do remoto para o local:
Copie vários arquivos do local para o remoto:
Copie vários arquivos de remoto para remoto:
Fonte: http://www.hypexr.org/linux_scp_help.php
fonte
~
ou./
apenas.\{a,b,c\}
transferirá os arquivos em uma única conexão / lote (uma vez que eles serão expandidos no host remoto), enquanto o uso{a,b,c}
abrirá várias conexões, e a sobrecarga é bastante perceptível ao transferir muitos arquivosDo local para o servidor:
scp file1.txt file2.sh [email protected]:~/pathtoupload
Do servidor para o local:
scp -T [email protected]:"file1.txt file2.txt" "~/yourpathtocopy"
fonte
-T
opção para suprimir esse erro.Você pode copiar diretórios inteiros usando a
-r
opção switch. Se você puder isolar seus arquivos no próprio diretório, poderá copiar tudo de uma vez.então por exemplo
Ou, se houver apenas alguns deles, você pode usar:
fonte
Como Jiri mencionou, você pode usar
scp -r user@host:/some/remote/path /some/local/path
para copiar arquivos recursivamente. Isso pressupõe que haja um único diretório contendo todos os arquivos que você deseja transferir (e nada mais).No entanto, o SFTP fornece uma alternativa se você deseja transferir arquivos de vários diretórios diferentes e os destinos não são idênticos:
Isso usa a sintaxe "aqui doc" para definir uma sequência de comandos de entrada SFTP. Como alternativa, você pode colocar os comandos SFTP em um arquivo de texto e executar
sftp user@host -b batchFile.txt
fonte
scp
manual há muito tempo tentando encontrar esse recurso, e acho que o scp não o possui./home/vagrant/Code/
vez de~/Code/
.- r
para diretóriosAs respostas com
{file1,file2,file3}
funcionam apenas com o bash (no controle remoto ou localmente)A maneira real é:
fonte
{…, …, …}
obras em muitas conchas, não apenas no Bash. No entanto, isso funciona em qualquer shell, então é claramente melhor.Depois de jogar com o scp por um tempo, encontrei a solução mais robusta:
(Cuidado com as aspas simples e duplas)
Local para remoto:
Remoto para local:
Observe que o que for depois de "HOST:" será enviado para o controle remoto e analisado lá. Portanto, devemos garantir que eles não sejam processados pelo shell local. É por isso que as aspas simples entram. As aspas duplas são usadas para manipular espaços nos nomes dos arquivos.
Se todos os arquivos estiverem no mesmo diretório, podemos usar * para corresponder a todos, como
Comparado ao uso da sintaxe "{}", que é suportada apenas por alguns shells, este é universal
fonte
{}
sintaxe facilita a cópia de vários arquivos do mesmo diretório. Existe alguma maneira de fazer issoscp -r
para que"FILE1" "FILE2"
possam ser caminhos relativos e não absolutos para os arquivos?A maneira mais simples é
Portanto, a lista {..} pode incluir diretórios (A, B e C aqui são diretórios; "1.txt" e "2.txt" são nomes de arquivos nesses diretórios).
Embora copie todos esses quatro arquivos em um diretório local - não tenho certeza se é isso que você deseja.
No caso acima, você terminará os arquivos remotos A / 1.txt, A / 2.txt, B / 3.txt e C / 4.txt copiados para um único diretório local, com nomes de arquivo ./1.txt, ./2.txt, ./3.txt e ./4.txt
fonte
sh
.local$ scp -r remote:{A/1.txt,A/2.txt,B/3.txt,C/4.txt,D,F} ./
Problema : Copiando vários diretórios do servidor remoto para a máquina local usando um único comando SCP e mantendo cada diretório como está no servidor remoto.
Solução : o SCP pode fazer isso facilmente. Isso resolve o problema irritante de inserir a senha várias vezes ao usar o SCP com várias pastas. Consequentemente, isso também economiza muito tempo!
por exemplo
PS: Motivado por esta ótima resposta: scp ou sftp copiam vários arquivos com um único comando
Com base nos comentários, isso também funciona bem no Git Bash no Windows
fonte
Copie vários diretórios:
fonte
Você pode fazer desta maneira:
Isso fará o download de todos os nomes de arquivos listados para qualquer diretório local em que você esteja.
Certifique-se de não colocar espaços entre cada nome de arquivo usando apenas uma vírgula
,
.fonte
/path/to/files/\\{file1.ext,file2.ext,file3.ext\\}
se os arquivos tivessem extensões diferentes. Observe para as pessoas do PowerShell (agora que a MS entrou na festa) que você precisa usar`
para escapar:/path/to/files/`{file1.ext,file2.ext,file3.ext`}
NOTA: Peço desculpas antecipadamente por responder apenas a uma parte da pergunta acima. No entanto, achei esses comandos úteis para minhas necessidades atuais de unix.
Upload de arquivos específicos de uma máquina local para uma máquina remota:
~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext [email protected]:Folder1/DestinationFolderForFiles/
Fazendo upload de um diretório inteiro de uma máquina local para uma máquina remota:
~$ scp -r Desktop/dump_files [email protected]:Folder1/DestinationFolderForFiles/
Fazendo download de um diretório inteiro de uma máquina remota para uma máquina local:
~/Desktop$ scp -r [email protected]:Public/web/ Desktop/
fonte
No meu caso, estou restrito a usar apenas o comando sftp.
Então, eu tive que usar um arquivo em lote com o sftp. Eu criei um script como o seguinte. Isso pressupõe que você esteja trabalhando no diretório / tmp e deseja colocar os arquivos no sistema destdir_on_remote_system no sistema remoto. Isso também funciona apenas com um logon não interativo. Você precisa configurar chaves públicas / privadas para poder fazer login sem inserir uma senha. Mude conforme necessário.
fonte
seu comando funciona perfeitamente, mas também quero alterar o nome do arquivo ao enviar o local para o remoto. Eu escrevi um comando: - sshpass -p senha scp /path/to/file.txt root @ hostname: /path/newfile.txt
Mas dá erro que /path/newfile.txt: Nenhum arquivo ou diretório encontrado foi encontrado por favor me ajude nessa situação
fonte
hostname:/path/
realmente existe e está acessível.O scp usa ssh para transferência de dados com a mesma autenticação e fornece a mesma segurança que o ssh.
Uma prática recomendada aqui é implementar "SSH KEYS AND PUBLIC KEY AUTHENTICATION". Com isso, você pode escrever seus scripts sem se preocupar com autenticação. Simples assim.
Veja O QUE É SSH-KEYGEN
fonte
No caso específico em que todos os arquivos têm a mesma extensão, mas com sufixo diferente (por exemplo, número de arquivo de log), use o seguinte:
Isso copiará todos os arquivos com o nome some_log_file da pasta especificada no controle remoto, ou seja, some_log_file.1, some_log_file.2, some_log_file.3 ....
fonte
fonte
-r
opção descp
. E você pode preservar outros atributos (como carimbo de data / hora) com a-p
opção