Como fazer o tar salvar o arquivo em uma máquina remota usando sftp ou ftp?

10

Gostaria de fazer backup de alguns dos meus dados muito importantes em uma máquina remota.
Atualmente, estou apenas salvando-o na minha máquina local usando este comando:tar -cvjf ~/backups/Backup.tar.bz2 ~/importantfiles/*

Eu preferiria não usar outro comando para transferi-lo para a máquina remota, o que significa que gostaria apenas de atualizar esse comando para que ele possa transferir os dados para a máquina remota.

Ele foi projetado para ser posteriormente inserido em um script que deve ser executado sozinho, o que significa que qualquer tipo de entrada de usuário necessária pode atrapalhar completamente!

Algo como

tar -cvjf sftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*
tar -cvjf  ftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*

seria perfeito! (Sem tubos (etc.), apenas um comando!)

BrainStone
fonte
Será que ela precisa ser ftp? Você não tem sshacesso a esta máquina?
terdon
Eu não tenho acesso ssh à máquina. É apenas um servidor de backup que eu alugo. Então, sim , tem que ser ftp ou sftp.
precisa
@BrainStone SFTP é parte de SSH
kurtm
Eu sei. Mas é configurado de uma maneira que toda conexão ssh é fechada imediatamente. SFTP funciona embora. Eu sei que é uma configuração estranha, mas é assim que é.
BrainStone
1
O SFTP está disponível quando o SSH não estiver, se eles estiverem usando o servidor interno sftp e seu shell estiver definido como / sbin / nologin.
Gregg Leventhal

Respostas:

15

Para SSH:

tar czf - . | ssh remote "( cd /somewhere ; cat > file.tar.gz )"

Para SFTP:

outfile=/tmp/test.tar.gz
tar cvf $outfile . && echo "put $outfile" | sftp remote:/tmp/
Connecting to remote...
Changing to: /tmp/
sftp> put /tmp/test.tar.gz
Uploading /tmp/test.tar.gz to /tmp/test.tar.gz
/tmp/test.tar.gz

Outro SFTP:

outfile=/tmp/test.tar.gz
sftp -b /dev/stdin remote >/dev/null 2>&1 << EOF
cd /tmp
get $outfile
bye
EOF
echo $?
0
jirib
fonte
Então, como exatamente eu usaria isso? Quero dizer, como posso definir quais arquivos devem estar na bola de alcatrão. E onde eu colocaria a senha? E como faço para configurá-lo para não precisar aceitar a impressão digital do host?
21313 BrainStone
Por favor, aprenda mais sobre ssh, man ssh, man ssh-agent, man ssh_config, responda todas as suas dúvidas. Quais arquivos você define localmente com argumentos tar, depois são canalizados via ssh para o host remoto e a saída é redirecionada para o arquivo.
jirib
É possível fazê-lo sem um cano?
precisa
Isso também não pode trabalhar porque precisa ser sftp ( sem acesso ssh ) ou ftp
BrainStone
Para ftp, consulte man lftp. Se você precisar de cenários mais complicados, use 'sftp -b' e tenha um arquivo com comandos ou use 'here documents' (<< EOF).
jirib
3

O alcatrão não fala ftp ou sftp. Esse não é o seu trabalho. Você não pode fazer isso apenas com alcatrão. Usar ferramentas apropriadas para cada trabalho e combiná-las com o shell é a maneira normal de fazer as coisas em sistemas unix.

A solução mais óbvia é criar o arquivo localmente e copiá-lo para a máquina remota.

Se você não deseja criar o arquivo localmente porque não possui espaço suficiente, é possível criar um pipe nomeado, fazer tar escrever nesse pipe e encontrar um (s) cliente ftp que possa ler os pipes. Infelizmente, o sftp se recusa a putum pipe. Alguns clientes de FTP funcionam, por exemplo, lftp:

mkfifo f
tar -cvjf f ~/importantfiles/* &
sleep 2
lftp -f - <<EOF
open user@host
put f Backup.tar.bz2
EOF
wait
rm f

Coloque sua senha de FTP ~/.netrc.

Como alternativa, existe uma maneira de fazer com que seu comando tar seja salvo diretamente no servidor remoto, mas você precisa de alguma configuração prévia. Monte o servidor remoto sobre SSHFS ou curlftpfs .

mkdir -p ~/net/host
sshfs host: ~/net/host
tar -cvjf ~/net/host/Backup.tar.bz2 ~/importantfiles/*
fusermount -u ~/net/host
Gilles 'SO- parar de ser mau'
fonte