Sao chép một tập tin trở lại hệ thống cục bộ với ssh


257

Nếu tôi đăng nhập vào hệ thống qua SSH, có cách nào đó để sao chép tệp trở lại hệ thống cục bộ của tôi mà không kích hoạt thiết bị đầu cuối hoặc phiên màn hình khác và thực hiện scp hoặc một cái gì đó tương tự hoặc không thực hiện SSH từ hệ thống từ xa trở lại hệ thống địa phương?


4
Nếu bạn có máy chủ ssh trên máy khách của mình, bạn luôn có thể thử scp file.foo user@myclient.com:file.foo: P
rahmu

4
Chắc chắn, nhưng tôi không muốn cho phép truy cập vào máy tính của mình từ máy chủ thuộc sở hữu của một công ty tôi làm việc :) Dù sao tôi chỉ có xác thực dựa trên khóa và sẽ không quá an toàn khi đặt khóa riêng của tôi lên máy chủ
Naftuli Kay

2
Tôi không hiểu vấn đề của bạn. Tạo một cặp khóa mới, sao chép phần công khai vào máy tính của bạn ủy quyền và sau khi chuyển khoản của bạn xóa dòng đó một lần nữa.
Nils

8
Tôi làm điều này rất nhiều, vì vậy sẽ không hiệu quả khi làm điều này mỗi khi tôi muốn sao chép một tập tin ở giữa phiên SSH. Tôi chỉ đang tìm cách, trong khi ở phiên thiết bị đầu cuối SSH, để nối lại máy tính cục bộ của tôi và yêu cầu nó gửi một tệp đến máy chủ từ xa mà không phải rời khỏi phiên SSH hiện tại.
Naftuli Kay

2
Vấn đề là đăng nhập ssh ban đầu có thể gây khó khăn (2fa hoặc các thách thức khác ngoài khóa hoặc mật khẩu), chúng tôi có thể không có quyền riêng tư để thay đổi cấu hình của máy chủ ssh, không có lý do gì để phải đàm phán chính nhiều lần và rằng một khi chúng ta có một phiên, sẽ rất tuyệt nếu sử dụng phiên đó cho nhiều thứ.
duanev

Câu trả lời:


139

Kết nối chính

Thật dễ dàng nếu bạn có kế hoạch trước.

Mở kết nối chính lần đầu tiên. Đối với các kết nối tiếp theo, định tuyến các kết nối nô lệ thông qua kết nối chính hiện có. Trong của bạn ~/.ssh/config, thiết lập chia sẻ kết nối sẽ tự động xảy ra:

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

Nếu bạn bắt đầu một phiên ssh đến cùng (người dùng, cổng, máy) như một kết nối hiện có, phiên thứ hai sẽ được chuyển qua phiên thứ nhất. Thiết lập kết nối thứ hai không yêu cầu xác thực mới và rất nhanh.

Vì vậy, trong khi bạn có kết nối hoạt động của mình, bạn có thể nhanh chóng:

Chuyển tiếp

Trên một kết nối hiện có, bạn có thể thiết lập một đường hầm ssh ngược. Trên dòng lệnh ssh, tạo chuyển tiếp từ xa bằng cách chuyển qua -R 22042:localhost:2222042 là số được chọn ngẫu nhiên khác với bất kỳ số cổng nào khác trên máy từ xa. Sau đó, ssh -p 22042 localhosttrên máy từ xa kết nối bạn trở lại máy nguồn; bạn có thể sử dụng scp -P 22042 foo localhost:để sao chép tập tin.

Bạn có thể tự động hóa điều này hơn nữa với RemoteForward 22042 localhost:22. Vấn đề với điều này là nếu bạn kết nối với cùng một máy tính có nhiều phiên bản ssh hoặc nếu có ai đó đang sử dụng cổng, bạn sẽ không nhận được chuyển tiếp.

