Несколько сеансов ssh в одной команде

Я пытаюсь скопировать базу данных с одного сервера на другой. Я попробовал использовать следующую команду, и она связана с вводом паролей ssh. Если я вложу пароль одного сервера, он жалуется на другого и наоборот.

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

Мне удалось сделать перевод, временно удерживая дампы на моем компьютере, просто задаваясь вопросом, есть ли способ заставить это работать.

6 Solutions collect form web for “Несколько сеансов ssh в одной команде”

Самый эффективный способ сделать это – это соединение с сервером mysqldump . Как и этот список команд …

 ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql' 

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

 ssh root@server1 'mysqldump db' | ssh root@server2 'mysql db' 

Если бы я был вынужден сделать последнее, я бы рассмотрел gziping mysqldump . Я считаю, что это спасло мне некоторое время передачи, независимо от того, что это не первый выбор.

 ssh root@server1 'mysqldump db | gzip -f' | ssh root@server2 'gzip -d | mysql db' 

Этот последний пример, возможно, не будет на 100% правильным, я просто предполагаю, что он должен работать.

Запросы пароля являются громоздкими. Способ сделать ssh более удобным для использования – использовать ключи для аутентификации и запустить агент ключа ( ssh-agent ), где вы можете зарегистрировать ключ один раз за сеанс (с дополнительным таймаутом). Затем вы можете напрямую запускать

 ssh root@server1 mysqldump --databases db | ssh root@server2 mysql 

Если вы можете войти с сервера1 на server2, вы должны перенести данные непосредственно между двумя серверами.

 ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql' 

(или наоборот, если вы можете войти с сервера2 на server1). Опять же, у вас есть SSH-ключ для аутентификации. На вашей локальной машине зарегистрируйте секретный ключ SSH, который дает вам доступ к серверу1 и тот, который дает вам доступ к серверу2; убедитесь, что перенаправление агентов включено ( AgentForwarding yes в ~/.ssh/config ).

Если вы действительно не можете избежать ввода пароля, лучше всего использовать соединение, затем перейдите и передайте данные. При наличии достаточно последних версий OpenSSH вы можете открыть главное соединение, а затем проложить через него ведомые подключения. Ведомые подключения не требуют дополнительной аутентификации. В вашем ~/.ssh/config :

 ControlMaster auto ControlPath ~/.ssh/control:%h:%p:%r 

Начать мастер-соединение с обоими серверами:

 ssh -N -M root@server1 & ssh -N -M root@server2 & 

Затем сделайте копию:

 ssh root@server1 mysqldump --databases db | ssh root@server2 mysql 

После этого вы можете убить мастер-соединения, если они вам больше не нужны.

 ssh -O exit root@server1 ssh -O exit root@server2 

В случае, если вы вынуждены перейти от A к B с помощью прокси-подобной машины, нет волшебной пули: вам придется использовать прокси-сервер, являющийся вашим компьютером или промежуточным сервером.

Это может быть довольно раздражающим, но ssh настолько гибким, что его можно сделать прозрачным. Если вы устанавливаете программу nc на прокси-сервер, вы можете добавить это в свой файл ~/.ssh/config из A :

 Host B ProxyCommand ssh -q my_proxy nc -q0 B 22 

И после этого вы сможете, начиная с A , сделать классические команды ssh / scp для B, как если бы не было прокси-сервера вообще.

Таким образом, с помощью этой конфигурации вы сможете использовать sshfs .

 sshfs B: /mnt/B_fs 

И с помощью sshfs ваша команда dump может выглядеть следующим образом:

  mysqldump --databases db ... > /mnt/B_fs/db.dump 

К сожалению, это не ускорит пропускную способность прокси. Лучшее, что вы можете сделать с помощью ssh, – включить Compression и повысить уровень CompressionLevel .

См. Это сообщение для более подробного объяснения о ssh multi-hop.

Насколько я понимаю, основная трудность, с которой вы сталкиваетесь, состоит в том, что вам нужно ввести два пароля: один для первого ssh-соединения (запись в трубу) и один для второго ssh-соединения (чтение из канала).

