Как автоматизировать sftp с машины B на машину C с машиной A? - PullRequest
2 голосов
/ 23 марта 2012

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

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

  1. ftp файлы с компьютера A на компьютер B.
  2. telnet на компьютер B.
  3. с помощью telnet, sftp с машины B на машину C, поместите файлы с машины B на машину C.

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

Ответы [ 5 ]

3 голосов
/ 28 марта 2012

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

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

, который переместит файл из A в C, через B, без сохранения файлана B.

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

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

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

2 голосов
/ 31 марта 2012

Правильный способ сделать это - использовать 'scp', который обычно поставляется в том же пакете, что и ssh и sftp, и работает так же, как 'cp', за исключением того, что один или оба пути могут быть удаленными:

scp user@machineA:/path/to/file user@machineB:/path/to/file

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

1 голос
/ 31 марта 2012

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

Из коробки B создайте ssh-туннель для коробки C:

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

Затем из коробки A подключитесь к sftp коробки C, подключившись к:

box-b.com: 3025

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

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

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

1 голос
/ 31 марта 2012

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

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

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

1 голос
/ 31 марта 2012

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

Я знаю, что это не тот ответ, который вы искали, поскольку он потребует гораздо большего, чем простой сценарий, но использование обмена сообщениями может значительно сократить кроссплатформенное администрирование со временем.Если вам действительно нужно выполнить действие, как описано, то вы можете использовать file-on-c'""> ответ Роба , но использование пустых ключей противоречит наилучшей практике безопасности.Альтернативой может быть простой перетаскиваемый каталог на B, который отслеживает скрипт на B, который синхронизируется с C (либо через ftp / sftp / rsync, либо даже удаленное монтирование) - опять же требуется скрипт на B.

...