ssh를 사용하여 파일을 로컬 시스템으로 다시 복사


257

SSH를 통해 시스템에 로그인 한 경우 다른 터미널 또는 화면 세션을 실행하지 않고 scp 또는 이와 유사한 작업을 수행하거나 원격 시스템에서 SSH를 다시 ​​수행하지 않고 파일을 로컬 시스템으로 다시 복사하는 방법이 있습니까? 로컬 시스템?


4
클라이언트에 ssh 서버가 있다면 항상 시도해 볼 수 있습니다 scp file.foo user@myclient.com:file.foo: P
rahmu

4
확실히, 그러나 나는 내가 일하는 회사가 소유 한 서버에서 내 컴퓨터에 액세스하는 것을 허용하고 싶지 않습니다 :) 어쨌든 여기에는 키 기반 인증 만 있고 개인 키를 넣기가 너무 안전하지 않습니다. 서버에!
Naftuli Kay

2
귀하의 문제를 이해하지 못합니다. 새 키 페어를 생성하고 공개 파트를 컴퓨터 authorized_keys에 복사 한 후 전송 후 해당 라인을 다시 삭제하십시오.
닐스

8
이 작업을 많이 수행하므로 SSH 세션 중간에 파일을 복사 할 때 마다이 작업을 수행하는 것이 비효율적입니다. SSH 터미널 세션에서 로컬 컴퓨터에 다시 연결하여 현재 SSH 세션을 종료하지 않고도 원격 서버로 파일을 보낼 수있는 방법을 찾고 있습니다.
Naftuli Kay

2
문제는 초기 ssh 로그인이 고통 (2fa 또는 키 또는 암호 이외의 다른 문제) 일 수 있다는 것입니다 .ssh 서버의 구성을 변경할 권한이 없을 수도 있습니다. 키 협상을 여러 번 수행해야 할 이유가 없습니다. 세션이 생기면 해당 세션을 여러 가지 용도로 사용하는 것이 좋습니다.
duanev

답변:


139

마스터 연결

미리 계획하면 가장 쉽습니다.

마스터 연결을 처음으로 엽니 다. 후속 연결의 경우 기존 마스터 연결을 통해 슬레이브 연결을 라우팅하십시오. 에서 ~/.ssh/config자동으로 연결 공유를 설정 하십시오 .

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

기존 연결과 동일한 (사용자, 포트, 시스템)에 대한 ssh 세션을 시작하면 두 번째 세션이 첫 번째 세션을 통해 터널링됩니다. 두 번째 연결을 설정하려면 새로운 인증이 필요하지 않으며 매우 빠릅니다.

따라서 활성 상태 인 동안 신속하게 다음을 수행 할 수 있습니다.

전송

기존 연결에서 역방향 ssh 터널을 설정할 수 있습니다. ssh 명령 행 -R 22042:localhost:22에서 22042는 원격 시스템의 다른 포트 번호와 다른 임의로 선택된 숫자를 전달하여 원격 전달을 작성하십시오 . 그런 다음 ssh -p 22042 localhost원격 시스템에서 사용자를 다시 원본 시스템에 연결합니다. scp -P 22042 foo localhost:파일을 복사 하는 데 사용할 수 있습니다 .

을 사용하여이를 더 자동화 할 수 있습니다 RemoteForward 22042 localhost:22. 이것의 문제는 여러 개의 ssh 인스턴스가있는 동일한 컴퓨터에 연결하거나 다른 사람이 포트를 사용하는 경우 전달을받지 못한다는 것입니다.

처음부터 원격 전달을 활성화하지 않은 경우 기존 ssh 세션에서 원격 전달을 수행 할 수 있습니다. 을 입력하십시오 Enter ~C Enter -R 22042:localhost:22 Enter. 자세한 내용은 설명서의 "이스케이프 문자"를 참조하십시오.

이 서버 결함 스레드 에도 흥미로운 정보가 있습니다 .

복사 붙여 넣기

파일이 작 으면 파일을 입력하고 터미널 출력에서 ​​복사하여 붙여 넣을 수 있습니다. 파일에 인쇄 할 수없는 문자가 포함 된 경우 base64 와 같은 인코딩을 사용하십시오 .

remote.example.net $ base64 <myfile
 (출력 복사)
local.example.net $ base64 -d> myfile
 (클립 보드 내용 붙여 넣기)
Ctrl +D

보다 편리하게 X 전달이 활성화되어 있으면 원격 컴퓨터에서 파일을 복사하여 로컬로 붙여 넣습니다. xclip또는 내부 또는 외부로 데이터를 파이프 할 수 있습니다 xsel. 파일 이름과 메타 데이터를 유지하려면 아카이브를 복사하여 붙여 넣습니다.

