Как в rsync файлы между двумя пультами ДУ?

Попытайтесь делать это:

var='Link 0'
lltconfig -a list |
    awk '/'"$var"'/{l=1;next} /(^$)/{l=0} l==1  {print}'

Если Вы хотели бы что-то более общее:

grep="pattern" # the string where we begin
max=4          # the number of lines after the matched pattern
awk '/'"$grep"'/{l=1;count=NR;next} l>0 && NR-count < '"$max"+1' {print}'

(протестированный на Solaris11)

56
07.02.2015, 17:43
12 ответов

Как вы обнаружили, вы не можете использовать rsync с удаленным источником и удаленным пунктом назначения. Предполагая, что два сервера не могут говорить непосредственно друг к другу, можно использовать SSH в туннель через ваш локальный компьютер.

Вместо

rsync -vuar host1:/var/www host2:/var/www

Вы можете использовать это

ssh -R localhost:50000:host2:22 host1 'rsync -e "ssh -p 50000" -vuar /var/www localhost:/var/www'

, если вам интересно, вариант -R устанавливает обратный канал из порта 50000 на Host1, который отображается (через ваш локальный компьютер) к порту 22 на хосте2. Нет прямой связи от Host1 до Host2.

53
27.01.2020, 19:33

Вы можете использовать Следующий простой пример:

$ echo "foobarbazblargblurg" | fold -w4 | paste -sd' ' -
foob arba zbla rgbl
-121--13914-

Идеальный способ будет выполнять rsync на одном из этих серверов. Но если вы не хотите запустить скрипт на удаленном сервере. Вы можете запустить скрипт в вашей локальной системе и выполнить SSH и выполнить там rsync.

SSH User @ $ Host1 << insssh >> /tmp/rsyn.out 2> & 1 rsync -vuar / var / www host2: / var / www Close

