저는 현재 데이터베이스 세트의 백업을 수행하고, 압축하고, 암호화하고, 별도의 저장 시스템으로 전송하고, 파일이 성공했는지 확인하는 스크립트를 작성 중입니다. 백업을 생성하고 표준 압축 및 암호화를 수행하여 안전하게 전송하고 보조 위치에 저장할 수 있습니다. 이후 ssh
대상 컴퓨터에 디렉터리가 존재하는지 확인하거나 강제로 생성한 다음 scp
파일을 전송하는 데 사용하고 마지막으로 ssh
파일이 상대방에 있는지 확인하는 데 사용됩니다.
이전에는 잘 작동했지만 파일 이름에 타임스탬프(기존 날짜 스탬프 외에)를 포함하도록 스크립트가 변경되었으며 파일 이름의 해당 타임스탬프 문자 로 :
인해 전송이 실패했습니다 scp
. ssh
파일.
DATE
현재 스크립트 상단에 변수를 생성하고 이를 다음과 같이 설정하고 있습니다. $(date --date=today +%FT%H:%M:%S%z)
이는 올바른 위치에 날짜 스탬프를 생성합니다.ISO 8601체재. 이는 데이터베이스 덤프 생성(생성된 postgres 덤프 사용 pg_dump
)과 압축 gzip
및 암호화 사용에 적합합니다 openssl
. 이들 각각은 형식의 모든 이름을 가진 새 파일을 생성합니다 HOSTNAME.DATABASE-dump-DATE.EXTENSION
.
시간 없이 날짜를 제공하면 :
제대로 작동하므로 파일 이름에 문자가 없습니다. 지금 나타나는 특정 오류는 :
문자가 포함된 다음 코드 조각입니다( $1
백업할 데이터베이스 이름이 포함된 스크립트에 제공된 매개 변수 참조, $DATE는 위에 정의되어 있음).
scp -P PORT "$(hostname).$1-dump-$DATE.backup.gz.aes" USER@HOST:"/backups/$(hostname)/"
오류로 인해 이 작업이 실패했습니다 ssh: could not resolve hostname HOSTNAME.DATABASE-dump-2015-07-31T13: Name or service not known
.
ssh HOST -p PORT <<"HERE"
if test -f /backups/$(hostname)/$(hostname).$1-dump-$DATE.backup.gz.aes;
then echo "File exists";
else echo "Transfer failed";
fi
HERE
이것은 실패했습니다 Pseudo-terminal will not be allocated because stdin is not a terminal
. 을 사용하면 -t
동일한 오류가 발생하고 -t -t
(에서스택 오버플로의사 터미널에 대한 토끼 구멍으로 이어짐) 나중에 주어진 명령이 흐르는 것을 허용하지 않는데, 이는 실제로 수행하는 작업에 대해 내가 놓친 것일 수 있습니다.
내 컴퓨터에 설치해야 하는 추가 소프트웨어(Ubuntu 14.04 및 DB용 최신 Postgresql 실행)를 사용하지 않으려고 합니다. scp/ssh
이러한 파일을 올바르게 처리할 수 있는 방법이 있는지 알려주십시오 .
답변1
scp -P PORT "$(hostname).$1-dump-$DATE.backup.gz.aes" USER@HOST:"/backups/$(hostname)/"
scp는 한 원격 호스트에서 다른 호스트로 파일을 복사하는 것을 지원합니다. 이를 수행하기 위한 구문은 "hostname:filename" 구문을 사용하여 소스와 대상을 지정하는 것입니다.
scp srchost:/src/file desthost:/dest/file
소스 파일 이름에 콜론이 포함되어 있으므로 scp는 콜론을 원격 파일의 호스트 이름과 파일 이름으로 확인하려고 시도합니다.
매개변수의 첫 번째 콜론 앞에 "/"가 있는지 확인하여 scp가 소스 파일 이름 매개변수를 원격 파일 이름으로 처리하는 것을 방지할 수 있습니다. 호스트 이름에는 "/"가 포함될 수 없으며 scp는 첫 번째 "/" 다음에 명령줄 인수에서 콜론 검색을 중지합니다. 이것은 작동합니다:
scp -P PORT "./$(hostname).$1-dump-$DATE.backup.gz.aes" USER@HOST:"/backups/$(hostname)/"
^^-- Prepend a ref to the current directory