remote.example.net$ tar -czf - myfile | xsel

local.example.net$ xsel | tar -xzf -

SSH를 사용하여 파일을 전송할 수 있다면 왜 사람들은 여전히 ​​SFTP를 필요로 / 사용합니까?
Pacerier

3
@Pacerier SFTP는 SSH를 사용하여 파일을 전송하는 방법이기 때문입니다.
Gilles

SFTP없이 SSH를 사용하여 파일을 전송할 수 있다면 왜 SFTP가 필요한가?
Pacerier

복사-붙여 넣기 방법은 체인 연결 (예 : 여러 호스트를 통해 최종 호스트에 도달)에 특히 편리합니다.
golimar

1
@Pacerier SFTP에는 파일 목록과 같은 추가 명령이 있거나 원격 파일 제거 등이 있습니다.
rahmu

67

또 다른 (IMO) 쉬운 방법은 다음과 같습니다.

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

또는 GUI와 같은 것을 선호한다면 Midnight Commander를 사용해보십시오 . 이를 기능 Shell-Link라고 합니다. 대부분의 배포판은 패키지 시스템에로 mc있습니다.


8
솔직히, 나는 이것이 왜지지되지 않는지 이해하지 못합니다. OP는 scp가 없는 솔루션 요청했습니다 . 때때로, 특히 매우 심한 ISP 제공 라우터에 sshing하는 경우와 같이, 나는 sftp를 가지고 있지 않으며, scp도없고, 심지어 ftp도 심하게 손상되었습니다. 나는 이것을 할 수 있다는 것을 알고 있었고, 나는 단지 나의 구문이 올바른지 확인하기 위해 여기에왔다.
Auspex

1
훌륭한! mc사용하는 것이 가장 빠릅니다.
Namek

2
실제로이 솔루션은 제 경우에는 작동하지 않습니다. Windows에서 Linux로 생성 된 터널을 사용하면 터미널이 아닌 퍼티로 시작합니다. 이 방법은 내가 원하는 것이지만 사용할 수 없습니다. 괴로운.
Benjamin

1
내가 이것을지지하지 않는 이유는 클라이언트 컴퓨터가 회사 네트워크와 같은 공유 라우터 뒤에 있으면 작동하지 않기 때문입니다. 내가 업무용 컴퓨터를 사용 중이고 내 홈 서버에 ssh'd했다고 가정합니다. 공백과 특수 문자가있는 복잡한 디렉토리를 통해 CD를 작성하는 과정에서 어려움을 겪은 파일을 어떻게 업무용 컴퓨터로 복사합니까?
Sridhar Sarnobat

1
이진 데이터와 잘 작동합니다. 나는 tgz항상 파일로 이것을하고 있습니다 :)
Florian Fida

53

SSH는 이스케이프 문자를 통해 몇 가지 명령을 지원합니다 ( ~기본적으로).

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward
      !args                                  Execute local command

!args당신이 원하는에 가장 가까운 것 같다. 명령이 작동 하려면 파일에서 PermitLocalCommand활성화 해야합니다 (참조 )./etc/ssh_config~Cman ssh_config

당신이 설정 한 경우 동일한 SSH 세션을 다시 사용할 수 있습니다 ControlMaster에서를 ssh_config. 이렇게하면 :

$ ~C
ssh> !scp file user@myserver:

기술적으로 ssh 세션을 종료 한 적이 없으며 다시 인증 할 필요가 없습니다. 아마 당신이 원하는 것보다 더 복잡하지만 다른 쉬운 방법은 생각할 수 없습니다.


여전히 작동합니까? !args도움말 메시지에서 찾을 수 없습니다 .
xuhdev

@xuhdev 그것은 OpenSSH_7.2p2 거기에 아직 args첫 도움말 메시지 (아닌 ~?),하지만 두 번째에 (하나가 들어가면 ssh>프롬프트로 ~C, 하나는 입력 할 수 있습니다 help상기 ssh>프롬프트)
sdaau

이것은 좋은 해결책처럼 보이지만 (시도하지는 않았지만) vim 스타일의 부모 명령 줄 버퍼를 얻을 수 있다는 것을 몰랐습니다. 실제로, 단순히 새로운 터미널 탭을 열어서 세션으로 돌아가는 방법을 잊어 버리지 않을 수도 있습니다 (예 : emacs를 종료하는 방법을 기억할 수없는 경우).
Sridhar Sarnobat

37

그것들은 모두 매우 복잡한 방법입니다.
다음을 사용하여 로컬 파일에 원격 파일 시스템을 마운트 할 수 있습니다 sshfs.

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

