/etc
rsync를 수행하는 동안 쉘 확장을 처리하지 않았기 때문에 폴더 에 있는 구성 파일이 모두 엉망이 되었습니다 .
rsync --progress --delete -avhHe ssh /etc/logrotate.d/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc
내 생각에 문제는 '.' 다음 logrotate가 확장되고 이후에 일부 폴더가 /etc/httpd
삭제되었습니다.
나는 이 실수를 올바르게 수행함으로써 교훈을 얻고 싶습니다. SSH를 사용하여 여러 파일을 rsync할 때 쉘 확장을 어떻게 방지합니까?
답변1
그 명령은 다음과 같이 요약됩니다.
rsync --delete --recursive /etc/logrotate.d/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc
거기 .
에는 문자 그대로의 의미가 있습니다. 이름의 일부이므로 문제가 되지 않습니다. 의 부분은 {}
다음에 따라 달라질 수 있습니다.버팀대 확장: 쉼표로 구분된 각 부분은 확장되어 이전 인수 부분( /etc/logrotate.d/
)에 연결됩니다. (무엇이든 있으면 다음에도 무엇이든 얻을 수 있습니다: a{BC}d
로 확장됩니다 aBd aCd
).
따라서 이 명령은 다음과 같습니다.
rsync --delete --recursive /etc/logrotate.d/httpd /etc/logrotate.d/mariadb /etc/logrotate.d/php-fpm /etc/logrotate.d/ppp /etc/logrotate.d/wpa_supplicant /etc/logrotate.d/yum [email protected]:/etc
또는 디렉터리 하나만 선택하여 짧게 하려면 다음과 같이 하세요.
rsync --delete --recursive /etc/logrotate.d/httpd [email protected]:/etc
rsync는 "from" 위치를 단일 엔터티로 해석합니다.그렇지 않다a로 끝나면 /
주어진 대상 경로 내에서 해당 이름의 마지막 부분만 사용하여 새 파일이나 디렉터리를 만듭니다. 여기서는 입니다 httpd
. 그래서 이것은 /etc/httpd
대상에 을 만들고 /etc/logrotate.d/httpd
그 내용을 복사합니다.
를 사용하면 --delete
다음과 같습니다.모두 삭제저것아니었다/etc/logrotate.d/httpd
소스에 있습니다 . 문제는 /etc/logrotate.d/httpd
아마도 전혀 존재하지 않을 것이기 때문에 이를 복사하고 소스에 없는 파일을 삭제하는 것은해당 디렉토리의 모든 항목을 삭제합니다.. 존재한다면 그 내용은 와 동일하지 않으므로 /etc/httpd
(거의) 모든 것이 삭제됩니다.
따라서 문제는 logrotate.d
실제로 동일한 디렉토리를 /etc
. 아마도 당신이 의미한 것은 다음과 같습니다:
rsync --progress --delete -avhHe ssh /etc/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc
이는 복사 /etc/httpd
및 해당 내용을 /etc/httpd
대상 등에 복사합니다. 안에 내용을 복사하려면 logrotate.d
경로 양쪽에 넣으세요.
당신이 유용하다고 생각할 수 있는 한 가지는-n
또는 --dry-run
옵션에게 rsync
:
-n, --dry-run 변경 사항 없이 시험 실행을 수행합니다.
그러면 무슨 일이 일어날지 미리 볼 수 있지만 실제로 양쪽 끝에서 변경 사항이 적용되지는 않습니다. 이를 사용하여 실제 실행 전에 원하는 것이 무엇인지 확인할 수 있습니다.
에 제공한 인수에서 쉘 확장을 방지하는 방법을 물으셨습니다 rsync
. 위와 같이 실제로는 문제가 발생한 것을 원하는 것이 아니라고 생각하지만, 꼭 필요한 경우 중괄호 확장은 따옴표 안에서 발생하지 않으므로 "a{BC}d"
그대로 유지됩니다 a{BC}d
.