2012-03-23 1 views
2

У меня есть файлы, которые должны быть sftp с машины B (linux) на машину C. Нам нужно запустить задачу на машине A (Windows Server 2003) и запланировать ее в Планировщике Windows. Как мне это сделать?Как автоматизировать sftp от машины B до машины C с машиной A?

Я хотел бы сделать это в интерактивном режиме, как это:

  1. FTP файлы из машины А в машине В.
  2. телнет к машине В.
  3. с телнет, SFTP из машины B машинному C , поместите файлы из машины B в машину C.

Как это сделать со сценарием на машине A, который является окном? Я не могу установить какое-либо другое программное обеспечение.

+0

Ваш файл находится на A, и вы хотите ftp его к B, а затем от B sftp до C? – dhchen

+0

Да. Это сценарий, потому что только B может подключить C, а файлы находятся на A. – lamwaiman1988

+0

Можете ли вы писать сценарии на B? – dhchen

ответ

3

Вы упомянули ftp, telnet и sftp. Они могут быть написаны с помощью чего-то вроде ожидания или с помощью некоторого сложного сценария на A. Однако вы можете использовать этот трюк unix, чтобы сделать все это от A. Вам нужно будет иметь возможность ssh от A до B, и от B до C. Вам понадобится настройка идентификации, так что для этих соединений не требуется пароль. (Вы можете использовать экспедитором тождественных на А для обоих соединений.) Затем запустите что-то вроде этого на:

cat file-on-a | ssh B "ssh C 'cat > file-on-c'" 

Это переместит файл от А до С, через B, без сохранения файла на B .

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

EDIT: Я должен был сказать слово двум о том, как эта команда работает. Программа ssh предоставляет трубу видов для перемещения данных взад и вперед между локальной и удаленной машиной. Обычно эта трубка подключается к оболочке на удаленном конце и служит для той же цели, что и telnet, за исключением лучшей безопасности. Однако, это труба может использоваться для чего угодно. Утилита sftp использует этот канал для перемещения файлов. Команда ssh может взять команду для выполнения в удаленной системе. Например, ssh B ls подключится к B, запустит ls и отправит результаты обратно вам. То, что делает вышеприведенная команда, это ssh to B, и попросить B запустить ssh-соединение с C. Это дает нам трубу от A до B от C. Теперь, что делать на обоих концах? Программа cat считывает файлы и записывает их в стандартную версию. Если имена файлов не указаны, он считывает стандартные значения. cat file-on-a читает файл на машине A и записывает его в команду ssh. cat > file-on-c считывает данные, отправленные на него, а часть > file-on-c (благодаря оболочке) записывает это в файл file-on-c.

Опять же, не уверен, что это вариант в вашей среде. Надеюсь, поможет.

1

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

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

Если вам действительно необходимо выполнить действие, как описано ниже, вы можете использовать Rob's answer, но использование пустых ключей противоречит лучшей практике безопасности. Альтернативой может быть простой каталог на B, который работает на сценарии на B, который синхронизируется с C (либо через ftp/sftp/rsync, либо даже с удаленным креплением) - снова требуется сценарий на B.

1

вы, кажется, используете посредник Windows между двумя машинами Linux, самая идиоматическая рекомендация - изучить вас SSHFS за Windows systems.

Ваш идеальный случай, если поддерживать связь между машинами A и C желательно в среде Windows, заключается в том, чтобы иметь возможность подключаться как к точке пикапа (на A), так и к точке падения (на C) и просто писать некоторые Batch automation для отправки файлов автоматически. Это не является устойчивым к ошибкам, заметьте (вам нужно будет установить какой-то протокол пересоединения), но у него есть дополнительное преимущество в том, что вы можете сделать это в своем графическом интерфейсе, когда что-то пойдет не так, или когда вы передаете эту систему на кому-то другому.

В противном случае, если это оперативная работа, которую можно с уверенностью запускать из оболочки, Rob is correct. Это можно сделать, кратко и правильно, с простым сшиванием труб.

1

Если вы говорите, что только B может подключиться к C, и вы хотите получить файлы от A до C, я бы предложил использовать SSH-туннель от B до C. Таким образом, вы могли бы получить доступ от A до C через B .

из коробки B сделать SSH туннель к коробке C:

ssh box-c.com -gL 3025:localhost:22 

Тогда из ящик подключить к блоку C SFTP путем подключения к:

box-b.com:3025

Чтобы автоматизировать создание туннеля и сохранить его, независимо от того, что произойдет, я предлагаю использовать autossh - http://www.harding.motd.ca/autossh/ (поставляется с большинством дистрибутивов Linux).

Если вы хотите, чтобы блокировать доступ посторонних box-b.com:3025, используйте окно B брандмауэра разрешить подключения к этому порту только из коробки А.

меня иногда в подобной ситуации, и это самый простой решение, которое я нашел.

2

Правильный способ сделать это с помощью «УПП», который обычно приходит в том же пакете, SSH и SFTP, и который работает так же, как «ф» за исключением того, что один или оба пути могут быть удалены:

scp [email protected]:/path/to/file [email protected]:/path/to/file 

Вам нужен клиент ssh, который включает scp на инициирующей машине, но вы, вероятно, уже имеете это.

+0

Напоминаем, что оба файла могут быть удалены, но проблема заключалась в том, что A должен был инициировать передачу, и A не имеет прямого доступа к C (только B может получить доступ к C). Тем не менее, хорошее напоминание о scp. – rob

+0

Новые версии 'scp' имеют параметр' -3': http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1 – raylu