그런 다음 노틸러스, 그놈, konqueror, 돌고래, bash 등으로 파일을 복사하여 붙여 넣을 수 있습니다.


4
키 파일로 연결 :sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/
sshow

15
  • 파일 전송 용도로 기존 ssh 사이드 채널을 효과적으로 오버로드하는 수정 된 ssh 에이전트 인 ssh-xfer를 사용하십시오 .
  • ssh에 대한 zmodem 인 zssh를 사용하십시오 . rzsz를 사용해 본 적이 있다면 이것은 매우 친숙 할 것입니다.
  • 파일 전송 데몬이 다른 쪽 끝에서 수신 대기한다고 가정하고 파일 전송을 실행 -R하기 위해 역방향 ( , 원격-로컬의 경우) 또는 전달 ( -L, 로컬-원격의 경우) 포트.

그러나 이것들 중 어느 것도 실제로 필요하지 않습니다. SSH 프로토콜은 단일 연결에서 여러 채널을 지원하고 OpenSSH 클라이언트는 멀티플렉싱을 지원합니다. 당신이 가정 ControlMaster하고 ControlPath 설정하는 것은 ( ControlPersist너무 유용합니다)

  # 첫 번째 연결
$ ssh 리모트

  # 원래 ssh가 연 동일한 연결을 통해 다중화됩니다.
$ sftp 원격

5
Z 모뎀은 .. 로컬 BBS에서 다운로드 최신 셰어웨어을 생각 나게 :-)
스튜어트 우드워드

xfer 방식은 내가 찾던 것이지만 ssh-xfer 패치가 OpenSSH 업스트림에 포함되지 않은 이유를 알고 있습니까? 화염?
페란 바 소라

zssh 힌트 주셔서 감사합니다! Konsole에서 tmux를 사용하고 있으며 tmux로 인해 서버의 "sz"가 더 이상 작동하지 않습니다. zssh가 내 문제를 해결합니다!
0xAF

9

더 간단한 방법 : Filezilla (또는 선호하는 ftp 브라우저)를 열고 동일한 사이트에 대한 ssh 연결을 열고 파일을 찾아 로컬 파일 구조로 드래그하십시오. Filezilla를 처음 사용하는 경우 "사이트 관리자"기능을 사용하여 다음에 빠르게 다시 연결하십시오.

그렇습니다. 이것이 대부분의 사람들에게 명백하다는 것을 알고 있습니다 (정확하게 말하면 안됩니다). 그러나 터미널 전용 솔루션을 검색하는이 스레드를 발견 한 일부 (나 같은)는 명백한 것을 간과했을 수 있습니다.



FileZilla 서버는 Windows 전용이라고 생각합니다. 클라이언트는 크로스 플랫폼입니다
Freedom_Ben

Caja를 사용할 수도 있습니다 ssh://SERVER.
basic6

8

내가 제일과 가장 효율적인 솔루션으로 발견 한 것은 사용하는 것입니다 xclip-copyfilexclip-pastefile.

서버에서 xclip-copyfile하나 이상의 파일을 복사 하는 데 사용 합니다. 그런 다음이 파일을 로컬 서버에서 사용할 수 있습니다. 거기에서 사용할 수 있습니다 xclip-pastefile.

이것은 scp로컬 ssh 서버 를 사용 하거나 필요로하지 않습니다. 예를 들어 cygwin과 함께 사용합니다. 유일한 문제는 xclip아직 설치 하지 않은 경우 설치 가 필요하다는 것입니다. 아, 이것은 바이너리 파일에서도 작동합니다.


와우 이것은 리버스 포트 포워딩과 netcat보다 더 나은 솔루션 일 수 있습니다.
Sridhar Sarnobat

3

실용적인 경우 오픈 소스 소프트웨어를 선호하지만 SecureCRT 를 사용하는 많은 이유 중 하나는 파일 전송의 용이성입니다. F / OSS 세계에는 직접적인 대체물이 없습니다.

SecureCRT는 1990 년대 중반 순수한 Windows 프로그램으로 시작했지만 몇 년 전 Mac OS X 및 Linux로 포팅되었습니다 .

