arquivos scp de vários diretórios em locais para vários diretórios no remoto em um comando

5

Eu preciso copiar alguns arquivos de vários diretórios locais para vários diretórios remotos.

O comando:

scp -v /file/source1/* username@host_server:/file/destination1
scp -v /file/source2/* username@host_server:/file/destination2
scp -v /file/source3/* username@host_server:/file/destination3

Ele pede senha novamente e novamente.

O comando:

scp file1 file2 ... fileN user@host:/destination/directory/

Colocará todos os arquivos em um diretório de destino.

Mas meu destino é diferente para todos os arquivos.

    
por romil gaurav 18.07.2016 / 12:03

4 respostas

1

Você não pode ter vários destinos em um comando scp . Se você quiser fazer uma única conexão SSH, precisará usar outra ferramenta.

A solução mais simples é montar o sistema de arquivos remoto através do SSHFS e depois usar o comando cp . Isso requer acesso SFTP.

mkdir host_server
sshfs username@host_server:/file host_server
cp /file/source1/* host_server/destination1
cp /file/source2/* host_server/destination2
cp /file/source3/* host_server/destination3
fusermount -u host_server
rmdir host_server

Outra solução é primeiro organizar os arquivos localmente e depois copiar a hierarquia. Isso requer rsync.

mkdir destination1 destination2 destination3
ln -s /file/source1/* destination1
ln -s /file/source2/* destination2
ln -s /file/source3/* destination3
rsync -a --copy-unsafe-links destination1 destination2 destination3 username@host_server:/file
rm -r destination1 destination2 destination3

Outra solução é continuar usando scp , mas primeiro abra uma conexão mestre para o servidor. Isso é explicado em Uso de um canal SSH já estabelecido

Alternativamente, basta agüentar e fazer três scp de conexões. Mas não use sua senha para efetuar login; em vez disso, crie um par de chaves e carregue a chave privada no seu agente de chaves ( ssh-add ~/.ssh/id_rsa ), então você não precisará digitar nada em cada conexão.

    
por 19.07.2016 / 02:54
1

scp usa ssh para transferência de dados, e usa a mesma autenticação e fornece a mesma segurança que ssh . Ao contrário de rcp , o scp solicitará senhas ou senhas se elas forem necessárias para autenticação. Então você pode:
1. Liquidar ssh para conexão via chave pública editando o controle remoto sshd_config like

# Should we allow Identity (SSH version 1) authentication?
RSAAuthentication yes       
# Should we allow Pubkey (SSH version 2) authentication?
PubkeyAuthentication yes
# Where do we look for authorized public keys?
# If it doesn't start with a slash, then it is
# relative to the user's home directory
AuthorizedKeysFile .ssh/authorized_keys

Gerar pares de chaves

localhost$ ssh-keygen -t rsa

E envie para o host remoto

localhost$ scp ~/.ssh/id_rsa.pub [email protected]
localhost$ ssh [email protected]
remote.server.host$ [ -d ~/.ssh ] || (mkdir ~/.ssh; chmod 700 ~/.ssh)
remote.server.host$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
remote.server.host$ chmod 600 ~/.ssh/authorized_keys

Ou
2. [Unsecure] Configurar usuário remoto do host sem senha
Ou
3. Use scripts com expect

#!/usr/bin/expect
stty -echo
send_user -- "Enter Password: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set PASS $expect_out(1,string)
…
spawn scp -v /file/source1/* username@host_server:/file/destination1
expect "assword:"
send $PASS"\r"
expect eof
    
por 18.07.2016 / 12:26
0
  1. para evitar as solicitações repetidas de senha, use a autenticação baseada em chave em vez de baseada em senha.

    por exemplo. execute ssh-keygen em sua máquina local e, em seguida, execute ssh-copy-id user@remotehost para cada host remoto. Essa será a última vez que você precisará inserir a senha quando você ssh ou scp dessa máquina.

    Use uma frase-senha boa na sua chave e execute ssh-agent ou similar. Dessa forma, você só precisará inserir a frase secreta da sua chave privada na primeira vez em que a usar em uma sessão de login.

  2. Use pdcp do pacote pdsh . Por exemplo:

    pdcp -w host1,host2,host3 /path/to/source/file /path/on/destination/

    ou se seus nomes de host corresponderem a um padrão:

    pdcp -w host[1-3] /path/to/source/file /path/on/destination/

    Você não pode ter vários destinos, mas pode ter várias origens. por exemplo. pdcp -w h1,h2,h3 file1 file2 file3 /remote-path/ copiará para o diretório / remote-path / em cada máquina (qualquer máquina de destino em que esse diretório esteja ausente produzirá uma mensagem de erro)

    Você pode usar um wrapper for loop se precisar copiar vários arquivos de origem para diretórios diferentes em vários hosts. você poderia fazer o mesmo com o antigo scp , mas precisaria de um loop externo para os hosts, além de um loop interno para fazer o scp s. Além disso, pdcp copia para várias máquinas em paralelo, não uma de cada vez.

    Com pdsh (e pdcp ), você pode configurar nomes arbitrários para grupos de máquinas, por exemplo, todos os nós de computação estão no grupo compute-nodes , todos os servidores da web no grupo web , servidores de banco de dados em db , todos os hosts no grupo all etc.

    Então você pode fazer coisas como:

    pdsh -g web 'uname -a ; uptime' ou pdcp -g web,db /etc/motd /etc/

por 19.07.2016 / 13:43
0

Com uma modificação muito ligeira no seu comando, isto pode ser conseguido como mostrado abaixo.

Supondo que você tenha source1, source2 .. pastas dentro da sua pasta "arquivo", você pode executar como abaixo para copiar todas essas pastas source1, source2 .. no servidor de destino.

scp -r /source/file username@host_server:/file/destination1

Isso criará as pastas source1, source2 e copiará seu conteúdo nas respectivas pastas presentes no caminho de destino /file/destination1 no servidor de destino.

    
por 31.01.2018 / 08:38