Thực thi một lệnh trên máy tính cục bộ từ máy chủ SSH từ xa được kết nối?


13

Nói rằng tôi đã kết nối với một máy tính từ xa thông qua SSH. Từ một chương trình trên máy tính từ xa này, tôi cần thực thi một lệnh trên máy tính cục bộ của mình (bộ khởi tạo kết nối).

Điều này đặt ra câu hỏi: có thể đưa ra kết nối hiện có giữa hai máy tính để chạy lệnh trên máy tính cục bộ không?

Tôi đã cân nhắc việc chạy lệnh ssh user@host-of-connecting-party <command>trên máy tính từ xa để thiết lập kết nối đảo ngược. Nhưng điều này khó tự động hóa hơn và sẽ cần sự can thiệp của người dùng. Tôi đã hy vọng tôi có thể tự động hóa hoàn toàn nó, hoặc ít nhất là phát hiện tên người dùng / tên máy chủ của người dùng được kết nối.


Đó là rõ ràng những gì bạn muốn làm. Điều không rõ ràng với tôi là phần mà bạn nói "Tôi đã hy vọng tôi có thể tự động hóa hoàn toàn nó, hoặc ít nhất là phát hiện tên người dùng / tên máy chủ của người dùng được kết nối." Ý anh là gì?
hytromo

"Khó tự động hóa hơn và sẽ cần sự can thiệp của người dùng" đồng nghĩa với "an toàn" trong trường hợp này. Nếu một máy chủ từ xa có thể chạy các lệnh trên các máy khách kết nối với nó, điều đó sẽ rất không an toàn ... hãy tưởng tượng một máy chủ bị xâm nhập và bất kỳ ai kết nối với nó chỉ bị nhiễm máy cục bộ của họ ... điều đó sẽ rất vui :)
Serge

Câu trả lời:


5

Đôi khi tôi cũng có nhu cầu tương tự, miễn là tôi kết nối qua Putty với máy chủ VPN của chúng tôi và từ đó qua ssh với một số máy chủ khác, điều này không thể truy cập trực tiếp đối với tôi do thiết lập VPN.

Đôi khi tôi chỉ cần nhanh chóng kiểm tra một cái gì đó trên máy chủ VPN, trong khi vẫn chạy "ssh-session". Một cách tiếp cận là chạy một phiên ssh bên dưới screen, như tôi đã nhận thấy, thêm một số độ trễ so với "ssh thông thường". Một cách tiếp cận khác, mà tôi muốn chia sẻ ở đây, là:

Trong khi ở phiên SSH, hãy bấm Enter, sau đó ~, (đảm bảo rằng nó không được hiển thị, tức là bạn đang ở chế độ lệnh), sau đó Ctrl- Z. Điều này sẽ đặt quá trình máy khách ssh trên một "máy chủ" làm nền và bạn sẽ có thứ gì đó dọc theo dòng:

[root@client170 ~]# ~^Z [suspend ssh]

[1]+  Stopped                 ssh root@10.0.0.167
[root@vps291736 ~]#

Bây giờ bạn đang ở trên "máy chủ", có thể làm bất cứ điều gì bạn muốn (mặc dù, tôi không chắc phiên ssh sẽ được duy trì trong bao lâu), sau đó quay lại phiên SSH bằng cách chạy fg.

Ít nhất, điều này hoạt động với tôi trong khi tôi được kết nối từ máy trạm Win10 thông qua Putty trên máy ảo dựa trên CentOS và từ máy ảo đó kết nối qua SSH với một số máy chủ khác.

Hy vọng nó sẽ giúp được ai đó!


2
Nếu bạn có PermitLocalCommand yestrong bạn .ssh/configcho một máy chủ, bạn cũng có thể làm <Enter>~C, sau đó !<command>.
muru

5

Câu trả lời của @ 62mkv là một giải pháp tốt hơn nhiều. Sử dụng nó.

Tuy nhiên, để hoàn thiện và tò mò, nếu bạn có máy chủ ssh chạy trên máy cục bộ, bạn có thể tạo đường hầm ssh để cho phép kết nối ssh từ máy chủ từ xa trên cổng 20202 trở về máy chủ cục bộ trên cổng 22. Lệnh ví dụ:

ssh -R20202:localhost:22 remoteuser@remotehost.com