также, как вы, возможно, в курсе, RYSNC, синхронизация. Если вы хотите использовать двухстороннюю синхронизацию, вы можете посмотреть на Osync ( https://github.com/deajan/osync ). Я использую его и обнаружил, что это полезно.

3
27.01.2020, 19:33

Для передачи файлов можно использовать tar через ssh:

ssh -n user1@host1 'tar jcf - -C /var/www .' | ssh user2@host2 'tar jxvf - -C /var/www'

Измените параметр j (для tar) на z в двух местах, если хотите сжать архив с помощью gzip, а не с помощью bzip2. Обычно bzip2 имеет более высокое сжатие, чем gzip, но оно медленнее, поэтому измените его в зависимости от Ваших потребностей (см.: bzip2 против gzip).

Похоже: Как скопировать между двумя удаленными хостами, используя tar-трубопровод в SSH с удаленного сервера, находясь за брандмауэром?


В качестве альтернативы (для безопасности пропускной способности, из-за прозрачного сжатия) можно использовать sshfs для монтирования удаленной файловой системы как локальной и использовать rsync, как обычно, например,

$ sshfs user1@host1:/var/www /mnt
$ rsync -vuar /mnt user2@host2:/var/www
-1
27.01.2020, 19:33

Вы не сказали, почему вы не хотите войти на один хост, а затем скопировать на другой, поэтому я поделюсь одной из причин и решением.

Я не мог войти на одну машину, а затем выполнить rsync на другую, потому что ни у одного из хостов не было SSH-ключа, с помощью которого можно было войти на другой. Я решил эту проблему с помощью переадресации агентов SSH, чтобы первый хост мог использовать мой SSH-ключ, пока я входил в систему.

ВНИМАНИЕ: Переадресация SSH позволяет хосту использовать ваш SSH-ключ на время вашего входа. Хотя они не могут скопировать ваш ключ, они могут входить с ним на другие машины. Убедитесь, что вы понимаете риски, и не используйте переадресацию для машин, которым вы не доверяете.

Следующая команда использует SSH agent forwarding для открытия прямого соединения с host1 на host2. Преимущество этого способа заключается в том, что машина, выполняющая команду, не задерживает передачу данных.

ssh -A host1 rsync -vuar /var/www host2:/var/www
23
27.01.2020, 19:33

Мне нравится ответ Роаймы, но пути в обоих примерах одинаковы, скрывая то, что есть что. Мы установили, что следующее не работает:

rsync -vuar host1:/host1/path host2:/host2/path

Но это работает (я пропустил явный bind_address localhost из параметра -R , так как это значение по умолчанию):

ssh -R 50000:host2:22 host1 'rsync -e "ssh -p 50000" -vuar /host1/path localhost:/host2/path'

Обратите внимание, что вы ' Мне нужно будет правильно настроить ssh-ключи между двумя удаленными хостами, с закрытым ключом на host1 и открытым ключом на host2.

Чтобы отладить соединение, разделите это на две части и добавьте подробный статус:

localhost$ ssh -v -R 50000:host2:22 host1

Если это сработает, у вас будет оболочка на host1. Теперь попробуйте команду rsync с host1. Я рекомендую сделать это в другом окне, чтобы подробная информация о ssh не смешивалась с информацией о состоянии rsync:

host1$ rsync -e "ssh -p 50000" -vuar /host1/path localhost:/host2/path
13
27.01.2020, 19:33

Вы можете запустить rsyncd (сервер) на одном из компьютеров.

Это мой подход, так как я не хочу использовать ssh, чтобы разрешить «источнику» (в формулировке rsync) доступ к «месту назначения» как root без пароля (как требуется для использования SSH-туннелирования. с rsync в скрипте)

В моем случае я просто установил сервер rsyncd на конечном компьютере с одним пользователем, которому разрешен доступ с исходного компьютера, и использовал rsync со стороны источника.

Отлично работает.

0
27.01.2020, 19:33

В качестве дополнительной информации:

Если вы используете jump-хост для подключения двух других машин, но они не могут связаться друг с другом напрямую, вы можете использовать sshfs как средство передачи данных между этими двумя машинами следующим образом (на jump-хосте):

$ mkdir ~/sourcepath ~/destpath
$ sshfs sourcehost:/target/dir ~/sourcepath
$ sshfs desthost:/target/dir ~/destpath
$ rsync -vua ~/sourcepath ~/desthpath

SSHFS предоставляет два пути на jump-хосте, а rsync управляет синхронизацией файлов, как обычно (только с той разницей, что это практически делается локально).

0
27.01.2020, 19:33

Переформатирование ответа roaima в синтаксисе сценария bash (и добавление символов продолжения строки '\' для ясности) Я случайным образом выбрал порт 22000 ...

SOURCE_USER=user1
SOURCE_HOST=hostname1
SOURCE_PATH=path1

TARGET_USER=user2
TARGET_HOST=host2
TARGET_PATH=path2

ssh -l $TARGET_USER -A -R localhost:22000:$TARGET_HOST:22 \
$SOURCE_USER@$SOURCE_HOST "rsync -e 'ssh -p 22000' -vuar $SOURCE_PATH \
$TARGET_USER@localhost:$TARGET_PATH"
7
27.01.2020, 19:33

Попробуйте использовать это. Меня устраивает.

ssh src_user@src_host 'rsync -av /src/dir/location/ dest_user@dest_host:/dest/dir/loc/'
0
27.01.2020, 19:33

Простой в использовании скрипт

На протяжении многих лет я делал это много раз, используя более или менее те же приемы, что и в любом другом ответе здесь. Однако, поскольку очень легко ошибиться в некоторых деталях и потратить много времени на выяснение проблемы, я придумал следующий сценарий:

  1. Позволяет легко указать все детали (источник, место назначения, параметры)
  2. Инкрементно проверяет каждый шаг и дает обратную связь, если что-то идет не так, чтобы вы знали, что нужно исправить.
  3. Работает в случаях, когда ssh -Aне удается распространить данные аутентификации (не знаю, почему это иногда происходит, так как обходной путь был проще, чем поиск основной причины)
  4. Наконец-то сделал свое дело.

Как пользоваться скриптом

  1. Убедитесь, что вы можете подключиться по ssh к обоим хостам с локального хоста без ввода пароль.
  2. Установите переменные в первых нескольких строках скрипта
  3. Казнить.

Как это работает

Как я уже сказал, здесь используются те же приемы, что и в любом другом ответе:

  • Опция ssh -Rдля ssh с локального хоста на хост1, в то же время настраивая переадресацию портов, которая затем позволяет хосту 1 подключаться через локальный хост к хосту 2(-R localhost:$FREE_PORT:$TARGET_ADDR_PORT)
  • Опция ssh -A, позволяющая легко аутентифицировать второй канал ssh

Это сложно! Есть ли способ проще?

При копировании всех или большинства байтов из источника в место назначения это НАМНОГО проще в использованииtar:

ssh $SOURCE_HOST "tar czf - $SOURCE_PATH" \
    | ssh $TARGET_HOST "tar xzf - -C $TARGET_PATH/"

Скрипт

#!/bin/bash
#-------------------SET EVERYTHING BELOW-------------------
# whatever you type after ssh to connect to SOURCE/TARGE host 
# (e.g. 1.2.3.4:22, user@host:22000, ssh_config_alias, etc)
# So if you use "ssh foo" to connect to SOURCE then 
# you must set SOURCE_HOST=foo
SOURCE_HOST=host1 
TARGET_HOST=host2 
# The IP address or hostname and ssh port of TARGET AS SEEN FROM LOCALHOST
# So if ssh -p 5678 someuser@1.2.3.4 will connect you to TARGET then
# you must set TARGET_ADDR_PORT=1.2.3.4:5678 and
# you must set TARGET_USER=someuser
TARGET_ADDR_PORT=1.2.3.4:5678
TARGET_USER=someuser

SOURCE_PATH=/mnt/foo  # Path to rsync FROM
TARGET_PATH=/mnt/bar  # Path to rsync TO

RSYNC_OPTS="-av --bwlimit=14M --progress" # rsync options
FREE_PORT=54321 # just a free TCP port on localhost
#---------------------------------------------------------

echo -n "Test: ssh to $TARGET_HOST: "
ssh $TARGET_HOST echo PASSED| grep PASSED || exit 2

echo -n "Test: ssh to $SOURCE_HOST: "
ssh $SOURCE_HOST echo PASSED| grep PASSED || exit 3

echo -n "Verifying path in $SOURCE_HOST "
ssh $SOURCE_HOST stat $SOURCE_PATH | grep "File:" || exit 5

echo -n "Verifying path in $TARGET_HOST "
ssh $TARGET_HOST stat $TARGET_PATH | grep "File:" || exit 5

echo "configuring ssh from $SOURCE_HOST to $TARGET_HOST via locahost"
ssh $SOURCE_HOST "echo \"Host tmpsshrs; ControlMaster auto; ControlPath /tmp/%u_%r@%h:%p; hostname localhost; port $FREE_PORT; user $TARGET_USER\" | tr ';' '\n'  > /tmp/tmpsshrs"

# The ssh options that will setup the tunnel
TUNNEL="-R localhost:$FREE_PORT:$TARGET_ADDR_PORT"

echo 
echo -n "Test: ssh to $SOURCE_HOST then to $TARGET_HOST: "
if ! ssh -A $TUNNEL $SOURCE_HOST "ssh -A -F /tmp/tmpsshrs tmpsshrs echo PASSED" | grep PASSED ; then
        echo
        echo "Direct authentication failed, will use plan #B:"
        echo "Please open another terminal, execute the following command"
        echo "and leave the session running until rsync finishes"
        echo "(if you're asked for password use the one for $TARGET_USER@$TARGET_HOST)"
        echo "   ssh -t -A $TUNNEL $SOURCE_HOST ssh -F /tmp/tmpsshrs tmpsshrs"
        read -p "Press [Enter] when done..."
fi

echo "Starting rsync"
ssh -A $TUNNEL $SOURCE_HOST "rsync -e 'ssh -F /tmp/tmpsshrs' $RSYNC_OPTS $SOURCE_PATH tmpsshrs:$TARGET_PATH"

echo
echo "Cleaning up"
ssh $SOURCE_HOST "rm /tmp/tmpsshrs"
4
27.01.2020, 19:33

Вы можете использовать локальный временный каталог для копирования данных с удаленного исходного сервера, а затем скопировать этот временный файл на удаленный целевой сервер.

Вот пример:

SRC=user@source-server:/some/path/in/source/* && \
DST=user@destin-server:/some/path/in/destin/* && \
TMP=/tmp/rsync && \
rm -fr $TMP && \
mkdir -p $TMP && \
rsync -av $SRC $TMP && \
rsync -av $TMP/* $DST/ && \
rm -fr $TMP
1
27.09.2020, 11:57

Не уверен, что это кому-нибудь пригодится... Это быстрое и неприятное решение, которое я придумал для синхронизации файлов между двумя удаленными системами, к которым хост имеет доступ, но где удаленные устройства не могут получить доступ друг к другу:

(){ local RSYNC_TMP=$(mktemp); rsync -aP src-host:~/filename $RSYNC_TMP; rsync -aP $RSYNC_TMP dest-host:~/filename; rm -rf $RSYNC_TMP }

Это можно скопировать/вставить в zsh, поэтому удобно использовать, если ваш хост — macOS. Однако это не обеспечит безопасность рассматриваемого файла. Замена имени файла на имя каталога и изменение local RSYNC_TMP=$(mktemp)на local RSYNC_TMP=$(mktemp -d)должно разрешить передачу каталога.

Для более безопасного механизма временной передачи, при условии, что ваш хост — Linux, я склонен использовать [bwrap(1)][1]или что-то подобное для создания монтирования tmpfs, которое существует только на время процесса.

0
18.01.2021, 16:44

Теги

Похожие вопросы