SSH를 통해 하위 디렉토리의 파일을 원격 컴퓨터로 cp하기 위해 Unix 명령을 사용할 수 있습니까?


17

~/Downloads개인용 컴퓨터의 하위 디렉토리 에 일련의 소프트웨어 파일이 다운로드되어 있습니다. 또한 bash를 사용하여을 사용하여 컴퓨터에 원격으로 연결합니다 ssh.

이 파일을 통해 ssh원격 컴퓨터 로 전송할 수 있습니까?


질문은 단일 파일 ( this file)과 여러 파일 ( a series of software files)을 나타내며 , 최상의 솔루션은 단일 파일인지 여러 파일인지에 따라 다릅니다.
user2768

답변:


42

scp이 목적 으로 사용할 수 있습니다 . SSH 프로토콜을 사용하여 파일을 전송하는 안전한 방법입니다.

예를 들어,라는 파일 복사 yourfile.txt에서 ~/Downloads원격 컴퓨터 사용하기를 :

scp ~/Downloads/yourfile.txt your_username@remotehost.edu:/some/remote/directory

더 많은 예제를 여기에서 볼 수 있습니다 .


5
내가 생각하기 rsync에 지금도 잘 작동한다고 생각합니다
ShanZhengYang

1
rsync는 파일로 가득 찬 하나 또는 손으로
인해 복잡해졌습니다

14
@Paebbels 반대로 scp위의 내용으로 바꾸면 rsync제대로 작동합니다.
8bittree

rsync단순한 경우에는 "그냥 작동"하고 다른 경우에는 훨씬 더 효율적일 수 있기 때문에 단일 파일까지 모든 것에 사용하는 경향이 있습니다 . 중 하나를 사용하는 경우 scp또는 rsync아무것도하지 이미 압축 및 / 또는 암호화에, (에서 압축 옵션을 설정하는 기억 -C을 위해 scp, -z또는 --compress를 들어 rsync). 실제로 나는 습관에 의해 켜집니다-rPi와 같이 제한된 CPI 전력으로 느린 저전력 장치를 사용하는 경우 상황이 느려지는 환경을 찾는 것은 매우 드 rare니다.
David Spillett

37

scp이것에 대한 올바른 도구 이지만 분명히 어떤 이유로 사용할 수 없다면 로컬 컴퓨터에서 다음과 같은 작업을 수행하여 디렉토리 구조를 원격 컴퓨터에 복사 할 수 있습니다.

tar -c . | ssh <remote> tar -x

이 의지 tar하는 현재 로컬 컴퓨터의 디렉토리 및 쓰기 tarstdout있는 다음에 파이프됩니다 ssh그것에서 읽는 파일 압축을 풀어야하는 원격 명령을 실행할 명령stdin

-f -작성 및 추출 끝 둘 다에서 기본값이되는 것에 대한 Dietrich Epp의 의견을 반영하도록 편집 되었으므로 명시 적으로 지정할 필요가 없습니다.


7
이 작업을 수행하는 경우 홈 디렉토리가 아닌 다른 곳을 추출 -C basedir하기 tar위해 인수 를 추가하고 싶을 것입니다 .
Dougal

17

드문 경우 이상 으로이 작업을 수행 sshfs하려면 FUSE (Linux, * BSD, Mac OS X)를 지원하는 유닉스 계열을 사용하는 경우 원격 파일 시스템을 마운트하는 것이 좋습니다 . ~ / remote-server라고하는 홈 디렉토리 아래에 디렉토리를 만듭니다.

    $ mkdir ~/remote-server

그런 다음로 원격 파일 시스템을 마운트하십시오 sshfs. "yourserver.com"을 원격 시스템의 호스트 이름으로 바꾸고 "원격 디렉토리 이름"을 원격 시스템에서 사용중인 디렉토리로 바꾸십시오.

    $ sudo sshfs username@yourserver.com:/name/of/remote/directory ~/remote-server/

이 작업이 완료되면 원격 디렉토리는 파일 시스템의 일부이며 다음을 포함하여 모든 일반 도구를 사용할 수 있습니다 cp.

    $ cp ~/Downloads/your-files ~/remote-server

아직 sshfs설치 하지 않은 경우 패키지 관리자를 사용하여 컴퓨터에 설치할 수 있어야합니다 ( sshfs또는 이름이 지정된 패키지를 찾으십시오 fuse-sshfs). 자세한 내용은 온라인 자습서 를 참조하십시오 .

