2016-04-26 70 views
0

基本上,我需要訪問一臺計算機,比如機器A,它只能通過我公司的內部網絡訪問。我曾經可以設置tcprelay端口轉發來完成此操作,但由於一些潛在的安全漏洞,該管道已被禁用。如何通過使用Paramiko的中間主機進行SSH機器?

比方說,我的公司一般的網絡是在 [email protected] 和特定的機器,我想使用的是 [email protected]

兩個賬戶有密碼「密碼」

通過端子和外殼命令,我可以跳有使用一個單一的命令: https://askubuntu.com/a/311457

,或者在步驟,這將是:

[on my account] ssh [email protected] 
[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 [email protected]’) 
print chan.recv(1024) 

其返回的「輸入密碼」的提示,但運行chan.send(‘password’)只是掛起結束。

我在這一點拉我的頭髮,只是通過閱讀文檔,希望找到我失蹤的概念。

如果有人可以提供一些建議,我會很感激。

謝謝!

+0

可能的重複:http://stackoverflow.com/questions/1911690/nested-ssh-session-with-paramiko – sberry

回答

0

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

  1. 登錄到第一臺機器(A)與用戶 '第一': $的ssh - 凱基-t RSA - >當請求 不要輸入任何密碼 - >記下了線「您公鑰保存在/home/first/.ssh/「 - >此文件是機器'A'的公鑰

  2. 現在使用ssh登錄到第二臺機器(B)。 然後檢查〜/ .ssh文件夾。如果沒有文件夾,請創建一個。 在〜/ .ssh/authorized_keys下創建名爲'authorized_keys'的文件

  3. 將文件內容從'first'用戶複製到'authorized_keys'文件。 是從「第一」「id_rsa.pub」用戶登錄(下/home/first/.ssh/id_rsa.pub)

  4. 現在,你可以從第一次登錄到第二臺機器,而無需輸入密碼,通過你的腳本文件。

0

我在一個項目中工作,它必須通過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然後按回車。

相關問題