まず、あるシステムから別のシステムに変更を移動したいのですが、そのためにsynchfolders.sh
次のようなシェルスクリプトがファイルにあります。
rsync -av --delete -e 'sshpass -p Wordpress@123 ssh -p 22' [email protected]:/var/www/html/prosync/wp-content/plugins/ /var/www/html/devsync/wp-content/plugins >> /var/www/html/devsync/wp-content/mysynclog.txt
そして、このシェルスクリプトをPHPファイルで実行したいのですshell_exec()
が、ブラウザからこのPHPファイルを実行すると、rsyncコマンド以外はすべて実行されていますが、はrsync
実行されていません。SOで検索したところ、リンクが見つかりました。https://stackoverflow.com/questions/30772816/php-exec-rsync-ssh-to-remote-server-not-working/30773063#30773063ここで述べたように、コマンドラインから PHP ファイルの実行を試しましたが、完璧に動作しますが、ブラウザからは動作しません。なぜでしょうか。どこで間違いを犯したのか教えてください。よろしくお願いします。
答え1
一般的に、通常の対話型シェルから実行されないスクリプトでは、次のいずれかを確実にする必要があります。絶対パスを使用する(/usr/bin/rsync
つまり の代わりにrsync
)または適切な環境を整える$PATHに適切な値を設定する
追加の改善点として、スクリプトで使用するために、パスワード ベースの認証ではなく、キー ベースの SSH 認証を設定する必要があります。
パスワードの使用をやめてキーの使用を開始すると、SSH サーバーをロックダウンして保護できます (パスワード認証を無効にすると、ブルート フォース攻撃が阻止されます)。さらに重要なことは、特定のキーが認証に使用される場合に許可される内容に制限を追加できることです。これは、パスワードでは実行できません。
スクリプト内で使用されるキーを制限して、特定のホストからの rsync にのみ使用できるようにすることができます。
そうすれば、スクリプトが侵害されたとしても、ルート パスワード (サーバーへの完全な制御を許可するもの) が盗まれることはなく、制限付きアクセスを許可する秘密キーだけが盗まれることになります (秘密キーが使用可能になったとしても)。