Điều này sẽ bắt đầu kết nối ssh, nhưng cũng thiết lập một đường hầm trở lại máy chủ ssh chạy trên máy của bạn. Sau đó, bạn có thể làm điều này, khi ssh'ed vào máy chủ từ xa:

ssh -p 20202 localuser@localhost

Tất nhiên, điều này có thể nhanh chóng gây nhầm lẫn - đặc biệt là nếu kỹ thuật được lồng nhiều lần. Nó cũng thêm một chút độ trễ - vì mọi thứ bạn thực hiện trên máy cục bộ của bạn bị trả về thông qua máy chủ từ xa.

Thông tin bổ sung về đường hầm ssh cho những người tò mò chưa được thỏa mãn có thể được tìm thấy trong câu trả lời cho câu hỏi unackexchange này .


Đây là một câu trả lời tuyệt vời. Chính xác những gì tôi cần để có thể thực hiện ssh đến một máy từ xa phía sau tường lửa và chỉ có thể truy cập thông qua teamniewer. Tôi chỉ đơn giản là kết nối qua teamviewer sau đó từ phiên teamviewer trở lại máy của tôi tạo đường hầm ssh và sau đó tôi có thể mở bao nhiêu phiên ssh từ máy tính của mình sang điều khiển từ xa khi tôi cần.
Mary

Thật vậy, đó là trường hợp sử dụng tốt hơn nhiều cho một đường hầm như @Marian này. Tôi tự làm việc này.
starbeamrainbowlabs

0

Nếu cả máy tính cục bộ và máy tính từ xa của bạn đều có thể truy cập được từ Internet, bạn có thể mở phiên SSH từ máy tính cục bộ của mình trên máy tính từ xa, và sau đó trong phiên đó sẽ mở một phiên ssh khác từ máy tính từ xa trên máy tính cục bộ:

localuser@local> ssh remoteuser@remote
Password:
remoteuser@remote> hostname
remote
remoteuser@remote> ssh localuser@local
Password:
localuser@local> hostname
local
localuser@local> exit
remoteuser@remote> exit
localuser@local>

Để tự động hóa công cụ, hãy xem Fabric (yêu cầu kiến ​​thức về Python)

from fabric.api import *

@hosts('host1')
def clean_and_upload():
    local('find assets/ -name "*.DS_Store" -exec rm '{}' \;')
    local('tar czf /tmp/assets.tgz assets/')
    put('/tmp/assets.tgz', '/tmp/assets.tgz')
    with cd('/var/www/myapp/'):
        run('tar xzf /tmp/assets.tgz')

0

Bạn có thể sử dụng sshpass để kết nối với máy tính từ xa và chạy các lệnh.

./sshpass -p "password" ssh user@remoteIP 'bash -s < EOI "Your Commands go here" EOI'

Sử dụng tập lệnh shell đơn giản trên máy tính cục bộ và sử dụng mã ở trên bất cứ khi nào bạn muốn chạy các lệnh trên máy tính từ xa. Đây là một trong những cách tôi thường sử dụng trong tự động hóa.


0

Không, bạn không thể tham gia vào phiên hiện tại.

Ứng dụng của bạn sẽ cần một cách để kết nối lại với máy khách. SSH sẽ hoạt động nếu máy khách có máy chủ SSH đang chạy và máy chủ có thể truy cập cổng 22 trên máy khách. Sẽ khó tự động hóa nếu bạn sử dụng xác thực dựa trên khóa thay vì xác thực mật khẩu - cách này không cần thiết phải có sự can thiệp của người dùng.

Thông tin về việc thiết lập xác thực dựa trên khóa có thể được tìm thấy ở đây: http://tombfox.com/index.php/2008/02/20/public-key-authentication-for-ssh-ADE-easy/


0

Nếu bạn có quyền truy cập vào một thiết bị đầu cuối khác, bạn có thể gửi SIGSTOP bằng cách sử dụng "kill -19 PID" tới lệnh ssh đã khởi tạo kết nối. Sau đó, bạn sẽ có quyền kiểm soát thiết bị đầu cuối trên thiết bị đầu cuối trên máy khách. Khi bạn đã hoàn tất, bạn có thể khôi phục kết nối ssh bằng cách nhập fg để đánh thức ssh client.

Nhưng tất nhiên câu hỏi ở đây là: nếu bạn đã có một thiết bị đầu cuối trên máy khách thì tại sao bạn lại làm điều này :)

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.