Попытайтесь делать это:
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
)
Как вы обнаружили, вы не можете использовать 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.
Вы можете использовать Следующий простой пример:
$ 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 ). Я использую его и обнаружил, что это полезно.
Для передачи файлов можно использовать 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).
В качестве альтернативы (для безопасности пропускной способности, из-за прозрачного сжатия) можно использовать sshfs
для монтирования удаленной файловой системы как локальной и использовать rsync
, как обычно, например,
$ sshfs user1@host1:/var/www /mnt
$ rsync -vuar /mnt user2@host2:/var/www
Вы не сказали, почему вы не хотите войти на один хост, а затем скопировать на другой, поэтому я поделюсь одной из причин и решением.
Я не мог войти на одну машину, а затем выполнить rsync на другую, потому что ни у одного из хостов не было SSH-ключа, с помощью которого можно было войти на другой. Я решил эту проблему с помощью переадресации агентов SSH, чтобы первый хост мог использовать мой SSH-ключ, пока я входил в систему.
ВНИМАНИЕ: Переадресация SSH позволяет хосту использовать ваш SSH-ключ на время вашего входа. Хотя они не могут скопировать ваш ключ, они могут входить с ним на другие машины. Убедитесь, что вы понимаете риски, и не используйте переадресацию для машин, которым вы не доверяете.
Следующая команда использует SSH agent forwarding для открытия прямого соединения с host1
на host2
. Преимущество этого способа заключается в том, что машина, выполняющая команду, не задерживает передачу данных.
ssh -A host1 rsync -vuar /var/www host2:/var/www
Мне нравится ответ Роаймы, но пути в обоих примерах одинаковы, скрывая то, что есть что. Мы установили, что следующее не работает:
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
Вы можете запустить rsyncd (сервер) на одном из компьютеров.
Это мой подход, так как я не хочу использовать ssh, чтобы разрешить «источнику» (в формулировке rsync) доступ к «месту назначения» как root без пароля (как требуется для использования SSH-туннелирования. с rsync в скрипте)
В моем случае я просто установил сервер rsyncd на конечном компьютере с одним пользователем, которому разрешен доступ с исходного компьютера, и использовал rsync со стороны источника.
Отлично работает.
В качестве дополнительной информации:
Если вы используете jump-хост для подключения двух других машин, но они не могут связаться друг с другом напрямую, вы можете использовать sshfs как средство передачи данных между этими двумя машинами следующим образом (на jump-хосте):
$ mkdir ~/sourcepath ~/destpath
$ sshfs sourcehost:/target/dir ~/sourcepath
$ sshfs desthost:/target/dir ~/destpath
$ rsync -vua ~/sourcepath ~/desthpath
SSHFS предоставляет два пути на jump-хосте, а rsync управляет синхронизацией файлов, как обычно (только с той разницей, что это практически делается локально).
Переформатирование ответа 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"
Попробуйте использовать это. Меня устраивает.
ssh src_user@src_host 'rsync -av /src/dir/location/ dest_user@dest_host:/dest/dir/loc/'
Простой в использовании скрипт
На протяжении многих лет я делал это много раз, используя более или менее те же приемы, что и в любом другом ответе здесь. Однако, поскольку очень легко ошибиться в некоторых деталях и потратить много времени на выяснение проблемы, я придумал следующий сценарий:
ssh -A
не удается распространить данные аутентификации (не знаю, почему это иногда происходит, так как обходной путь был проще, чем поиск основной причины)Как пользоваться скриптом
Как это работает
Как я уже сказал, здесь используются те же приемы, что и в любом другом ответе:
-R
для ssh с локального хоста на хост1, в то же время настраивая переадресацию портов, которая затем позволяет хосту 1 подключаться через локальный хост к хосту 2(-R localhost:$FREE_PORT:$TARGET_ADDR_PORT
)-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"
Вы можете использовать локальный временный каталог для копирования данных с удаленного исходного сервера, а затем скопировать этот временный файл на удаленный целевой сервер.
Вот пример:
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
Не уверен, что это кому-нибудь пригодится... Это быстрое и неприятное решение, которое я придумал для синхронизации файлов между двумя удаленными системами, к которым хост имеет доступ, но где удаленные устройства не могут получить доступ друг к другу:
(){ 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, которое существует только на время процесса.