Несколько сеансов 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 

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

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

  • Как НЕ использовать ksshaskpass с ssh
  • Переслать X11 через два туннеля SSH
  • убедитесь, что все сеансы tmux прекращаются, когда сеанс SSH заканчивается
  • Греблирование только SSH-соединений с netstat
  • Есть ли техническая причина, по которой ssh-agent не имеет функции sudo-like бездействия или времени ожидания?
  • Сервер SSH синхронизирует локальный хост и переназначает разрывы выхода X11
  • Как показать и использовать удаленный рабочий стол Linux, когда SSH или любая другая удаленная служба недоступна?
  • ssh на несколько хостов и запустить команду
  • Проблемы с Gnu Screen и vi - визуализация
  • Первичный трафик на контейнер Docker
  • выйдите из всех соединений SSH в одной команде и закройте PuTTY
  • Linux и Unix - лучшая ОС в мире.