Nếu bạn chưa kích hoạt chuyển tiếp từ xa từ đầu, bạn có thể thực hiện trên phiên ssh hiện có. Loại Enter ~C Enter -R 22042:localhost:22 Enter. Xem các nhân vật Escape Escape trong sách hướng dẫn để biết thêm thông tin.

Ngoài ra còn có một số thông tin thú vị trong luồng Server Fault này .

Sao chép dán

Nếu tệp nhỏ, bạn có thể nhập nó ra và sao chép-dán từ đầu ra thiết bị đầu cuối. Nếu tệp chứa các ký tự không in được, hãy sử dụng mã hóa như base64 .

remote.example.net $ base64 <myfile
 (sao chép đầu ra)
local.example.net $ base64 -d> myfile
 (dán nội dung clipboard)
Ctrl +D

Thuận tiện hơn, nếu bạn có X chuyển tiếp hoạt động, sao chép tệp trên máy từ xa và dán cục bộ. Bạn có thể dẫn dữ liệu vào và ra xcliphoặc xsel. Nếu bạn muốn giữ tên tệp và siêu dữ liệu, hãy sao chép-dán một tệp lưu trữ.

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

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

Nếu chúng ta có thể chuyển tệp bằng SSH, tại sao mọi người vẫn cần / sử dụng SFTP?
Pacerier

3
@Pacerier Vì SFTP là một cách để truyền tệp bằng SSH.
Gilles

Tại sao mọi người thậm chí cần SFTP nếu họ có thể chuyển tệp bằng SSH-without-SFTP?
Pacerier

Phương pháp sao chép-dán đặc biệt thuận tiện với các kết nối được xâu chuỗi (tức là nhảy qua một số máy chủ để đến cái cuối cùng)
golimar

1
@Pacerier SFTP có một số lệnh bổ sung như tệp danh sách hoặc xóa tệp từ xa, v.v.
rahmu

67

Một cách dễ dàng khác (IMO) sẽ là:

# 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

Hoặc nếu bạn thích một cái gì đó giống như GUI, hãy thử Midnight Commander . Họ gọi tính năng Shell-Link . Hầu hết các distro có em trong hệ thống gói của họ như mc.


8
Thành thật mà nói, tôi không hiểu tại sao điều này không được nêu lên. OP yêu cầu một giải pháp mà không có scp. Đôi khi, đặc biệt như trong trường hợp của tôi khi tôi vào một bộ định tuyến do ISP cung cấp rất tê liệt, tôi không có sftp, tôi không có scp và thậm chí ftp bị hỏng nặng. Tôi biết tôi có thể làm điều này, tôi chỉ đến đây để đảm bảo cú pháp của tôi là đúng.
Auspex

1
Xuất sắc! mclà cách nhanh nhất để sử dụng.
Namek

2
Trên thực tế, giải pháp này không hoạt động trong trường hợp của tôi. Với một đường hầm được tạo từ Windows sang Linux, bạn bắt đầu bằng putty chứ không phải terminal. Phương pháp này chính xác là những gì tôi muốn, nhưng tôi không thể sử dụng nó. Bực mình.
Benjamin

1
Lý do tôi không ủng hộ điều này là vì nó sẽ không hoạt động nếu máy khách đứng sau bộ định tuyến dùng chung (như mạng công ty). Giả sử tôi đang ở trên máy tính làm việc và tôi đã vào máy chủ ở nhà. Làm cách nào để sao chép một tập tin vào máy tính làm việc của tôi đã trải qua những khó khăn của cd'ing thông qua các thư mục phức tạp với khoảng trắng và ký tự đặc biệt?
Sridhar Sarnobat

1
Nó hoạt động tốt với dữ liệu nhị phân. Tôi đang làm điều này với tgzcác tập tin mọi lúc :)
Florian Fida

53

SSH không hỗ trợ một vài lệnh, thông qua ký tự thoát ( ~theo mặc định):

$ ~?
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

