move todos os arquivos no diretório local para o diretório remoto

0

Eu quero mover todos os arquivos no diretório local para o diretório remoto.

E estou usando este código para alcançá-lo

 SOURCE_FILE=/var/www/oneserver/*
 TARGET_DIR=/var/www/anotherServer
 ARCHIEVEFILE=/var/www/archieveServer

/usr/bin/expect<<EOD
spawn /usr/bin/sftp -o Port=$PORT $USER@$HOST
expect "password:"
send "$PASSWORD\r"
expect "sftp>"
send "put $SOURCE_FILE $TARGET_DIR\r"
expect "sftp>"
send "bye\r"
EOD 

Funciona bem, mas às vezes pára e só envia alguns arquivos.

Eu também quero mover o arquivo já enviado para ARCHIEVEFILE usando o comando mv. Mas não tenha idéia de como movê-lo. Eu não posso usar scp porque o servidor remoto não permite usar a porta básica, e a única maneira é usar o sftp.

Alguém pode ajudar, por favor?

[EDITAR]

o $ARCHIEVEFILE ainda é o servidor local, apenas para fazer backup / mover para que esses arquivos não sejam mais enviados com o próximo cronjob

o TARGET_DIR é o servidor remoto.

    
por klaudia 19.04.2018 / 08:53

3 respostas

2

Não há comando no OpenSSH sftp para mover arquivos para o diretório remoto.

O que você pode fazer é:

  • use sftp put para fazer upload dos arquivos (como você já está fazendo) e, em seguida,
  • use o comando shell rm para apagar os arquivos depois que sftp terminar (ou seja, após EOD ):

    rm $SOURCE_FILE
    

    Ou use ! para escapar para o shell do sftp script , depois você enviou put :

    send "!rm $SOURCE_FILE\r"
    expect "sftp>"        
    

É claro que esta não é uma solução atômica. Se um arquivo for adicionado entre put e rm , ele será perdido. Para uma solução atômica, você tem que iterar arquivos em um diretório local e fazer o upload e excluí-los um por um. Também para uma solução robusta, você precisa verificar se um upload foi bem-sucedido.

    
por 19.04.2018 / 09:08
1

A abordagem a seguir pode simplificar bastante as coisas:

  1. Use sshfs para montar o (s) compartilhamento (s) remoto (s) como caminho (s) local (is).
  2. Trabalhe com cp e / ou mv como se todas as operações fossem locais.

Compare esta minha resposta .

Você ainda precisa de alguma lógica para detectar se cp para o local remoto foi bem-sucedido, somente mv para o arquivo local; caso contrário, tente novamente ou algo assim. Mas agora todo o trabalho relacionado ao SFTP deve ser tratado de forma transparente por sshfs .

Além disso, a globalização de shell e as citações que você usa tornam seu código sujeito a erros relacionados a espaços em nomes de arquivos, etc.

Depois de montar o compartilhamento remoto, por exemplo, em /mnt/a b/remote , será muito mais fácil lidar com isso.

(Nota: é uma boa prática usar nomes de variáveis em minúsculas ).

  • Para montar:

    sshfs -p $port $user@$host:"/path/on/the/remote/host/" "/mnt/a b/remote/"
    

    Use autenticação baseada em chave ou leia Nome de usuário e senha na linha de comando com sshfs . Leia sobre preocupações de segurança .

  • Um código para copiar arquivos:

    # I deliberately use paths with spaces to show how to handle them
    for filename in "/source/location with spaces"/*; do
       cp "$filename" "/mnt/a b/remote/" &&
       mv "$filename" "/archive/location with spaces/"
    done
    

    Isso && garante que mv será executado somente se cp for bem-sucedido.

  • Para desmontar:

    fusermount -u "/mnt/a b/remote/"
    
por 19.04.2018 / 09:25
0

Você pode zipar o diretório de origem que deseja transferir

zip -r -9 /path/to/your/zip_file.zip var/www/oneserver/*   

(- r recorrerá a subdiretórios  , -9 aplicará compactação máxima para transferência mais rápida)

depois scp o arquivo para o seu servidor remoto

scp /path/to/your/zip_file.zip user@host:/var/www/anotherServer

e descompacte o arquivo no servidor remoto

ssh user@host 'unzip /var/www/anotherServer/zip_file.zip'

(existem muitos flags que você pode usar com o unzip que você pode usar para sobrescrever ou nunca sobrescrever arquivos exsit em seu servidor remoto, verifique o homem descompacte-os, especialmente -n -o e -u)

espero que ajude você

    
por 20.04.2018 / 12:59