scp
파일을 업로드하는 데 사용 하고 싶지만 때로는 대상 디렉토리가 존재하지 않을 수 있습니다.
폴더를 자동으로 만들 수 있습니까? 그렇다면 어떻게? 그렇지 않은 경우 어떤 대체 방법을 사용해 볼 수 있습니까?
scp
파일을 업로드하는 데 사용 하고 싶지만 때로는 대상 디렉토리가 존재하지 않을 수 있습니다.
폴더를 자동으로 만들 수 있습니까? 그렇다면 어떻게? 그렇지 않은 경우 어떤 대체 방법을 사용해 볼 수 있습니까?
답변:
이것은 rsync
할 수 있는 많은 일 중 하나입니다 .
rsync
지난 몇 년 동안 출시 된 버전을 사용하는 경우 ¹의 기본 명령 구문은 다음과 유사합니다 scp
.²
$ rsync -r local-dir remote-machine:path
그러면 필요한 디렉토리가 생성되어 원격 컴퓨터에 local-source
해당 내용 이 복사 $HOME/path/local-dir
됩니다 .³
rsync
특정 상황에서 작동하는지 여부에 영향을 줄 수있는 몇 가지 제한 사항이 있습니다. 예를 들어, 여러 레벨의 누락 된 원격 디렉토리를 작성하지 않습니다. 리모콘에서 최대 하나의 누락 된 레벨 만 작성합니다. rsync
다음과 같은 명령을 수행하여 쉽게 해결할 수 있습니다 .
$ ssh remote-host 'mkdir -p foo/bar/qux'
$HOME/foo/bar/qux
트리가 존재하지 않으면 트리 가 생성 됩니다. 이미 존재하는 경우 불평하거나 다른 일을 하지 않습니다.
rsync
때로는 다른 놀라운 행동이 있습니다. 기본적으로, 당신은 당신이 복사하고자하는 것을 파악하도록 요구하고 있으며 그 추측은 가정과 일치하지 않을 수 있습니다. 사용해보십시오. 예상대로 작동하지 않고 이유를 알 수없는 경우 로컬 및 원격 디렉토리 설정에 대한 자세한 정보를 게시하고 시도한 명령을 제공하십시오.
각주 :
rsync
2.6.0 (2004 년 1 월 1 일) 이전 에는 기본적으로 사용되지 않는 RSH 프로토콜로-e ssh
플래그가 작동하도록 플래그가 필요했습니다 .scp
scp
및 rsync
일부 플래그를 공유하지만 중복의 비트가있다.
사용하는 경우 SSH
전송 프로토콜로, rsync
같은 기본값을 사용합니다. 따라서 scp
기본적으로 원격 컴퓨터에 로컬 사용자와 이름이 같은 사용자가 있다고 가정합니다.
rsync
의 문서 페이지를 검색 했지만 ssh-key를 사용하여 로그인하는 방법을 찾지 못했습니다. 사용자 이름 / 암호를 사용하여 로그인하고 싶지 않습니다
rsync
. 그렇습니다 . rsync
와 마찬가지로 원격에서도 필요 합니다 scp
. SSH 키의 경우 rsync
실제로 기본값 아래에 SSH -e ssh
를 사용하고 있으므로와 함께 사용하도록 키가 설정되어 있으면 scp
작동 rsync
합니다.
-r
는 아무런 차이가 없습니다. 설명하는 시나리오는 디렉토리를 복사 중이고 대상 상위 디렉토리가 존재하는 경우에만 작동합니다. 따라서, rsync foo/ u@h:~/
대상 디렉토리를 생성합니다 foo
하지만, rsync foo/ u@h:~/bar/
대상 디렉토리를 생성하지 않습니다 bar
. 존재하는 bar/foo
경우에만 생성 됩니다 bar/
. 어쨌든 OP는 파일을 업로드하고 있으며 이것이 작동하는 경우에도 전체 디렉토리에서만 작동합니다.
rsync file host:/foo/file
실패 합니다. 이상한. 어쨌든, 당신은 아주 옳고 기본 시나리오는 효과가 있습니다. 나는 하향 투표를 취소 할 것입니다. foo/
rsync file host:/foo/
file
파일 그룹을 복사하는 경우 실제로는 아닙니다. 디렉토리와 그 아래의 모든 내용을 복사하는 경우 가능합니다. 이 명령이 주어지면 :
$ scp -pr /source/directory user@host:the/target/directory
경우 directory
에 존재하지 않습니다 ~/the/target
에 host
, 그것은 생성됩니다. 그러나 ~the/target
존재하지 않는 경우 문제가있을 수 있습니다.이 경우의 정확한 결과는 기억 나지 않지만 scp
실패 할 수 있도록 준비하십시오 .
scp: /home/madmike/test_bin: No such file or directory
대상 디렉토리가 누락되면 설치가 중단됩니다. 클라이언트에서 cygwin을 사용하고 서버에서 RHEL 6.9를 사용합니다. 당신의 설정은 무엇입니까?
내가 아는 한, scp
그 자체로는 그렇게 할 수 없습니다. 그러나 ssh
대상 시스템으로 디렉토리를 작성한 다음 복사 할 수 있습니다. 다음과 같은 것 :
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
전체 디렉토리를 복사하는 경우 위의 내용이 필요하지 않습니다. 예를 들어, 디렉토리 ~/foo
를 원격 호스트 에 복사 하려면 -r
(재귀) 플래그를 사용할 수 있습니다 .
scp ~/foo/ user@host:~/
~/foo
원격 호스트에 대상 디렉토리가 생성됩니다 . 그러나 상위 디렉토리를 작성할 수 없습니다. scp ~/foo user@host:~/bar/foo
대상 디렉토리 bar
가 없으면 실패 합니다. 어쨌든 -r
플래그는 개별 파일을 복사하는 경우 대상 디렉토리를 만드는 데 도움이되지 않습니다.
그래 넌 할수있어. scp 매뉴얼 페이지에 따르면 :
남자 scp
.....
-r 전체 디렉토리를 반복적으로 복사합니다. scp는 트리 탐색에서 발생하는 심볼릭 링크를 따릅니다.
....
scp -r foo/ u@h:~/bar
하면 생성 하지만 존재하지 않으면 실패합니다. bar/foo
bar/
foo
내용을 새 디렉토리에 복사 합니다 /bar
. 물론 이름이 변경되어 OP가 원하는 이름이 아닐 수도 있습니다. 대상 시스템에서 생성 된 새 트리 구조 scp
가 원하는 경우 작업을 수행하지 않고 트리의 특정 분기에서 트리 구조를 복제하면 해당 구조가 생성됩니다.
scp -r file host:~/bar/
을 만들지 않습니다 bar/
.
btrfs
스냅 샷을 전송하기 전에 다음 기능을 사용합니다 ssh
.
check_remote_dir() {
printf "\ntesting remote directory: '$1' "
if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
printf "\nCreating: $1 on $ROOT@$REMOTE\n"
ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
else
printf "[OK]\n"
fi
}
다음과 같이 스크립트에서 함수를 호출하십시오.
check_remote_dir /my/remote/path
mkdir 명령으로 명령을 연결 한 다음 생성 한 폴더를 참조 할 수 있습니다.
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
ssh를 사용할 수없는 (rssh로) scp 또는 sftp로만 제한되면 rsync로 빈 디렉토리 트리를 복사 한 다음 파일을 복사하여 디렉토리를 작성할 수 있습니다.
ssh-copy-id가 작동하지 않고 .ssh 디렉토리가 없을 때 공개 ssh 키를 원격 호스트에 넣는 방법입니다.
rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys
대상 파일 이름이 동일한 경우이 명령을 하나의 rsync로 결합하여 중간에 하나 이상의 포함 필터를 추가 할 수 있습니다.