Tải xuống một tệp qua phiên SSH hoạt động


86

Tôi muốn tải xuống một tệp từ phiên SSH hoạt động. Trong nhiều trường hợp tôi có lẽ có thể chỉ cần sử dụng SFTP, scp, rsyncet al nhưng có những thời điểm mà tôi đã nâng quyền truy cập vào máy chủ từ xa trong một cách mà tôi không thể sử dụng các phương pháp này.

Nếu bạn đang đấu tranh để hiểu ý tôi là gì, hãy tưởng tượng rằng bạn muốn tải xuống một cái gì đó từ /root/hoặc /var/log/auth.log. Root đăng nhập bị vô hiệu hóa (vì chúng tôi không phải là kẻ ngốc). Làm thế nào để bạn có được tập tin đó? Sao chép nó ra một nơi nào đó ít được bảo vệ và sau đó di chuyển nó? Điều này là khó khăn. Cũng có những tình huống trong đó đường dẫn từ xa phức tạp hoặc tạm thời hoặc thậm chí không phải là đường dẫn bởi vì tôi muốn đầu ra của một lệnh từ xa được lưu trữ cục bộ. Lưu trữ từ xa, sau đó sao chép? Khốn nạn!

Có một số cách khó hiểu hơn để đạt được các phiên bản này, nhưng trong một thế giới lý tưởng, tôi sẽ có một cái gì đó giống với truy cập ghi cục bộ từ máy chủ từ xa, sử dụng phiên SSH hiện tại làm kênh dẫn. Một cái gì đó như (đây chỉ là ấn tượng của một nghệ sĩ):

$oli@remote: cp /root/cheesecake /local/

Và nó chỉ xuất hiện ở địa phương của tôi cwd. Và truy cập hai chiều sẽ không phải là một điều xấu.


Đã tám năm kể từ khi tôi hỏi câu hỏi này và chúng tôi đã thấy một loạt các cục cục thực sự, nhưng nó vẫn là một vấn đề mà thỉnh thoảng tôi vẫn phải vật lộn.

Tôi đã tái cấu trúc câu hỏi thành một cái gì đó lý tưởng hơn nhiều. Tôi hoàn toàn hiểu rằng hiện tại có thể không có một câu trả lời hoàn hảo. Tất cả những nỗ lực trong quá khứ và tương lai đối với lý tưởng của tôi đều được đánh giá cao.


1
Câu hỏi thú vị! Nó thực sự cho thấy ý tưởng của mọi người về những gì hợp lý để được định hình bằng các công cụ họ sử dụng. zsshcó lẽ là gần nhất với quy trình làm việc giống như zmodem mà bạn có thể đang nhớ.
poolie

1
Tôi thực sự ngạc nhiên rằng ngay cả sau 8 câu trả lời, không có thực sự bất kỳ cách nào để làm điều này
endolith

Câu trả lời:


34

Bạn có thể muốn kiểm tra zssh , có sẵn trong vũ trụ, và do đó có sẵn với

sudo apt-get install zssh

Bạn cần nó trên máy chủ ubfox và trên máy khách của bạn, nhưng về cơ bản khi đăng nhập bằng zssh, bạn chỉ cần nhấn 'ctrl- @' và nó hiện ra "Chế độ truyền tệp" cho phép bạn gửi các tệp xuống đường ống đến máy khách hoặc tải chúng từ máy khách lên máy chủ.

Tuy nhiên, bạn không phải xác thực lại hoặc mở một cửa sổ mới để scp.

Nếu bạn đang sử dụng các phím ssh và một tác nhân ssh, bạn hoàn toàn có thể dễ dàng thực hiện:

[enter]~[ctrl]-Z

Mà sẽ nền ssh, và sau đó chỉ scp $!:/whatever/whatever .'

Khi tệp được chuyển, fgđể lấy lại ssh.

Nếu bạn không sử dụng các khóa ssh, bạn vẫn có thể sử dụng các tùy chọn "ControlMaster" và "ControlPath" được thêm vào các phiên bản OpenSSh gần đây, nhưng điều đó thật khó khăn, hãy kiểm tra man ssh_config


24

