scp с одного удаленного сервера на другой удаленный сервер

У меня есть один большой файл на сервере, и я хочу скопировать его на two сервер с помощью scp . Я правильно настроил ключи, и я могу ssh / scp на оба сервера с моего рабочего стола.

Файл, который мне нужно скопировать, больше, чем свободное место на hdd моей рабочей станции, поэтому я хотел:

 scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz 

но я получил:

 ssh: Could not resolve hostname one: Name or service not known 

У нас нет DNS здесь (не спрашивайте меня почему), поэтому у меня это в моей ~ / .ssh / config:

 Host one Hostname <IP address of server one> User jspurny Host two Hostname <IP address of server two> User jspurny 

Если я попытаюсь с меньшим файлом и перенести его с one на мою рабочую станцию, а затем на two , он отлично работает:

 scp one:/opt/smallerfile.tar.gz . scp smallerfile.tar.gz two:/opt/ 

При использовании IP-адресов непосредственно, как указано в комментарии, я получил:

 $ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz Host key verification failed. lost connection 

Не ошибка:

Размер здесь не является проблемой – это был только «триггер» этой проблемы, так как не было возможности хранить bigfile.tar.gz на моей рабочей станции. Проблема возникает независимо от размера файла.

Вопрос:

Почему команда:

 scp oneremote:file secondremote:file 

выдает ошибку, независимо от того, используете ли вы .ssh/config псевдонимы или напрямую используете ip-адреса?

Решено – вроде – все еще ищут объяснения – я разделил файл bigfile на более мелкие файлы и передал их один за другим через мою рабочую станцию. Мне все еще интересно, почему это не сработало. Поэтому я по-прежнему буду признателен за некоторое объяснение того, что было не так.

Нашел причину, по которой это не удалось : кажется, я был глуп. Я думал, что команда

 scp one:file two:file 

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

Это явно не так, потому что простая опция -v показала, что она на самом деле просто соединяется с одним и с одним, который пытается подключиться к двум . Который, очевидно, невозможен, потому что серверный сервер не должен подключаться к двум .

  • Команда scp над ssh без пароля в скрипте
  • Ошибка SSHFS, Ошибка - чтение: Сброс соединения с помощью одноранговой сети
  • Как включить локальную ~ автозаполнение для scp?
  • Как разбить массив в наборе из пяти файлов и загрузить их параллельно?
  • Копирование файлов с одного компьютера на другой без запроса пароля
  • Как ввести сетевой файл в ffmpeg
  • Передача файлов Сообщение SSH SCP об ошибке: «Stdin: не является tty»
  • SSH на удаленную машину с использованием другого локального идентификатора
  • 4 Solutions collect form web for “scp с одного удаленного сервера на другой удаленный сервер”

    Простая труба

    Попробуй это:

     ssh one 'cat file' | ssh two 'cat > file' 

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

    Разработка туннелей

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

     ssh -R 5001:127.0.0.1:5002 one ssh -L 5002:127.0.0.1:22 two 

    Затем вы можете открыть соединение на one компьютере для localhost порта 5001 и он будет перенаправлен дважды и в конечном итоге будет соединен с two портами 22 с localhost . Это ssh-порт, поэтому вы можете использовать его для еще одного scp, или для rsync или что-то еще. Вы также можете запустить rsync сервер на two и переадресовать порт 873 вместо 22. Или вы можете использовать nc с обеих сторон для передачи необработанных данных с использованием произвольного номера порта.

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

    Полный кредит для этого ответа указан на https://superuser.com/a/602436/142948

    Вам нужна опция -3 для scp:

     scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz 

    -3 : Копии между двумя удаленными хостами передаются через локальный хост. Без этой опции данные копируются напрямую между двумя удаленными хостами.

    http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1

    В противном случае 2-й псевдоним «два» разрешается на хосте «один» , который может отсутствовать.

    Поскольку у вас есть пользовательский доступ к исходному серверу (один), почему бы вам не войти в систему и не запустить вашу команду scp на этом сервере напрямую … Если вы беспокоитесь, что это займет слишком много времени, тогда запустите команду внутри screen затем отсоедините ее от экрана Ctrl+ad и пусть он запускается.

    Однако, если вы должны сделать это со своей рабочей станции, а ключи SSH от источника к целевому серверу работают нормально, отправьте команду scp в качестве параметра команды ssh , например:

     ssh user@source 'scp /path/to/file user@destination:/path/to/file' 

    Поиск сообщения об ошибке: «Ошибка проверки ключа хоста». Казалось бы, это самая простая вещь. Я нашел этот вопрос и ответы на askubuntu под названием « Проблема с соединением SSH с ошибкой« Проверка ключа хоста … » .

    Один из ответов на эти вопросы и ответы предположил, что проблема связана с конфликтующей записью в файле ~/.ssh/known_hosts . Вы можете либо удалить неприятные записи из этого файла с помощью любого текстового редактора, либо вы можете использовать эту команду для удаления записей:

     $ ssh-keygen -R hostname 

    Где hostname будет либо IP-адресом, либо именем сервера, с которого вы пытаетесь подключиться. Все это было бы на хосте, кстати, кстати.

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