Các !argsdường như là gần nhất với những gì bạn muốn. Lưu ý rằng bạn sẽ cần phải PermitLocalCommandbật trong /etc/ssh_configtệp của mình để các ~Clệnh hoạt động (xem man ssh_config).

Bạn có thể tái sử dụng phiên ssh tương tự nếu bạn thiết lập một ControlMastertrong ssh_config. Nếu bạn làm điều này:

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

về mặt kỹ thuật, bạn chưa bao giờ rời khỏi phiên ssh và không cần xác thực lại. Có lẽ phức tạp hơn bạn muốn, nhưng tôi không thể nghĩ ra một cách dễ dàng khác.


Điều này vẫn còn hoạt động? Tôi không thể tìm thấy !argstrong tin nhắn trợ giúp.
xuhdev

@xuhdev nó vẫn còn đó trên OpenSSH_7.2p2, argskhông có trong thông báo trợ giúp đầu tiên ( ~?), nhưng trong lần thứ hai (lần một đi vào ssh>nhanh chóng với ~C, người ta có thể gõ helptại ssh>dấu nhắc)
sdaau

Đây có vẻ là một giải pháp tốt (mặc dù tôi chưa thử), tôi không nhận ra bạn có thể có bộ đệm dòng lệnh cha, kiểu vim. Trong thực tế, người ta có thể chỉ đơn giản thích mở tab thiết bị đầu cuối mới để họ không quên cách quay lại phiên (như khi tôi không bao giờ có thể nhớ cách thoát emacs).
Sridhar Sarnobat

37

Đó là tất cả các phương pháp rất phức tạp.
Bạn có thể gắn hệ thống tệp từ xa trên máy cục bộ của mình bằng sshfs:

mkdir -p /mnt/sshfs

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

Sau đó, bạn có thể sao chép dán tập tin với nautilus, gnome, konqueror, cá heo, bash hoặc bất cứ điều gì.


4
Kết nối với tệp khóa:sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/
sshow

15
  • Sử dụng ssh-xfer , một tác nhân ssh đã sửa đổi, có hiệu quả làm quá tải kênh bên ssh hiện có để sử dụng truyền tệp.
  • Sử dụng zssh , mà là một cách hiệu quả ZModem qua ssh. Nếu bạn đã từng sử dụng rzsz thì điều này có vẻ rất quen thuộc.
  • Đảo ngược ( -R, đối với -Lcác cổng từ xa đến cục bộ) hoặc chuyển tiếp ( , đối với các cổng cục bộ sang từ xa) để chạy chuyển tập tin qua, giả sử bạn có một số trình nền chuyển tập tin đang nghe ở đầu bên kia.

Nhưng không ai trong số này thực sự cần thiết, IMO. Giao thức SSH hỗ trợ nhiều kênh trên một kết nối và ứng dụng khách OpenSSH hỗ trợ ghép kênh. Giả sử bạn có ControlMasterControlPath thiết lập ( ControlPersistcũng hữu ích),

  # kết nối đầu tiên
$ ssh từ xa

  # sẽ ghép kênh trên cùng một kết nối mà ssh gốc đã mở
$ sftp từ xa

5
zmodem làm tôi nhớ đến việc tải xuống phần mềm chia sẻ mới nhất từ ​​BBS địa phương .. :-)
Stuart Woodward

Cách xfer chính xác là những gì tôi đang tìm kiếm, nhưng bạn có biết tại sao bản vá ssh-xfer không được bao gồm trong thượng nguồn OpenSSH không? Một số ngọn lửa?
Ferran Basora

Cảm ơn cho gợi ý zssh! Tôi đang sử dụng tmux trong Konsole và vì tmux "sz" của tôi từ máy chủ không hoạt động nữa. Các zssh giải quyết vấn đề của tôi!
0xAF

9