Giả sử bạn đang chạy một máy chủ ssh trên máy tính để bàn của bạn (có nhiều cách khác, nhưng tôi nghĩ rằng tất cả chúng đều phức tạp hơn và có thể có vấn đề về bảo mật), bạn có thể thiết lập một đường hầm ssh ngược. Xem SSH dễ dàng sao chép tệp vào hệ thống cục bộ. qua tại unix.SE .

  • Nhập Enter ~C Enter -R 22042:localhost:22 Enterđể tạo chuyển tiếp cổng ngược từ máy chủ của bạn sang máy tính để bàn của bạn (22042 có thể là bất kỳ số cổng nào trong khoảng từ 1024 đến 65534 không được sử dụng).
  • Sau đó scp -P 22042 foo localhost:sẽ sao chép tệp footrong thư mục hiện tại của bạn trên máy chủ về nhà của bạn trên máy tính để bàn.
  • Bây giờ di chuyển tệp vào thư mục hiện tại của bạn trên máy tính để bàn bằng cách nhập Enter ~ Ctrl+ Z mv ~/foo . Enter fg Enter.

Trình tự thoát Ssh bắt đầu bằng ~; dấu ngã chỉ được công nhận sau một dòng mới. ~ Ctrl+Zđặt ssh vào nền. ~Cnhập một dòng lệnh nơi bạn có thể tạo hoặc xóa chuyển tiếp.


1
Sử dụng 2 lớp mã hóa & nén là hơi quá mức, đó là lý do tại sao tôi đề xuất sử dụng rsh hoặc ftp cho "liên kết ngược".
JanC

2
@JanC: Điều đó đòi hỏi nhiều thiết lập hơn: bạn phải cài đặt máy chủ rsh hoặc ftp và đảm bảo cấu hình của nó được an toàn. Chi phí mã hóa là tối thiểu ngay cả trên netbook.
Gilles

Một máy chủ ssh không được cài đặt theo mặc định. ;)
JanC

@JanC: Một ưu điểm khác của ssh là nếu bạn đã kích hoạt chuyển tiếp đại lý, bạn sẽ không phải nhập mật khẩu để thực hiện sao chép. Quy trình làm việc hiệu quả trên máy vi tính hiệu quả.
Gilles

Tất nhiên, bạn có thể làm một cái gì đó tương tự với (một số) dịch vụ khác. Trong mọi trường hợp, có nhiều giải pháp tương tự, tất cả đều liên quan đến việc thiết lập kết nối đường hầm trở lại và một trình nền bổ sung ...;)
JanC

10

Tôi đã nghĩ ra một cách để làm điều này với ssh tiêu chuẩn. Đó là tập lệnh sao chép kết nối ssh hiện tại, tìm thư mục làm việc của bạn trên máy từ xa và sao chép lại tệp bạn chỉ định cho máy cục bộ. Nó cần 2 tập lệnh rất nhỏ (1 remote, 1 local) và 2 dòng trong cấu hình ssh của bạn. Các bước thực hiện như sau:

  1. Thêm 2 dòng này vào ~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    Bây giờ nếu bạn có kết nối ssh với machineX mở, bạn sẽ không cần mật khẩu để mở mật khẩu khác.

  2. Tạo tập lệnh 1 dòng trên máy từ xa được gọi là ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Tạo một tập lệnh trên máy cục bộ có tên ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. và tạo một bí danh cho Grab.sh trong ( ~/.bashrchoặc bất cứ nơi nào):

    alias grab=~/.grab.sh
    

Thế là xong, tất cả đã xong. Bây giờ nếu bạn đã đăng nhập machineX:/some/directory, chỉ cần khởi động một thiết bị đầu cuối mới và gõ

grab machineX filename

Điều đó đặt tệp trong thư mục làm việc hiện tại của bạn trên máy cục bộ. Bạn có thể chỉ định một vị trí khác làm đối số thứ ba để "lấy".

Lưu ý: Rõ ràng cả hai tập lệnh phải là "thực thi", tức là chmod u+x filename.


Thật thú vị, bạn có thể giải thích làm thế nào điều này hoạt động? Bạn có thể mở rộng điều này để hỗ trợ "đặt" các tệp cũng như lấy chúng không?
Peter Gibson

5

