2012-03-23 9 views
2

マシンB(linux)からマシンCまでsftpする必要のあるファイルがいくつかあります。マシンA(windows server 2003)でタスクを開始し、Windowsスケジューラでスケジュールする必要があります。どうしたらいいですか?マシンAからマシンBからマシンCへのsftpを自動化するにはどうすればいいですか?

私は対話的に、このようにそれを行うだろう:は、telnetでマシンAからマシンBの

  • のtelnetにマシンB
    1. FTPマシンCにマシンBからSFTPをファイルをマシンBからマシンCにファイルを転送してください。

    マシンAのスクリプトは、どのようにしてWindowsで実行できますか?他のソフトウェアをインストールすることはできません。

  • +0

    あなたのファイルはAにあり、それをBにftpしたい、そしてBからsをCに変換したいですか? – dhchen

    +0

    はい。 BのみがCに接続でき、ファイルがAにあるので、これがシナリオです。 – lamwaiman1988

    +0

    Bにスクリプトを書き込めますか? – dhchen

    答えて

    3

    あなたはftp、telnet、およびsftpに言及しました。これらのスクリプトは、expectのようなスクリプトやAの複雑なスクリプトを使ってスクリプト化することができます。しかし、このunixトリックをAからすべて実行するには、AからBへのsshが可能である必要があります。 BからCへ。これらの接続にパスワードが必要ないように、ID認証の設定が必要です。 (あなたは、両方の接続のためのAのアイデンティティのエージェント転送を使用することができます。)その後にこのような何かを実行します。

    B上のファイルを格納することなく、Bを経由して、AからCへファイルを移動します
    cat file-on-a | ssh B "ssh C 'cat > file-on-c'" 
    

    Cygwinの一部であるsshとcatを使用する前に、私はこの種のことをWindowsで行っています。私はどのようにそのコマンドの作品約2ワードを言っているはず:私はそれが他のウィンドウのツールでどのように動作するかをよく知っている...

    編集しないでください。 sshプログラムは、パイプを提供し、ローカルマシンとリモートマシンの間でデータを前後に移動します。通常、このパイプはリモートエンドのシェルに接続され、より良いセキュリティを除いてtelnetと同じ目的を果たします。ただし、パイプは何でも使用できます。 sftpユーティリティは、そのパイプを使用してファイルを移動します。 sshコマンドは、リモートシステム上で実行するコマンドを取ることができます。たとえば、ssh B lsはBに接続し、lsを実行して結果を返します。上記のコマンドが行うことは、sshからBへ、そしてBにCと接続するsshを実行するように依頼します。これは、パイプからA、B、Cへのパイプを与えます。 catプログラムはファイルを読み取り、標準出力に書き込みます。ファイル名が指定されていない場合は、標準入力を読み取ります。cat file-on-aAマシン上のファイルを読み取り、sshコマンドに書き込みます。 cat > file-on-cは送信されたデータを読み取り、> file-on-cの部分(シェルのおかげで)はファイルfile-on-cに書き込みます。再び

    ではなく、これはあなたの環境ではオプションである場合に確認してください。それが役に立てば幸い。

    1

    あなたはそれが手遅れになる前にRabbitMQのようなものの中に見てみたいことがあります。メッセージキューイングとリモートスクリプトを使用することで、これらのようなタスクが正しく完了するようにすることができます。

    私はそれが簡単なスクリプトよりもはるかに多くを必要としますが、メッセージングを使用すると、大幅に時間をかけて、クロスプラットフォームの管理を減らすことができ、これは、あなたが探していた答えではないことを知っています。

    実際に説明されているようにアクションを実行する必要がある場合は、Rob's answerを使用できますが、空白のキーを使用するのはセキュリティ上の最善の方法ではありません。代わりに、B上のスクリプトがCで(ftp/sftp/rsyncまたはリモートマウント経由で)同期されているBのスクリプトがB上でスクリプトを要求するB上の単純なドロップディレクトリになります。

    1

    あなたは2台のLinuxマシン間でWindowsの仲介を使用しているようですが、最も寛容な勧告はSSHFSWindows systemsとして調べることです。

    マシンAとマシンCの間のパイプラインをWindows環境で維持することが望ましい場合は、ピックアップポイント(A)とドロップポイント(C)の両方に接続して、 Batch automationファイルを自動的に送信します。これは失敗に耐えられるものではありません(何らかの再接続プロトコルを確立する必要があります)が、心配ですが、状況が悪くなったり、このシステムを通過したときにGUIで実行できるという利点があります誰かに

    それ以外の場合は、これはシェルから実行できるようにすばやく実行できるジョブであれば、Rob is correctです。シンプルなパイプステープルで簡単かつ正確に行うことができます。

    1

    もしBのみがCに接続でき、AからCへのファイルを取得したいのであれば、BからCへのSSHトンネルの使用をお勧めします。 この方法で、AからC、B 。

    ボックスBからボックスCにSSHトンネルを作る:

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

    そしてボックスAからは、に接続してCのSFTPをボックスに接続:

    box-b.com:3025

    トンネルを自動化して何が起きてもそれを生かし続けるには、autossh-http://www.harding.motd.ca/autossh/(ほとんどのLinuxディストリビューションに付属)を使うことをお勧めします。

    あなたがbox-b.com:3025へのアクセスから他の人をブロックしたい場合は、専用ボックスのA.

    からそのポートへの接続を許可するために使用ボックスBのファイアウォール私は時々似たような状況で取得し、これが最も簡単です私が見つけた解決策。

    2

    これを行うための正しい方法は、一般的にsshとsftpのと同じパッケージで提供されます「SCP」であり、そしてこれだけのことを除いて、「CP」のように動作のいずれかまたは両方のパスは、リモートすることができ:

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

    開始マシンにscpを含むsshクライアントが必要ですが、おそらくそれはすでにあります。

    +0

    両方のファイルをリモートにすることができますが、Aは転送を開始しなければならず、AはCに直接アクセスすることはできませんでした(BのみがCにアクセスできます)。それでも、scpについての良い知らせ。 – rob

    +0

    新しいバージョンの 'scp'は' -3'オプションを持っています:http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1 – raylu

    関連する問題