디렉토리가 없으면 scp가 디렉토리를 작성할 수 있습니까?


88

scp파일을 업로드하는 데 사용 하고 싶지만 때로는 대상 디렉토리가 존재하지 않을 수 있습니다.

폴더를 자동으로 만들 수 있습니까? 그렇다면 어떻게? 그렇지 않은 경우 어떤 대체 방법을 사용해 볼 수 있습니까?

답변:


71

이것은 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때로는 다른 놀라운 행동이 있습니다. 기본적으로, 당신은 당신이 복사하고자하는 것을 파악하도록 요구하고 있으며 그 추측은 가정과 일치하지 않을 수 있습니다. 사용해보십시오. 예상대로 작동하지 않고 이유를 알 수없는 경우 로컬 및 원격 디렉토리 설정에 대한 자세한 정보를 게시하고 시도한 명령을 제공하십시오.


각주 :

  1. rsync2.6.0 (2004 년 1 월 1 일) 이전 에는 기본적으로 사용되지 않는 RSH 프로토콜로-e ssh 플래그가 작동하도록 플래그가 필요했습니다 .scp

  2. scprsync일부 플래그를 공유하지만 중복의 비트가있다.

  3. 사용하는 경우 SSH전송 프로토콜로, rsync같은 기본값을 사용합니다. 따라서 scp기본적으로 원격 컴퓨터에 로컬 사용자와 이름이 같은 사용자가 있다고 가정합니다.


Mac OSX를 사용하고 있는데 로컬과 원격 모두에 rsync를 설치해야합니까?
AGamePlayer

rsync의 문서 페이지를 검색 했지만 ssh-key를 사용하여 로그인하는 방법을 찾지 못했습니다. 사용자 이름 / 암호를 사용하여 로그인하고 싶지 않습니다
AGamePlayer

@AwQiruiGuo : Mac OS X은로 제공됩니다 rsync. 그렇습니다 . rsync와 마찬가지로 원격에서도 필요 합니다 scp. SSH 키의 경우 rsync실제로 기본값 아래에 SSH -e ssh를 사용하고 있으므로와 함께 사용하도록 키가 설정되어 있으면 scp작동 rsync합니다.
Warren Young

1
@WarrenYoung -r는 아무런 차이가 없습니다. 설명하는 시나리오는 디렉토리를 복사 중이고 대상 상위 디렉토리가 존재하는 경우에만 작동합니다. 따라서, rsync foo/ u@h:~/대상 디렉토리를 생성합니다 foo하지만, rsync foo/ u@h:~/bar/대상 디렉토리를 생성하지 않습니다 bar. 존재하는 bar/foo경우에만 생성 됩니다 bar/. 어쨌든 OP는 파일을 업로드하고 있으며 이것이 작동하는 경우에도 전체 디렉토리에서만 작동합니다.
terdon

1
예, 나는 그것도 가지고 놀았습니다. 파일 이름을 지정하면 실패하는 것처럼 보입니다. 존재하지 않지만 디렉토리를 작성하고 디렉토리에 넣으면 rsync file host:/foo/file실패 합니다. 이상한. 어쨌든, 당신은 아주 옳고 기본 시나리오는 효과가 있습니다. 나는 하향 투표를 취소 할 것입니다. foo/rsync file host:/foo/file
terdon

35

파일 그룹을 복사하는 경우 실제로는 아닙니다. 디렉토리와 그 아래의 모든 내용을 복사하는 경우 가능합니다. 이 명령이 주어지면 :

$ scp -pr /source/directory user@host:the/target/directory

경우 directory에 존재하지 않습니다 ~/the/targethost, 그것은 생성됩니다. 그러나 ~the/target존재하지 않는 경우 문제가있을 수 있습니다.이 경우의 정확한 결과는 기억 나지 않지만 scp실패 할 수 있도록 준비하십시오 .


1
scp: /home/madmike/test_bin: No such file or directory대상 디렉토리가 누락되면 설치가 중단됩니다. 클라이언트에서 cygwin을 사용하고 서버에서 RHEL 6.9를 사용합니다. 당신의 설정은 무엇입니까?
MadMike

16

내가 아는 한, 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플래그는 개별 파일을 복사하는 경우 대상 디렉토리를 만드는 데 도움이되지 않습니다.


3

그래 넌 할수있어. scp 매뉴얼 페이지에 따르면 :

남자 scp

.....

-r 전체 디렉토리를 반복적으로 복사합니다. scp는 트리 탐색에서 발생하는 심볼릭 링크를 따릅니다.

....


7
대상 상위 디렉토리는 작성되지 않습니다. 디렉토리를 기존 위치로 복사 할 수 있습니다. 따라서 리모컨 이 존재 scp -r foo/ u@h:~/bar하면 생성 하지만 존재하지 않으면 실패합니다. bar/foobar/
terdon

1
실패하지 않습니다. foo내용을 새 디렉토리에 복사 합니다 /bar. 물론 이름이 변경되어 OP가 원하는 이름이 아닐 수도 있습니다. 대상 시스템에서 생성 된 새 트리 구조 scp가 원하는 경우 작업을 수행하지 않고 트리의 특정 분기에서 트리 구조를 복제하면 해당 구조가 생성됩니다.
YoMismo

6
예, 그러나 파일이 아닌 디렉토리를 복사하는 경우에만 작동 합니다. scp -r file host:~/bar/을 만들지 않습니다 bar/.
terdon

3

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


나는 거의 똑같은 일을하지만, 보안상의 이유로 수동으로 암호를 입력해야하므로 적어도 두 번 입력해야합니다.
Stefan Reich

0

mkdir 명령으로 명령을 연결 한 다음 생성 한 폴더를 참조 할 수 있습니다.

mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/

3
(1) 질문에 "자동으로"라고 말합니다. 자동이 아닌 것 같습니다. (2) 이것은 terdon 's answer 에 대한 사소한 변형으로 보입니다 .
G-남자

0

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로 결합하여 중간에 하나 이상의 포함 필터를 추가 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.