Nếu máy khách của bạn (máy bạn đang ngồi) được gọi là máyA và máy bạn hiện đang SSH được gọi là máy B. MáyA, máy cục bộ của bạn phải chạy SSHD và mở cổng 22. Sau đó:

scp myfile machineA:

Bản sao myfiletrên MachineB vào thư mục chính MachineA của tôi trên machineA. Giả định userid / password này giống nhau.

scp myfile machineA:/newdir/newname

Sao chép myfilemột MachineB /newdir/newnamevào máyA. Giả định userid / password này giống nhau.

scp MachineA:/path/to/my/otherfile . 

Nhận một bản sao otherfiletừ thư mục MachineA của tôi trên MachineA và đặt nó vào thư mục làm việc hiện tại của tôi trên máy MachineB (được chỉ định theo kiểu UNIX tiêu chuẩn theo ký tự "dot" (.)). Giả định userid / password này giống nhau.

Nếu userid / password không giống nhau thì hãy sử dụng:

scp myfile user@MachineA: để lấy tập tin

scp user@MachineA:/path/to/my/otherfile . để đặt các tập tin

GHI CHÚ về SCP:

Giống như cplệnh, scpcó tùy chọn -p để truyền các cài đặt quyền của tệp gốc sang bản sao (nếu không, bản sao được tạo với các cài đặt bình thường cho các tệp mới) và tùy chọn -r để sao chép toàn bộ cây thư mục bằng một chỉ huy.

scptạo ra một kênh dữ liệu được mã hóa hoàn toàn trong suốt giữa hai máy, vì vậy dữ liệu nhị phân (như hình ảnh hoặc chương trình thực thi) được bảo tồn chính xác. Điều này cũng có nghĩa scplà không thể thực hiện chuyển đổi kết thúc cuối dòng tự động giữa các loại hệ điều hành khác nhau, như có thể được thực hiện với ftp trong chế độ "ascii". Điều đó sẽ không thành vấn đề khi sao chép giữa các hệ thống Unix, tất cả đều sử dụng cùng một quy ước cuối dòng.


2

nếu bạn truy cập máy chủ qua ssh, bạn cũng có khả năng kết nối qua sftp. Giữ tệp clientzilla (GUI) tiện dụng và dán đường dẫn bạn hiện đang đi

nhập mô tả hình ảnh ở đây


2
Điều này sẽ có lợi bằng cách chi tiết hơn, bao gồm cả cách kết nối với máy chủ SSH với FileZilla (không rõ ràng). Ảnh chụp màn hình cũng có thể giúp ích, ngoài văn bản giải thích .
Eliah Kagan

2

Nếu tệp của bạn đủ nhỏ, bạn có thể mã hóa nó bằng base64 và sau đó giải mã nó cục bộ:

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

Câu trả lời gốc nơi tôi đã nhận được điều này (và đã thử nghiệm) từ: https://unix.stackexchange.com/a/2869/194134


Điều đó có liên quan gì? Bạn không cần phải mã hóa các tệp để txfr chúng bằng scp, v.v.
HörmannHH

1

Nó không qua kết nối SSH đang hoạt động, nhưng scp sao chép các tệp bằng các cơ chế và quyền tương tự như ssh.


4
Tôi biết về scp nhưng đó là một quy trình làm việc rất rời rạc. Nếu tôi đang làm việc trong một thư mục từ xa nhất định, tôi cần lấy đường dẫn từ xa, ngắt kết nối (hoặc sinh ra một shell khác), thực hiện quét ghi ra các đường dẫn và sau đó kết nối lại. Tôi đang tìm kiếm thứ gì đó giống với văn bản get filevà nó xuất hiện một cách kỳ diệu trên máy cục bộ của tôi. Nếu nó phải thực hiện điều đó thông qua một số dịch vụ được điều chỉnh qua SSH, thì cũng vậy .. Nhưng nó phải bị ràng buộc theo phiên.
Oli

Thêm vào đó, nó đã được thay thế bởi sftp (xem câu trả lời của tôi)
Olivier Lalonde

@Oli - Vì cả hai đầu của giao dịch là các hộp * nix, nên có khả năng cả hai đều sshdđang chạy và do đó bạn sẽ có thể sử dụng scptrên dòng lệnh của máy chủ để ném tệp lại cho máy khách. Chỉ có rất nhiều phép thuật để đi xung quanh; đôi khi chúng ta vẫn phải nhấn các nút. Giải pháp FileZilla cũng tiện dụng.
zerobandference

