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
스크립트의 마지막 부분, 효과가 없는 부분 . 나머지는 완벽하게 작동합니다.
""
screen 세션 내에서 실행될 전체 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
"