2009-08-27 6 views
51

이것이 가능한지 확실하지 않습니다. 기본적으로, 나는 내 호스트에 파일을 scp 수 있도록 스크립트를 쓰고 있어요. 이것은 지금까지입니다. 인수 1은 파일 및 인수 2는 내가이 원격 서버에 배치 할 폴더입니다 : 당신이/알 수 없습니다다시피 내가 '기능이 아무튼 호출 할 때ssh-ing없이 원격 호스트에 디렉토리를 생성하려면 어떻게해야합니까?

function upload { 
    scp $1 [email protected]:$2 
} 

는, 사용자가 지정한 디렉토리 경우 존재하지 않으면 전송이 실패합니다. 함수에 디렉토리가 존재하는지 확인하는 방법이 있습니까? 그렇지 않으면 생성하십시오.

언제나 ssh를 사용하고 디렉토리를 만들지는 않겠지 만 선택의 여지가 없다면 선택의 여지가 없습니다.

답변

31

rsync를 사용할 수 있습니다. 예를 들어

rsync를 약

rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO 

참고

rsync와 유틸리티 소프트웨어 델타 인코딩시를 사용하여 한 위치에서 다른 최소화하면서 데이터 전송에 파일과 디렉토리를 동기화 유닉스 네트워크 프로토콜 다른 도구보다 빠른 rsync 알고리즘을 사용하는 것이 적절합니다.

+3

이것은 나를 위해 작동하지 않습니다 (단지 대상 디렉토리가 존재하지 않는다고 불평합니다) - rsync의 최근 버전이 필요합니까? 그러나'rsync -R'는 로컬 파일이 적절하게 이름 붙여진 디렉토리에 있다면 원하는 결과를 얻기 위해 사용할 수 있습니다. 예를 들면 :'rsync -Rave ssh some/nonExisting/dirToCopyTo/fileToCopy ssh.myhost.net : /' –

+1

@MartinKleppmann 나는 이것을 사용하지 않는 디렉토리에 대해 불평 만한다. 실제로이 작업을 목격 한 적이 있습니까? 그렇다면 rsync 프로그램과 다른 점을 파악하는 데 관심이 있습니다. – DougW

+2

아, 복사 할 디렉토리의 한 수준 만 만들면됩니다. 나는/var/www/myapp/test /에 배포하려고 시도했다. 서버에/var/www/만 있으면 실패했습니다./var/www/myapp /를 만들 때, 테스트 폴더를 생성하고 모든 것을 복사했습니다. 따라서 하나 이상의 디렉토리 구조를 생성해야한다면 아래의 @ire_and_curses와 같은 솔루션이 필요합니다. – DougW

18

재귀 scp (-r)을 수행하면 디렉토리도 복사됩니다. 원격 호스트에 원하는 이름의 디렉토리를 로컬로 생성하고 파일을 복사 한 다음 재귀 적으로 복사하면 파일이 들어있는 디렉토리가 생성됩니다.

종류가 어색하지만 작업을 수행 할 수 있습니다.

+0

원격 디렉토리가 이미 존재하며 비어 있지 않은 경우에는 어떻게됩니까? – mouviciel

+0

새 내용이 기존 디렉토리에 추가됩니다. – bejota

23

비밀번호 나 공개 키가 여전히 scp이어야하므로 ssh을 사용하지 않고 수동으로 로그인하고 직접 대화 형으로 로그인하지 않으려한다고 가정합니다. 디렉토리가 이미 존재하는 경우, mkdir 불평하지만 파일 위치를

$1 = filename 
$2 = [email protected] 
$3 = dir_on_server 

cat $1 | ssh $2 "mkdir $3;cat >> $3/$1" 

: ssh를 사용하여 비 대화식으로 허용

경우에, 당신은 catssh 이상 사용하여 파일을 스트리밍 할 수 있습니다 여전히 복사됩니다. 기존 디렉토리를 덮어 쓰지 않습니다. 디렉토리가 존재하지 않으면 mkdir이 디렉토리를 만듭니다.

+14

'mkdir -p $ 3'은 mkdir이 이미 존재하는 디렉토리에 불만을 내지 않도록합니다. 또한 여러 수준의 디렉토리를 만들 수 있습니다. – FabienAndre

6

방법, 예를 들어,
ssh [email protected] '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt [email protected]:/tmp/nonexist/dir

+0

Wikipedia에 따르면 'SSH (Secure Shell) 프로토콜을 기반으로하는' 'scp'뿐만 아니라 'SSH'도 확실히 볼 수 있습니다. 이것은 OP가 요구했던 것이 아닙니다. – Bojangles

+0

ssh 나 scp를 사용할 때 아무런 문제가 없으며이를 피할 필요가 없습니다. 검사가 반복해서 수행되지 않도록 원격 호스트에서 작성된 것을 기억해야하는 것은 사용자 스크립트에 달려 있습니다. 실제로 최근에이 방법을 사용하여 로그 백업 스크립트를 작성했습니다. 원격 파일 액세스를 위해 CIFS, NFS, FTP 또는 rsync (실제로 ssh를 통해 실행)와 같은 방법을 제공하지 않으면 원격 호스트에서 새 폴더를 확인하고 새 옵션을 만드는 다른 옵션이 있는지 알고 싶습니다. –

+0

미안 내가 리코를 잘못 건너 뛴다면 OP의 SSH 사용을 원하지 않는다는 것을 언급하고 있었지만 질문을 더 자세히 읽어야했습니다. scp는 괜찮습니다. – Bojangles

11

이이 디렉토리 구조가 생성됩니다 보장하는 두 단계 과정

ssh [email protected] "mkdir -p $2" 

에게 있습니다 대해. 그런 다음 복사하십시오

scp $1 [email protected]:$2 
관련 문제