Linux

如何通過 ssh 啟動從一台伺服器到另一台伺服器的 rsync 傳輸?

  • March 1, 2022

我試圖輕鬆地將一些數據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

我的問題是如何把它們全部放在這樣的地方,這樣它就可以正常工作了?

雙引號有雙引號(例如,"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
"

引用自:https://unix.stackexchange.com/questions/692512