sshによるrsyncパスワードなしでファイルを転送
問題の説明
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の作成 gidおよびuidはいずれも1212であるが、この例では、既存のユーザおよびグループと競合しないことを保証する限り、他の値を選択することもできる ."-m"は、csdnユーザにホームディレクトリを作成することを示す.すなわち、/home/csdn/ である.
2.[ローカルマシン]ssh-keygenで鍵を生成する key file pathの入力を求めるメッセージが表示された場合、既存のrootアカウントのid_を上書きしないようにするrsaファイル、/usr/rsync_に格納id_dsa ファイルのパスワードの入力を提示する時、直接車に戻ることを押して、空のパスワード を採用しますは最後に2つのファイルを生成し、それぞれ秘密鍵と公開鍵 を記憶する.
3.[ローカルマシン]リモートマシンcsdnアカウントの.sshディレクトリに公開鍵を転送
これにより、パスワードを入力せずに2つのマシン間でファイルとディレクトリを同期できます.たとえば、最も簡単なコマンドです.
上は最も簡単なrsyncコマンドにすぎませんが、実はrsyncには興味深い選択肢がたくさんあり、多くのハイエンドの大気レベルの機能を完成させるのに役立ちます.たとえば、次のコマンドは、2つのマシン間でディレクトリ全体を転送し、転送が完了した後にソースファイルを削除するためのより複雑なコマンドです.-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)など
linuxプラットフォームではrsyncプロトコルがファイルとディレクトリを同期するためによく使用され、「rsync」も各種linuxリリース版に標準化されたコマンドです.linuxプラットフォームに基づいてアプリケーションを開発する場合、JavaまたはPythonコードからrsyncコマンドを呼び出してファイルの転送を実現する必要があることがよくあります.
たとえば、ファイルを次のように転送するとします.
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
注意: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.
注意: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ドキュメントを参照してください.ここでは簡単に説明します.