
Я хотел бы сделать резервную копию некоторых моих очень важных данных на удаленной машине.
В настоящее время я просто сохраняю их на своей локальной машине с помощью этой команды:tar -cvjf ~/backups/Backup.tar.bz2 ~/importantfiles/*
Я бы предпочел не использовать другую команду для передачи данных на удаленную машину, то есть я хотел бы просто обновить эту команду, чтобы она могла передавать данные на удаленную машину.
Это сделано для того, чтобы впоследствии быть в скрипте, который должен работать сам по себе, а это значит, что любой тип обязательного пользовательского ввода полностью его испортит!
Что-то вроде
tar -cvjf sftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*
tar -cvjf ftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*
было бы идеально! (Никаких труб (и т.п.), только одна команда!)
решение1
Для SSH:
tar czf - . | ssh remote "( cd /somewhere ; cat > file.tar.gz )"
Для 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
Еще один SFTP:
outfile=/tmp/test.tar.gz
sftp -b /dev/stdin remote >/dev/null 2>&1 << EOF
cd /tmp
get $outfile
bye
EOF
echo $?
0
решение2
Tar не понимает ftp или sftp. Это не его работа. Вы не можете сделать это с помощью одного tar. Использование соответствующих инструментов для каждой задачи и их объединение с оболочкой — это обычный способ работы в системах unix.
Наиболее очевидным решением является создание архива локально, а затем копирование его на удаленный компьютер.
Если вы не хотите создавать архив локально, потому что у вас недостаточно места, вы можете создать именованный канал, заставить tar писать в этот канал и найти (s)ftp-клиента, который может читать из каналов. К сожалению, sftp отказывается от put
канала. Некоторые FTP-клиенты работают, например lftp:
mkfifo f
tar -cvjf f ~/importantfiles/* &
sleep 2
lftp -f - <<EOF
open user@host
put f Backup.tar.bz2
EOF
wait
rm f
Введите свой пароль FTP в~/.netrc
.
В качестве альтернативы, есть способ сделать так, чтобы ваша команда tar сохранялась на удаленном сервере напрямую, но вам потребуется некоторая предварительная настройка. Смонтируйте удаленный сервер черезСШФСилиcurlftpfs.
mkdir -p ~/net/host
sshfs host: ~/net/host
tar -cvjf ~/net/host/Backup.tar.bz2 ~/importantfiles/*
fusermount -u ~/net/host
решение3
Решение в одну строку:
tar Jcpvf - / | ftp -u ftp://user:[email protected]/full.backup.tar.xz -
он создает поток stdout
и передает его на FTP-сервер без создания файла. ftp
Это обычный FTP-клиент на любых системах *nix/BSD.