SecureCRT에는 SSH를 사용하는 시스템과 파일을주고받을 수있는 세 가지 주요 기능이 있습니다.

  • ZModem , YModem , XModem , Kermit 및 ASCII -SecureCRT는 여러 대역 내 파일 전송 프로토콜을 지원하는 구식 터미널 에뮬레이터입니다.

    사용하기 가장 쉬운 것은 ZModem입니다. sz file-to-download원격 명령 행 과 같은 것을 입력하면 , 원격 sz프로그램은 이스케이프 시퀀스 를 작성하여 SecureCRT가 file-to-download기본 다운로드 디렉토리 로 즉시 다운로드 를 시작하도록 지시 합니다.

    세션마다 다운로드 디렉토리를 사용자 정의 할 수 있다는 점이 좋습니다. 이를 사용하여 본사 파일 서버에 사이트 별 디렉토리를 가지므로 다운로드 한 파일을 수동으로 정렬 할 필요가 없습니다.

    ( 패키지의 sz일부인 "Send ZModem"프로그램 lrzsz입니다. 대부분의 Unixy 시스템 용으로 이미 패키지되어 있습니다. 어떤 이유로 든 원격 시스템에 아직 설치되어 있지 않고 바이너리 패키지를 쉽게 설치할 수없는 경우, 소스 패키지는 작고 휴대 성이 뛰어납니다. 한 번 이상, lrzsz "sharchive" 또는 uuencode"d tarball 을 제거 된 원격 시스템에 보내 ZModem 파일을 전송할 수있었습니다.)

  • SFTP -SecureCRT에는 기본 SFTP 구현이 긴밀하게 통합되어 있습니다.

    "긴밀하게 통합 된"이란 SFTP 메뉴 명령 또는 키보드 단축키를 제공하면 동일한 SSH 연결을 통해 원격 사이트에 연결된 새 탭을 여는 것을 의미합니다. 따라서 다시 로그인 할 필요가 없으며 동일한 서버에 대한 별도의 SFTP 연결을 연 경우보다 연결이 약간 더 빠릅니다.

    VanDyke Software에는 별도의 파일 전송 제품인 SecureFX 가 있기 때문에 SFTP 기능을 "기본"으로 특성화합니다 . 내장 SFTP 클라이언트보다 기능이 우수하며 SecureCRT 와도 통합됩니다.

    SecureCRT의 SFTP 기능을 사용하면 ZModem 구성과 별 개인 기본 원격 및 로컬 디렉토리를 구성 할 수 있습니다.

    이 SFTP 기능에는 명령 완료 sftp와 같은 여유가 있다는 점을 제외하고 OpenSSH의 프로그램을 모방 한 기본 명령 행 인터페이스 가 Tab있습니다. 따라서라는 원격 파일을 검색하는 somefile.tar.gz것이 쉬울 수 있습니다 get soTabEnter.

  • 끌어서 놓기 -파일을 터미널 창으로 끌어서 놓으면 자동으로 입력 rz되어 파일을 보내기 시작합니다.

    또는 SFTP 탭을 열고 해당 탭에 파일을 놓아 SFTP를 통해 전송할 수 있습니다. 따라서, 원격 시스템에 파일을 보내는 것처럼 간단 할 수있는 Alt-P, 드래그 , 드롭 .

    SFTP를 통한 전송은 TCP 기반 프로토콜이기 때문에 전송 속도가 훨씬 빠르므로 최신 TCP / IP 스택 의 대형 슬라이딩 창 에서 이점을 얻습니다 . ZModem은 64KB 블록 크기가 "큰"것으로 간주되던 시절에 설계되었습니다. 따라서 링크의 많은 잠재적 속도는 ZModem에 흡수되며 각 끝은 블록 전송 승인을 기다립니다.

    끌어서 놓기 작업 모드에서 한 가지 좋은 점은 ZModem을 사용하여 스트레스 중 하나를 취한다는 것입니다. rz원격 시스템에서 입력하면 SecureCRT가 파일 선택기를 자동으로 팝업합니다. 그런 다음 원격 측 시간이 초과되기 전에 약 1 분 동안 파일을 찾아서 선택해야합니다. 이것은 24 시간 경쾌한 분위기를 조성합니다. 드래그 앤 드롭을 사용하면 여가 시간에 파일을 찾은 다음 마우스를 한 번의 빠른 동작으로 전송을 시작할 수 있습니다.

    명시 적 rz명령 으로 전송을 시작하면서 여전히 수동 방법을 사용합니다 . SecureCRT를 사용하면 세션 별 업로드 디렉토리를 구성 할 수 있기 때문에 특정 원격 사이트에서 실행중인 최신 소프트웨어 빌드가 항상 포함 된 파일 서버의 폴더를 가리 킵니다. 이러한 전송의 경우 파일 선택기가 시작하기에 올바른 위치에서 열리므로 시계와의 경쟁은 없습니다.


1

사용하다 "!" 파일을 ASCII 표현 (예 :)으로 변환합니다 ! uuencode myfile.bin >uuencode.dat. 그런 다음을 사용하십시오 ! cat uuencode.dat >target.dat. 그런 다음 대상 측에서 uudecode를 사용하십시오.! uudecode target.dat >myfile.bin

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