1

Điều này là không thể với phiên ssh mặc định, nhưng bạn có thể sử dụng tập lệnh thay vì ssh, khởi động một cái gì đó như máy chủ ftp hoặc rsh đơn giản trên hệ thống cục bộ của bạn và chạy ssh với các tùy chọn cần thiết để thiết lập đường hầm trở lại máy tính để bàn của bạn để kết nối với máy chủ này.


Hoặc chỉ có thể scp / rsync ...
HörmannHH

1

konsole có khả năng đó thông qua menu "Chỉnh sửa-> Tải lên ZModem" khi bạn đang ở trong một phiên từ xa (hoặc Ctrl-Alt-U).

Xin lưu ý: gói lrzszphải được cài đặt trước. Đối với tôi có vẻ như chỉ hoạt động để tải lên các tệp ASCII.


0

Vì bạn đang kết nối từ máy tính để bàn, tôi đoán bạn có thể mở thiết bị đầu cuối thứ hai.

Đây là cách tôi thường làm:

  • từ thiết bị đầu cuối đầu tiên, phiên bản ssh đang chạy, tôi nhận được đường dẫn đầy đủ của tệp tôi cần nhận, sử dụng realpath myfilehoặc readlink -f myfile(các bản phát hành Ubuntu cũ hơn không cài đặt sẵn realpath) và sao chép nó.
  • từ thiết bị đầu cuối thứ hai tôi sử dụng scphoặc sftpđể lấy tệp, dán đường dẫn đầy đủ tôi nhận được trước đó. Ví dụ:scp user@host:/etc/some/file ./

Nó khá cơ bản, nhưng nó cũng dễ nhớ và không cần thêm gói nào để hoạt động.

lấy đường dẫn đầy đủ từ thiết bị đầu cuối đầu tiên, và sau đó dán vào thiết bị đầu cuối thứ hai


Không giúp ích gì với vấn đề "cố gắng lấy tệp gốc và đăng nhập bằng root trực tiếp là không được phép" đặt ra trong câu hỏi.
Oli

0

Đáng ngạc nhiên là tôi không thấy bất kỳ đề cập nào về Chỉ huy nửa đêm tốt bụng ở đây. Theo tôi, đây có lẽ là trình quản lý tệp phổ biến và hữu ích nhất cho trình bao với khả năng mạnh mẽ, một trong những công cụ "phải có" cho trường hợp này, cũng cho phép bạn kết nối thông qua SSH, FTP, SFTP bảng thứ hai bạn có thể mở bất kỳ hệ thống tệp nào khác (cục bộ) và do đó làm việc với các tệp một cách tự do.

Tất cả bạn cần là: apt-get install mc (từ vũ trụ)

Sau đó, chạy mc, mở menu cho bảng điều khiển bên trái hoặc bên phải, chọn kết nối shell, nhập tên người dùng @ remote-ip, mật khẩu - thực tế, đó là .. sao chép (tại đây: tải xuống) tệp / thư mục từ máy này sang máy khác với F5, di chuyển với F6, và cứ thế theo các nút bên dưới. Đối với người dùng MS cũ: giống như trong NC cho DOS


-2

CÁCH lật đổ điều này, folks. Tôi đã tìm kiếm tất cả các câu trả lời sâu, tối, phức tạp quá. Hóa ra, bạn có thể làm điều này ngay từ cá heo ra khỏi lon. cá: // tên người dùng @ máy chủ: cổng


Tôi không hiểu điều đó
Pierre.Vriens

Tôi không nghĩ bạn hiểu trường hợp sử dụng của tôi. Tôi đang ở trong một phiên dòng lệnh SSH đang hoạt động và muốn gửi một tệp trở lại máy tính cục bộ của tôi từ một vị trí [có khả năng đặc quyền, tức là không có sẵn trên SFTP]. Nó thậm chí có thể không phải là một tập tin tại genesis của nó, nó có thể là đầu ra lệnh. Tôi đang tìm cách nào đó để đưa nó trở lại mà không tạo các tệp trung gian và bắt đầu các phiên SFTP / SCP / etc mới.
Oli
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.