如何通过 ssh 启动从一台服务器到另一台服务器的 rsync 传输?

如何通过 ssh 启动从一台服务器到另一台服务器的 rsync 传输?

我试图轻松地将一些数据rsync从一台服务器移动到另一台服务器,而无需实际手动连接并执行所有这些操作,而只提供 IP 作为参数。

# -- 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是不起作用的。其余的工作完美无缺。

我确实需要那些双引号""来包裹将在屏幕会话内运行的整个 bash 命令,以及需要的''ssh 选项的单引号rsync

我的问题是如何将它们全部放在一起以便一切正常?

答案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
"

相关内容