簡體   English   中英

如何使用Paramiko SSH通過中間主機進行機器處理?

[英]How do I SSH to machine through a middle host using Paramiko?

本質上,我需要訪問一台計算機,例如機器A,該計算機只能通過我公司的內部網絡進行訪問。 我曾經能夠設置tcprelay端口轉發來完成此操作,但是由於某些潛在的安全漏洞,該管道已被禁用。

假設我的公司通用網絡位於company@10.0.0.1,而我要使用的特定計算機位於machine@10.0.0.3

兩個帳戶都有密碼“ password”

通過終端和外殼命令,我可以使用一個命令跳到那里: https : //askubuntu.com/a/311457

或者分步執行以下操作:

[on my account] ssh company@10.0.0.1
[on my account] enter password
[on company network] ssh machine @10.0.0.3
[on company network] enter password again

然后我將登錄到需要與之通信的機器。

但是,在整個下午亂砍一頓之后,我無法與Paramiko一起工作。 我嘗試建立連接,然后發出client.exec_command(),但無法獲取特定計算機的句柄。 我的其余腳本都依賴於一個paramiko客戶端,該客戶端可以接收命令並返回響應,因此傳播所有更改(如果我要切換到結構或子流程)對我來說將是非常沉重的開銷。

我最接近的是:

ssh.connect(’10.0.0.1', username=‘company', password=‘password’)
chan = ssh.get_transport().open_session()
chan.get_pty()
chan.exec_command(‘ssh machine@10.0.0.3’)
print chan.recv(1024)

它返回了“輸入密碼”提示,但是運行chan.send('password')以掛起結束。

在這一點上,我正在竭盡全力,只是在閱讀文檔以希望找到我所缺少的概念。

如果有人可以提出建議,我將非常感激。

謝謝!

另一種方法是避免在登錄另一台計算機時輸入密碼。 這可以通過使用ssh-keygen來完成。

  1. 使用用戶'first'登錄到第一台計算機(A):$ ssh-keygen -t rsa->在請求時不要輸入任何密碼短語->注意以下行:“您的公鑰已保存在/ home / first中/.ssh/“->此文件是機器“ A”的公鑰

  2. 現在使用ssh登錄到第二台計算機(B)。 然后檢查〜/ .ssh文件夾。 如果沒有文件夾,請創建一個。 在〜/ .ssh / authorized_keys下創建一個名為“ authorized_keys”的文件

  3. 將文件內容從“第一”用戶復制到文件“ authorized_keys”。 是“首次”用戶登錄名中帶有“ id_rsa.pub”的文件(在/home/first/.ssh/id_rsa.pub下)

  4. 現在,您可以從第一台計算機登錄第二台計算機,而無需通過腳本輸入密碼。

我參與了一個項目,該項目必須通過SSH使用用戶名/密碼登錄,然后再次對另一台主機執行相同的操作。 由於某種原因,我無法控制網絡ACL和SSH密鑰。 您需要添加paramiko_expect 這是我如何使其工作的方法:

import paramiko
from paramiko_expect import SSHClientInteraction

user1 = 'admin'
pass1 = 'admin'
user2 = 'root'
pass2 = 'root'

# not needed for this example, but included for reference
user_prompt = '.*\$ '   

# will match root user prompt
root_prompt = '.*$ '

# will match Password: or password:
pass_prompt = '.*assword: '

# SSH to host1
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(
    paramiko.AutoAddPolicy())
ssh_client.connect(hostname='host1', username=user1, password=pass1)

# Interact with SSH client
with SSHClientInteraction(ssh_client, display=True) as interact:
    # Send the command to SSH as root to the final host
    interact.send('ssh {}@host2'.format(user2)
    # Expect the password prompt
    interact.expect(pass_prompt)
    # Send the root password
    interact.send(pass2)
    # Expect the root prompt
    interact.expect(root_prompt)

ssh_client.close()

一個警告:如果host1從未使用SSH連接到host2它將收到有關主機密鑰檢查和超時的警告。 您可以將host1上的配置或僅SSH更改為host1然后從host1 SSH更改為host2 ,然后輸入yes並按Enter。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM