Câu trả lời:
Tôi biết đây là một câu trả lời muộn, nhưng tôi chỉ tìm ra một cách hay để làm điều này. Về cơ bản, đây là câu trả lời của Holger, nhưng trong tệp cấu hình đã lưu:
Bạn cần đặt ~/.ssh/config
tệp này vào tệp của mình trên local.machine, (tạo tệp nếu nó không tồn tại)
Host target.machine
User targetuser
HostName target.machine
ProxyCommand ssh proxyuser@proxy.machine nc %h %p 2> /dev/null
Sau khi lưu tệp, bạn chỉ có thể sử dụng
ssh target.machine
bất cứ lúc nào bạn muốn kết nối. Scp cũng sẽ hoạt động vì nó cũng tôn trọng tập tin cấu hình ssh. Nautilus cũng vậy, nếu bạn đang sử dụng Gnome và muốn sử dụng GUI.
Host proxy.machine
dòng trong cùng một ~/.ssh/config
tệp, 2) Đề cập đến việc các lệnh này có thể được lồng vào nhau hay không (ví dụ: máy khách kết nối với máy chủ proxy 1 kết nối với máy chủ proxy 2 kết nối với. ..target) và 3) nc %h %p
có nghĩa là gì
Bạn có thể thực hiện nó trong một lệnh, nhưng bạn cần cài đặt netcat (nc) trên máy proxy:
ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine
[EDIT: trộn lẫn thứ tự của máy móc ...]
Bây giờ bạn có thể * làm điều này như một lớp lót, mà không yêu cầu nc
bất cứ nơi nào:
scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .
Giải trình
pcreds
và tcreds
đại diện cho proxy và mục tiêu của bạn thông tin nếu cần thiết ( username
, username:password
, vv).
Điều này là có thể bởi vì khả năng giống như netcat tích hợp, loại bỏ yêu cầu đối với nc
máy chủ trung gian. Sử dụng ssh -W host:port
thiết lập một đường hầm đến máy chủ và cổng được chỉ định và kết nối nó với stdin / stdout, sau đó scp
chạy qua đường hầm.
Các %h
và %p
trong ProxyCommand
được thay thế bằng máy chủ đích và cổng bạn chỉ định.
Để thuận tiện hơn nữa, bạn có thể định cấu hình proxy trong cấu hình ssh của mình:
Host target.machine
ProxyCommand ssh pcreds@proxy.machine -W %h:%p
và từ đó trở đi chỉ cần làm
scp tcreds@target.machine:file .
* kể từ OpenSSH 5.4 - phát hành tháng 3 năm 2010
-p <portnum>
trước một -W
trong hai phương thức để chỉ định cổng proxy
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .
OK, thực sự là hai lệnh ...
8080
-p <portnumber>
vào lệnh ssh của bạn
Một lớp lót? Không ra khỏi đỉnh đầu của tôi. Bạn cần thiết lập proxy trước và bạn không thể làm điều đó với scp.
Khi thực hiện thủ công, tôi mở một phiên màn hình cho đường hầm của mình:
screen -S tunnel
Màn hình được sử dụng để giữ cho đường hầm đi trong một vỏ nền. Sử dụng bất kỳ kỹ thuật nào bạn muốn giữ cho đường hầm mở ở chế độ nền (câu trả lời của @ Sydematvy có lẽ là đơn giản nhất). Một lần trong phiên màn hình tôi bắt đầu đường hầm của mình như vậy
ssh -L 2222:target.machine:22 [user@]proxy.machine
Để phá vỡ điều đó, về cơ bản, nó nói rằng "Trên máy cục bộ của tôi, mở cổng 2222 và bất kỳ kết nối nào nhấn localhost: 2222 được ủy quyền thông qua proxy.machine tới target.machine: 22"
Khi bạn đã thiết lập kết nối và đường hầm ssh, hãy tách ra khỏi phiên màn hình với "Ca d". Để quay lại phiên màn hình đó, hãy nhậpscreen -raAd tunnel
Khi bạn quay lại trình bao ban đầu, lệnh scp của bạn sẽ giống như
scp -P 2222 localhost:your/file/on/target.machine local/path
Hãy nhớ rằng cổng localhost 2222 thực sự chỉ là một đường hầm đi đến target.machine.
Xuất hiện rằng scp hỗ trợ tùy chọn "-o" giống như ssh, mặc dù tôi không chắc chắn làm thế nào để vượt qua tên người dùng / mật khẩu proxy:
scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path
Nếu bạn nhận nc: invalid option -- X
thấy https://stackoverflow.com/a/23616021/32453
Làm thế nào về:
scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location
Bạn có thể thử một cái gì đó như:
ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file
Nhưng nó sẽ không hoạt động nếu proxy.machine của bạn cần hỏi mật khẩu của bạn (rằng SSH không có trong TTY, do đó, Askpass sẽ thất bại).
Nếu bạn có nhiều tệp, bạn có thể sử dụng tar như thế này (chưa được kiểm tra, tôi thường sử dụng netcat theo cách đó):
tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"
Một giải pháp đơn giản khác để chuyển một source_file từ source_host sang Destination_host thông qua proxy_host :
Đăng nhập vào proxy_server :
ssh login@proxy_host
Từ máy chủ proxy, chuyển source_file từ source_host sang Destination_host (bạn có thể nhập dòng này dưới dạng một dòng, bỏ qua \
hoặc hai dòng, như hiển thị bên dưới):
scp login@source_host:/path_to_source_file \
login@destination_host:/path_to_destination_directory
Điều này yêu cầu đăng nhập trên source_host vào proxy_host sử dụng rsa_key.
Trong trường hợp bạn cần sử dụng khóa công khai, bạn sẽ cần một cái gì đó như thế này.
Host target-machine
User target-user
HostName target.example.com
IdentityFile /path/to/file.pem
ProxyCommand ssh bastion -W %h:%p
Host bastion
User bastion-user
HostName bastion.example.com
IdentityFile /path/to/file.pem
Tôi đã theo dõi bài viết này và tìm thấy một câu trả lời phù hợp với tôi. (Vì các câu trả lời ở trên không phù hợp với tôi).
Cách gửi scp
tệp qua máy chủ trung gian (còn gọi là máy chủ nhảy) http://mperdikeas.github.io/networking.html.files/scp-a-file- phiên- jump-
host.html
Và câu trả lời của tôi là như sau:
scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
{source_file} {remote_username}@{remote_IP}:{remote_file_path}
Thí dụ:
scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz
Tôi hy vọng câu trả lời này có thể giúp bạn.