Одним из разумных способов решения этой (несколько необоснованной) проблемы является создание временного ключа без пароля для аутентификации из вашей локальной учетной записи в удаленные корневые учетные записи. Пока удаленная конфигурация демона ssh уже поддерживает проверку подлинности на основе ключа, вы можете настроить пароль без входа без изменения конфигурации sshd. Однако с помощью этого метода вам необходимо отредактировать список authorized_keys для удаленного пользователя.

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

 #!/bin/bash set -e # bail out if anything fails verbose= rmthosts="server1 server2" rmtuser=root # generate key with empty passphrase keyfn=~/.ssh/tmpid_rsa keycomment="tmpid_$USER@$HOSTNAME" rm -f $keyfn* ssh-keygen -t rsa -N '' -C $keycomment -f $keyfn # add key to remote accounts authfn=.ssh/authorized_keys for rmthost in $rmthosts do [ "$verbose" ] && echo "Adding key to $rmtuser@$rmthost:$authfn" < $keyfn.pub ssh $rmtuser@$rmthost "cat >>$authfn" done # perform your mysql copy [ "$verbose" ] && echo "Performing operation" ssh -i $keyfn rcp@gromit hostname | \ ssh -i $keyfn rcp@gromit "cat >/tmp/prog.out" # remove the temporary key [ "$verbose" ] && echo "Removing temporary keys" for rmthost in $rmthosts do ssh -i $keyfn $rmtuser@$rmthost "sed -i '/$keycomment/d' $authfn" done ssh-add -d $keyfn rm -f $keyfn* 

Ключевыми решениями являются лучшие вещи. Но если вы по какой-то причине не можете этого сделать, вы можете изменить свой cmdline на

 ssh root@server1 mysqldump --databases db | {sleep 5; ssh root@server2 mysql; } 

чтобы ожидание 2-й команды. Отрегулируйте 5 соответствии с тем, как быстро вы вводите первый пароль.

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

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

В первом типе оболочки

 mkfifo ~/db_dump cat db_dumb | ssh root@server2 mysql 

и введите второй пароль.

В другом типе оболочки

 ssh root@server1 mysqldump --databases db >~/db_dump 

и введите первый пароль.

Когда дамп сделан:

 rm ~/db_dump 

в любой оболочке.

Я думаю, что вы можете сначала запустить дамп, а второй – восстановить. Не должно быть большой разницы.

  • псевдо-интерактивный скрипт ssh
  • Вход SSH на удаленный компьютер с другого удаленного компьютера. Как управлять соединениями?
  • Опция «исключение» в оболочке TCP
  • Как различать SSH и SCP для QoS в OpenWRT (и других системах)?
  • Туннелирование SSH через несколько машин (для SOCKS)
  • Настройка туннелирования SSH без пароля с домашнего компьютера за NAT на внутренний компьютер за шлюзом
  • запустить Sshd на Mac
  • Есть ли способ использовать ssh удаленно без настройки брандмауэра?
  • Loop в скрипте на удаленном сервере не работает
  • Как я могу передать ssh на удаленный сервер с автоматическим паролем и без ключа?
  • Расширение переменной в ssh_config
  • Interesting Posts

    Храните все файлы того же месяца + последний файл до этого, удалите остальные

    Можете ли вы Chroot программы из среды OpenVZ?

    как регистратор доменов обновляет корневые DNS-серверы

    Как показать только последние две цифры числа в LibreOffice Calc?

    Можно ли игнорировать скрытые файлы Windows?

    Аутентификация ключа ssh не работает из сети / if-up.d / scripts

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

    Храните живой клон машины в другой

    Как создать предварительно настроенные параметры загрузки ядра в Debian Installer

    Создание субтитров (.srt) больше или меньше с помощью mpv

    Как сделать Nohup интерактивным shell-скриптом?

    Разрешение 0000 в / var / www / html через sFTP

    Используя VIM, как мне перенаправить направленные клавиши с правой руки на левую руку?

    Остановить все процессы пользователем: дети супервизора все еще работают

    grep искать error_log и отправлять сообщения только по электронной почте, когда результаты будут найдены?

    Linux и Unix - лучшая ОС в мире.