SSHを介してあるサーバーから別のサーバーへのrsync転送をどのように開始しますか?

SSHを介してあるサーバーから別のサーバーへのrsync転送をどのように開始しますか?

rsyncIPをパラメータとして提供し、実際に手動で接続し、これらすべてを実行せずに一部のデータをあるサーバーから別のサーバーに簡単に移動したいと思います。

# -- Variables
my_key="my_key"
new_ct="${2}"
old_ct="${1}"

# -- SHH key generation on the localhost
mkdir /tmp/keys/
cd /tmp/keys
ssh-keygen -t ed25519 -f /tmp/keys/id_ed25519 -q -N ""; \

# -- Copy the keys on the old_ct
scp -P 2222 -o StrictHostKeyChecking=no -i ${HOME}/.ssh/${my_key} \ /tmp/keys/id_* root@${old_ct}:~/.ssh/

# -- Copy the key to new_ct and write it to authorized_keys file
scp -P 2222 -o StrictHostKeyChecking=no -i ${HOME}/.ssh/${my_key} \
/tmp/keys/id_ed25519.pub root@${new_box}:~/.ssh/
ssh -o StrictHostKeyChecking=no root@${new_ct} -p 2222 -i ${HOME}/.ssh/${my_key} \
"cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys"

# -- Lastly, start the rsync transfer on the old_ct in a detached screen session
ssh -o StrictHostKeyChecking=no root@${old_ct} -p 2222 -i ${HOME}/.ssh/${my_key} \
"
screen -dmLS "migrating.localdata.to.newCT" \
bash -c "rsync -azvhHSP --stats -e \
'ssh -p 2222 -o StrictHostKeyChecking=no' \
/home/user root@${new_ct}:/home"
"
  
# -- Remove the keys
rm -rf /tmp/keys

rsyncスクリプトの最後の部分、効果のない部分。残りは完璧に動作します。

""screenセッション内で実行される完全なbashコマンドをラップするには二重引用符が必要で、必要な''sshオプションの一重引用符も必要ですrsync

私の質問は、すべてがうまくいくようにすべてを1つにまとめることです。

ベストアンサー1

二重引用符があります。~へ二重引用符(例"migrating.localdata.to.newCT":)。文字通り処理するには、内部二重引用符をエスケープする必要があります。

ssh -o StrictHostKeyChecking=no root@${old_ct} -p 2222 -i ${HOME}/.ssh/${my_key} \
"
screen -dmLS \"migrating.localdata.to.newCT\" \
bash -c \"rsync -azvhHSP --stats -e \
'ssh -p 2222 -o StrictHostKeyChecking=no' \
/home/user root@${new_ct}:/home\"
"

bash -cちなみに、画面の後ろから走る必要はありません。画面の後にコマンドとパラメータを追加するだけで実行されます。これにより、入れ子になった引用符とエスケープを減らすことができます。

ssh -o StrictHostKeyChecking=no root@${old_ct} -p 2222 -i ${HOME}/.ssh/${my_key} \
"
screen -dmLS 'migrating.localdata.to.newCT' \
rsync -azvhHSP --stats -e \
'ssh -p 2222 -o StrictHostKeyChecking=no' \
/home/user root@${new_ct}:/home
"

おすすめ記事