그건 그렇고, 내가 원격 서버에서 파일을 관리하는 가장 좋아하는 방법입니다. 나는 보통 이런 방식으로 하나의 프로덕션 서버와 두 개의 개발 서버를 마운트하고 일반적인 파일 찾아보기 워크 플로를 사용합니다.


그런 다음 작업을 가장 잘 수행하는 데 도움이되는 sshfs 옵션을 확인하십시오. 예를 들면 사용자 / 그룹 ID 매핑으로 시작 -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_other하고 -C가난한 대역폭 경우 압축. 그것이 잘 작동하자마자, 나는 ssh에 먼 파일 시스템을 빠르게 마운트하기 위해 명령에 대한 별칭을 개인적으로 추가합니다. @ Benjamin_Staton 적어도 적절한 사용자 / 그룹 매핑이 없으면 sudo 또는 root를 사용하지 않습니다.
tuk0z

9

처음에는 scp(copy over ssh)와 (과)의 실제 차이가 없습니다 rsync.

후속 실행은 이미 존재하는 파일을 복사하지 않고 rsync를 사용하면 도움이됩니다.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a 모든 파일
  • -v 장황하게
  • -H "심볼릭 링크를 알아 내고 옳은 일을하라"
  • 그런 다음 소스 및 대상 경로. 소스에서 와일드 카드를 사용하거나 전체 디렉토리를 동기화 할 수 있습니다.

다른 유용한 플래그는 다음과 같습니다.

  • --delete 소스에 더 이상 존재하지 않는 대상에서 파일을 삭제합니다.
  • --dry-run 테스트 용-매우 편리합니다 --delete.

ssh암호를 설정하지 않은 경우 키를 사용 하여 암호없는 로그인도 수행합니다.

실행 rsync이 끝나면 일반 복사를 다시 수행하는 것보다 몇 배나 빠릅니다.


1
-H실제로 하드 링크의 경우 소스 디렉토리 구조에서 둘 이상의 위치에 링크 될 때 동일한 컨텐츠가 두 번 이상 전송되는 것을 중지합니다 (그러나 큰 디렉토리 구조에서는 프로세스의 효율성을 떨어 뜨릴 수 있음). 심볼릭 링크에는 영향을 미치지 않지만 -a/에 포함 된 일부 옵션은 --archive심볼릭 링크 처리 방법에 영향을줍니다.
David Spillett

4

위의 답변에 추가하십시오. 때로는 원격 경로가 확실하지 않습니다. 이 경우 sftp먼저 필요한 위치로 이동 한 다음 get 또는 put을 사용하여 실제로 파일을 다운로드하거나 업로드합니다.

무언가를 항상 동기화 상태로 유지하고 원격 시스템에있는 일부 파일을 로컬로 실행하려는 경우에도 sshfs효과적입니다.


-1

ssh와 매우 비슷한 일을하고 있습니다. Visual Studio 용 사용자 지정 빌드 도구를 만들었으며 기본적으로 VS에서 ssh 명령을 실행하여 내 코드를 대상 컴퓨터에 복사 한 다음 해당 대상 컴퓨터에서 컴파일합니다.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand '

작은 따옴표와 세미콜론을 사용하십시오. 전자는 ssh를 통해 명령을 hostB에 캡슐화하고 후자는 hostA에서 하나의 ssh 명령으로 여러 hostB 시스템 명령을 실행할 수 있습니다.

이 작업을 수행하려면 userA @ hostA가되고 hostB에 userB로 로그인 할 수 있도록 시작 시스템에서 ssh 키를 설정해야합니다. userA @ hostA에 대한 공개 ssh 키를 작성하는 프로세스는 잘 문서화되어 있습니다. userA에 대해 hostA에 사용자 A의 공개 키를 작성하지 않고 해당 키를 hostB에 userB로 복사하는 경우 매번 비밀번호를 입력해야하므로 자동화의 즐거움이 없어집니다.


downvoted 한 사람이 downvoted 이유에 대한 의견을 남길 수 있습니까? 다운 투표는 유익한 피드백 없이는 의미가 없습니다. 감사합니다. OP의 특정 질문에 직접 관련된 답변을 제시했습니다. 새로운 기술을 도입하거나 대체 경로를 제안하지 않습니다. 왜? OP는 대체 경로를 사용하고 싶지 않을 수도 있습니다.
앤드류
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.