Một cách tiếp cận thậm chí đơn giản hơn: Mở Filezilla (hoặc trình duyệt ftp yêu thích của bạn), mở kết nối ssh đến cùng một trang, tìm tệp và kéo nó qua cấu trúc tệp cục bộ của bạn. Nếu bạn chưa quen với Filezilla, hãy sử dụng tính năng "trình quản lý trang" để kết nối lại nhanh vào lần tiếp theo.

Vâng, tôi biết điều này là hiển nhiên đối với hầu hết các bạn (và không chính xác tại điểm), nhưng một số người (như tôi) đã tìm thấy chủ đề này tìm kiếm một giải pháp chỉ dành cho thiết bị đầu cuối có thể đã bỏ qua điều hiển nhiên.



Tôi tin rằng máy chủ FileZilla chỉ là Windows. Khách hàng là đa nền tảng mặc dù
Freedom_Ben

Bạn thậm chí có thể sử dụng Caja, chỉ cần mở ssh://SERVER.
bản6

8

Những gì tôi đã tìm thấy là giải pháp tốt nhất và hiệu quả nhất là sử dụng xclip-copyfilexclip-pastefile.

Trên máy chủ, bạn sử dụng xclip-copyfileđể sao chép một hoặc nhiều tệp. Những tập tin này sau đó có sẵn trên máy chủ cục bộ của bạn. Ở đó, bạn có thể sử dụng xclip-pastefile.

Điều này bỏ qua nhu cầu sử dụng scphoặc có một máy chủ ssh cục bộ. Tôi sử dụng điều này với cygwin chẳng hạn. Vấn đề duy nhất là điều này yêu cầu cài đặt xclipnếu bạn chưa có nó. Oh, và điều này làm việc với các tập tin nhị phân quá.


Wow đây có thể là một giải pháp tốt hơn so với chuyển tiếp cổng ngược của tôi cộng với netcat.
Sridhar Sarnobat

3

Một trong nhiều lý do chúng tôi sử dụng SecureCRT - mặc dù thích phần mềm nguồn mở trong thực tế - là việc dễ dàng thực hiện chuyển tập tin. Đơn giản là không có sự thay thế trực tiếp trong thế giới F / OSS.

SecureCRT khởi đầu là một chương trình Windows thuần túy vào giữa những năm 1990 nhưng đã được chuyển sang Mac OS X và Linux vài năm trước .

