sshによるrsyncパスワードなしでファイルを転送

3753 ワード

問題の説明
linuxプラットフォームではrsyncプロトコルがファイルとディレクトリを同期するためによく使用され、「rsync」も各種linuxリリース版に標準化されたコマンドです.linuxプラットフォームに基づいてアプリケーションを開発する場合、JavaまたはPythonコードからrsyncコマンドを呼び出してファイルの転送を実現する必要があることがよくあります.
たとえば、ファイルを次のように転送するとします.
  • には2台のマシンがあります:localhostとremotehost
  • Javaプログラムdeployはlocalhost上でrsyncを介してネイティブファイルをremotehostに転送するか、remotehost pullファイルからlocalhost
  • に転送する.
  • rsyncはsshを介してremotehost
  • に接続する
  • remotehostにはrsync転送ファイル専用のcsdnというアカウントがあり、鍵ファイルで
  • にログインするしかありません.
  • 最も重要なのは、rsync接続中にcsdnのアカウントパスワードを入力する必要がないことです.そうしないと、パスワード入力インタフェースがJavaプログラムの実行
  • をブロックします.
    rsyncのパスワードレス伝送を実現するには,アカウントパスワードの代わりに一対の公開鍵を用いてssh接続時の認証を実現することが基本構想である.
    次に、一歩一歩どのように実現するかを見てみましょう.
    rsyncの構成
    1.[リモートマシン]専用アカウントcsdnの作成
    #      csdn
    $ groupadd -g 1212 csdn
    
    #   csdn  ,   csdn   
    $ useradd -m -s /bin/bash -g 1212 -u 1212 csdn
    
    #  csdn  .ssh  
    $ mkdir /home/csdn/.ssh
    $ chown csdn:csdn /home/csdn/.ssh
    注意:
  • gidおよびuidはいずれも1212であるが、この例では、既存のユーザおよびグループと競合しないことを保証する限り、他の値を選択することもできる
  • .
  • "-m"は、csdnユーザにホームディレクトリを作成することを示す.すなわち、/home/csdn/
  • である.
    2.[ローカルマシン]ssh-keygenで鍵を生成する
    [root@xxxx ~]$ ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): /usr/rsync_id_dsa
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /usr/rsync_id_dsa.
    Your public key has been saved in /usr/rsync_id_dsa.pub.
    
    注意:
  • key file pathの入力を求めるメッセージが表示された場合、既存のrootアカウントのid_を上書きしないようにするrsaファイル、/usr/rsync_に格納id_dsa
  • ファイルのパスワードの入力を提示する時、直接車に戻ることを押して、空のパスワード
  • を採用します
  • は最後に2つのファイルを生成し、それぞれ秘密鍵と公開鍵
  • を記憶する.
    3.[ローカルマシン]リモートマシンcsdnアカウントの.sshディレクトリに公開鍵を転送
    $ scp /usr/rsync_id_dsa.pub [email protected]:/home/csdn/.ssh
    4.[リモートマシン]転送された公開鍵をcsdnのauthorized_にインポートkeysファイル
    $ cd /home/csdn/.ssh
    $ cat rsync_id_dsa.pub > authorized_keys
    $ chown csdn:csdn authorized_keys
    rsyncコマンド
    これにより、パスワードを入力せずに2つのマシン間でファイルとディレクトリを同期できます.たとえば、最も簡単なコマンドです.
    $ rsync -e "ssh -i /usr/rsync_id_dsa" /tmp/testfile csdn@remotehost:/tmp/
    JavaまたはPythonコードからrsyncコマンドを構築する場合、-e「ssh-i xxxxx」を一般的なcommand optionとして使用するのは難しい場合があります.ここでは、rsyncコマンドを起動する前にrsyncプロセスに環境変数:RSYNC_を追加する簡単な代替方法があります.RSH="ssh -i xxxx"
    上は最も簡単なrsyncコマンドにすぎませんが、実はrsyncには興味深い選択肢がたくさんあり、多くのハイエンドの大気レベルの機能を完成させるのに役立ちます.たとえば、次のコマンドは、2つのマシン間でディレクトリ全体を転送し、転送が完了した後にソースファイルを削除するためのより複雑なコマンドです.
    $ rsync -e "ssh -i /usr/rsync_id_dsa" -v --progress -r -z --compress-level=9 -o -g -p --remove-source-files --temp-dir=/tmp/rsynctmpdir/ --partial-dir=/tmp/rsynctmpdir/ --delay-updates --itemize-changes --out-format=FILEDETAIL::%%n::%%l::%%i::%%M /tmp/testfolder/ csdn@remotehost:/tmp/testfolder/
    具体的なパラメータの意味はrsyncドキュメントを参照してください.ここでは簡単に説明します.
  • -v:伝送中に印刷する変調情報
  • --progress:転送中に現在の進捗を印刷する
  • -r:すべてのサブディレクトリとファイルを再帰的に転送する
  • -z,--compress-level=9:転送中にファイルを圧縮し、転送効率を向上させる
  • -o,-g,-p:転送中にファイルを保持するownership,groupおよびpermission
  • --remove-source-files:転送が終了したらソースファイルを削除します.rsync 2.xでは、対応するオプションは--remove-sent-files
  • です.
  • --temp-dir,--partial-dir,--delay-updates:ソースディレクトリの下にあるすべてのファイルをtransactionに配置するか、すべて成功するか、すべて失敗します.転送中にtemp-dirとpartial-dirにファイルを配置し、すべて完了してからターゲットディレクトリに移動します.これらのオプションは、remotehostに他のプログラムがconsume転送が完了した後のファイルを必要とする場合に特に役立ちます.
  • --itemize-changes、--out-format:指定したフォーマットで転送するファイル情報を出力します.これは、アプリケーションが転送するファイルのリストをキャプチャする必要がある場合に便利です.たとえば、アプリケーションは、2つのマシン間で同期するディレクトリ(localhostからremotehost、またはremotehostからlocalhost)のみを指定し、rsyncのoutputを取得し、対応する出力行をフィルタします(--out-formatで指定した「FILEDETAIL」接頭辞文字列に基づいて)、ディレクトリの下のファイルリストを構築できます.たとえば、ファイル名(%%n)、ファイルサイズ(%%l)など