SecureCRT có ba tính năng chính để truyền tệp đến và từ một hệ thống mà bạn đang SSH vào:

  • ZModem , YModem , XModem , Kermit và ASCII - SecureCRT là một loại trình giả lập thiết bị đầu cuối trường học cũ, hỗ trợ một số giao thức truyền tệp trong băng tần.

    Dễ sử dụng nhất là ZModem. Khi bạn nhập một cái gì đó giống như sz file-to-downloadtrên dòng lệnh từ xa, szchương trình từ xa sẽ viết một chuỗi thoát thông báo cho SecureCRT ngay lập tức bắt đầu tải file-to-downloadxuống thư mục tải xuống mặc định.

    Một liên lạc tốt đẹp là thư mục tải xuống có thể tùy chỉnh mỗi phiên. Chúng tôi sử dụng điều này để có các thư mục trên mỗi trang trên máy chủ tệp văn phòng chính của chúng tôi, vì vậy chúng tôi không phải sắp xếp các tệp đã tải xuống theo cách thủ công.

    ( szlà chương trình "gửi ZModem", một phần của lrzszgói. Nó đã được đóng gói cho hầu hết các hệ thống Unix. Nếu vì lý do nào đó, hệ thống từ xa của bạn chưa cài đặt và bạn có thể dễ dàng cài đặt gói nhị phân, gói nguồn nhỏ và có tính di động cao. Hơn một lần, tôi đã phải gửi một lrzsz "tarchive" hoặc uuencode'tarball đến một hệ thống từ xa bị loại bỏ để tôi có thể gửi các tệp ZModem cho nó.)

  • SFTP - SecureCRT có triển khai SFTP cơ bản được tích hợp chặt chẽ.

    Bằng cách "tích hợp chặt chẽ", ý tôi là khi bạn đưa ra lệnh menu SFTP hoặc phím tắt, nó sẽ mở một tab mới được kết nối với trang web từ xa qua cùng một kết nối SSH. Do đó, bạn không cần phải đăng nhập lại và kết nối được thiết lập nhanh hơn một chút so với khi bạn đã mở một kết nối SFTP riêng cho cùng một máy chủ.

    Tôi mô tả tính năng SFTP là "cơ bản" vì Phần mềm VanDyke có một sản phẩm truyền tệp riêng biệt, SecureFX . Nó có nhiều tính năng hơn ứng dụng khách SFTP tích hợp và cũng tích hợp với SecureCRT.

    Tính năng SFTP của SecureCRT cho phép bạn định cấu hình các thư mục cục bộ và từ xa mặc định tách biệt với cấu hình ZModem.

    Tính năng SFTP này có một loại giao diện dòng lệnh cơ bản, bắt chước sftpchương trình của OpenSSH , ngoại trừ việc nó có đủ khả năng như Tabhoàn thành lệnh. Do đó, việc truy xuất một tệp từ xa được gọi somefile.tar.gzcó thể dễ dàng như get soTabEnter.

  • Kéo và thả - Nếu bạn kéo và thả tệp vào cửa sổ đầu cuối, nó sẽ tự động gõ rzcho bạn và bắt đầu gửi tệp.

    Thay phiên, bạn có thể mở tab SFTP và thả tệp vào tab đó để gửi qua SFTP. Do đó, việc gửi một tệp đến một hệ thống từ xa có thể đơn giản như Alt-P, kéo , thả .

    Chúng tôi thấy rằng việc chuyển tiền diễn ra nhanh hơn rất nhiều thông qua SFTP, có lẽ vì đó là giao thức dựa trên TCP, do đó, nó được hưởng lợi từ các cửa sổ trượt lớn của ngăn xếp TCP / IP hiện đại . ZModem được thiết kế vào thời mà kích thước khối 64 kiB được coi là "lớn". Do đó, rất nhiều tốc độ tiềm năng trong một liên kết đã ngấm vào ZModem trong khi mỗi đầu đều chờ xác nhận chuyển khối.

    Một điều thú vị về chế độ hoạt động kéo và thả là nó làm mất một trong những căng thẳng khi sử dụng ZModem. Khi bạn nhập rzvào hệ thống từ xa, SecureCRT sẽ tự động bật trình chọn tệp. Sau đó, bạn có khoảng một phút để tìm và chọn tệp trước khi hết thời gian từ xa. Điều này tạo ra một sự rung cảm chạy đua với đồng hồ không dễ chịu. Kéo và thả cho phép bạn tìm thấy tệp lúc rảnh rỗi, sau đó bắt đầu chuyển bằng một chuyển động nhanh của chuột.

    Chúng tôi vẫn sử dụng phương thức thủ công, bắt đầu chuyển bằng một rzlệnh rõ ràng . Điều này là do SecureCRT cho phép bạn định cấu hình thư mục tải lên mỗi phiên, chúng tôi trỏ đến thư mục trên máy chủ tệp luôn chứa bản dựng mới nhất của phần mềm mà trang web từ xa cụ thể đang chạy. Đối với các lần chuyển như vậy, không có cuộc đua với đồng hồ, vì trình chọn tệp mở ở đúng vị trí để bắt đầu.


1

Sử dụng "!" để chuyển đổi tệp thành bản trình bày ASCII của tệp của bạn (ví dụ ! uuencode myfile.bin >uuencode.dat). Sau đó sử dụng ! cat uuencode.dat >target.dat. Sau đó, sử dụng uudecode ở phía đích:! uudecode target.dat >myfile.bin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.