當前位置:首頁 » 編程語言 » pythonssh代理

pythonssh代理

發布時間: 2023-03-17 20:07:26

1. python用ssh連接時,只用ip和用戶名但是不需要用到密碼,該怎麼編程

區域網內有一百多台電腦,全部都是linux操作系統,所有電腦配置相同,系統完全相同(包括用戶名和密碼),ip地址是自動分配的。現在有個任務是在這些電腦上執行某些命令,者說進行某些操作,比如安裝某些軟體,拷貝某些文件,批量關機等。如果一台一台得手工去操作,費時又費力,如果要進行多個操作就更麻煩啦。

或許你會想到網路同傳, 網路同傳是什麼?就是在一台電腦上把電腦裝好,配置好,然後利用某些軟體,如「聯想網路同傳」把系統原樣拷貝過去,在裝系統時很有用,只要在一台電腦上裝好,同傳以後所有的電腦都裝好操作系統了,很方便。同傳要求所有電腦硬體完全相同,在聯想的電腦上裝的系統傳到方正電腦上肯定會出問題的。傳系統也是很費時間的,根據硬碟大小,如果30G硬碟,100多台電腦大約要傳2個多小時,反正比一台一台地安裝快!但是如果系統都傳完了,發現忘了裝一個軟體,或者還需要做些小修改,再同傳一次可以,但是太慢,傳兩次半天時間就沒了。這時候我們可以利用ssh去控制每台電腦去執行某些命令。

先讓我們回憶一下ssh遠程登錄的過程:首先執行命令 ssh [email protected] ,第一次登錄的時候系統會提示我們是否要繼續連接,我們要輸入「yes」,然後等一段時間後系統提示我們輸入密碼,正確地輸入密碼之後我們就能登錄到遠程計算機,然後我們就能執行命令了。我們注意到這裡面有兩次人機交互,一次是輸入『yes』,另一次是輸入密碼。就是因為有兩次交互我們不能簡單的用某些命令去完成我們的任務。我們可以考慮把人機交互變成自動交互,python的pexpect模塊可以幫我們實現自動交互。

2. 使用python 實現SSH登錄設備時出現問題

解決了啊,不過不是用的
stdin,stdout,stderr=client.exec_command('show arp;show clock')
用這種方法只能弄一條命令
用下面這個
chan= client.invoke_shell()
chan.send('en\n')
chan.send("password\n")
chan.send('show log\n')
result = chan.recv(100000).decode()
用了這個可能還有別的問題,試試吧,不行再討論

3. 求ssh代理設置方法

可以的 先ssh到b 在b中 shh c的地址的就可以了 相當你在b中進行操作了。

4. python 模擬 ssh 執行遠程命令

日常開發連接 Linux 伺服器,都會用到 ssh 客戶端的軟體
其實 python 有一個模塊,可以簡單模擬一個 ssh 客戶端/服務端
編寫一些自動化的的任務時,會經常和它打交道
簡單記錄一下 paramiko 的基本使用

paramiko 不是標准庫,需要自行安裝
要腔粗求 py2.7,3.4 版本以上 [1]

在得到一個 ssh_client 客戶端連接對象後

第一次和伺服器建立連接,需要選擇是否自動將伺服器的 host_key 公鑰,記錄在本地

因為,在計算機的世界裡,沒有永久的朋友-- IP 短時間里不會刷新,但是山頌系統可能隨時被重置

否則會報錯提示:

可以加入 logging 模塊,查看詳細的通訊過程

使用三個變數,獲取返回的信息對象

讀取命令的執行結伍唯鎮果

5. 如何用python開發一個ssh客戶端工具


1)通過paramiko的ssh模塊連接指定主機;

2)通過SSHClient.exec_command在遠程主機上執行命令;

3)通過exec_command返回的stdout,stdin,stderr進行交互;

4)保存成功連接的主機信息(session),可以通過ls命令查看,sessionid命令,直接啟動新連接;

5)可在windows和linux下運行,寫程序時需要注意他們的差別。
代碼ssh.py

#!/usr/bin/python
#-*-coding:utf-8-*-

importos,sys
importparamiko
importthreading
importplatform

curr_ssh=None
curr_prompt=">>"

#使用說明
defprintUsage():
print"!ls:listsessions."
print"!sessionid:connectsession."
print"!connhostuserpassword:connecthostwithuser."
print"!exit:exit."

#連接
defconn(ip,username,passwd):
try:
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,passwd,timeout=5)
print"Connectto",ip,"with",username
globalcurr_prompt
curr_prompt=username+"@"+ip+">>"
returnssh
except:
returnNone

#載入以前的連接信息
sessions=[]
defloadSessions():
globalsessions
try:
f=open("sessions")
sessions=f.readlines()
f.close()
except:
pass

#執行本地命令,ssh.py的命令
defexe_cmd_local(cmd):
if(cmd=="!ls"):
loadSessions()
globalsessions
i=0
print"Sessions:"
forsinsessions:
print"[%d]%s"%(i,s)
i+=1
else:
vals=cmd.split('')
if(vals[0]=="!session"):
id=(int)(vals[1])
if(id<len(sessions)):os_name="platform.system()"new_console_cmd=""if(os_name="=""linux"):="".=""ssh.py="""=""+=""sessions[id]+"""=""elif(os_name="=""windows"):=""sessions[id]=""os.system(new_console_cmd)=""else:=""print="""didn't=""hava=""sessoin=""",vals[1]=""elif(vals[0]="="!conn"):"global=""curr_ssh=""f="open("sessions","a")"line="vals[1]+"""+vals[2]+"="""+vals[3]+" "=""f.write(line)=""f.close()=""#在ssh連接的主機上執行命令=""def=""exe_cmd_ssh(ssh,cmd):=""if(ssh="="none):=""connect=""to=""a=""server.=""use=""'!conn'=""please."=""return=""stdin,=""stdout,=""stderr="ssh.exec_command(cmd)"#stdin.write("y")=""#簡單交互,輸入=""『y』=""#屏幕輸出=""stdout.read()=""stderr.read()=""#入口函數=""if=""__name__="='__main__':"loadsessions()=""if(len(sys.argv)="=4):"printusage()=""while=""true:=""cmd="raw_input(curr_prompt)"if(len(cmd)="=0):"continue=""if(cmd="=""!exit"):=""if(curr_ssh=""!="None):"curr_ssh.close();=""break=""if(cmd[0]="="'!'):=""exe_cmd_local(cmd)=""exe_cmd_ssh(curr_ssh,cmd)<=""pre="">

6. python 實現ssh的執行遠端命令和scp的不同機器文件傳輸功能

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pexpect
def ssh_cmd(ip, passwd, cmd):
ret = -1
ssh = pexpect.spawn('ssh root@%s "%s"' % (ip, cmd))
try:
i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)
if i == 0 :
ssh.sendline(passwd)
elif i == 1:
ssh.sendline('yes\n')
ssh.expect('password: ')
ssh.sendline(passwd)
ssh.sendline(cmd)
r = ssh.read()
print r
ret = 0
except pexpect.EOF:
print "EOF"
ssh.close()
ret = -1
except pexpect.TIMEOUT:
print "TIMEOUT"
ssh.close()
ret = -2
return ret

利用pexpect模塊我們可以做很多事情,由於他提供了自動交互功能,因此我們可以實現ftp,telnet,ssh,scp等的自動登錄,還是比較實用的。根據上面的代碼相信讀者已經知道怎麼實現了(python就是那麼簡單!)。

上面的代碼去完成任務還是比較費時間的,因為程序要等待自動交互出現,另外ubuntu用ssh連接就是比較慢,要進行一系列的驗證,這樣才體現出ssh
的安全。我們要提高效率,在最短的時間內完成。後來我發現了python裡面的paramiko模塊,用這個實現ssh登錄更加簡單。看下面的代碼:

復制代碼 代碼如下:

#-*- coding: utf-8 -*-
#!/usr/bin/python
import paramiko
import threading
def ssh2(ip,username,passwd,cmd):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,passwd,timeout=5)
for m in cmd:
stdin, stdout, stderr = ssh.exec_command(m)
# stdin.write("Y") #簡單交互,輸入 『Y'
out = stdout.readlines()
#屏幕輸出
for o in out:
print o,
print '%s\tOK\n'%(ip)
ssh.close()
except :
print '%s\tError\n'%(ip)
if __name__=='__main__':
cmd = ['cal','echo hello!']#你要執行的命令列表
username = "" #用戶名
passwd = "" #密碼
threads = [] #多線程
print "Begin......"
for i in range(1,254):
ip = '192.168.1.'+str(i)
a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))
a.start()

上面的程序還是有些技巧的:
1.
利用多線程,同時發出登錄請求,同時去連接電腦,這樣速度快很多,我試了一下,如果不用多線程,直接一個一個挨著執行的話,大約5~10秒鍾才能對一台電
腦操作完,具體時間要根據命令的來決定,如果是軟體安裝或者卸載時間要更長一些。這樣下來怎麼也要一二十分鍾,用多線程後就快多了,所有的命令執行完用了
不到2分鍾!
2.最好用root用戶登錄,因為安裝或者卸載軟體的時候如果用普通用戶又會提示輸入密碼,這樣又多了一次交互,處理起來就比較麻
煩!安裝軟體時apt-get install xxx
最好加上「-y」參數,因為有時安裝或刪除軟體時提示是否繼續安裝或卸載,這又是一次自動交互!加上那個參數後就沒有人機交互了。
3. 循環時循環所有ip,因為計算機的ip是路由器自動分配的,保險起見,最好全部都執行,保證沒有遺漏的主機
4.遠端執行命令時如果有交互,可以這樣用 stdin.write("Y")來完成交互,「Y」就是輸入「Y」。
5.把所有的命令放到一個列表裡面,遍歷列表可以依次執行列表裡面的命令
6.為了更好的進行控制,最好在電腦上提前把root用戶打開,裝好ssh伺服器並讓其開機自動執行。

7. SSH 通過代理連接伺服器

老規矩,先說結論:

或者:

注意:由於 macOS 版 Ncat 的 7.90 和 7.91 版本的 bug,上述方式不再生效。起碼 7.91 版本在 macOS 10.15.7 上是不行的。此問題在 7.92 版本中已經解決。

具體原因參見: https://nmap.org/changelog.html

但 Linux 上沒問題。所以增加個 socat 的替補方案:

Scout 本身很強大,但對代理的支持這部分貌似差一些,只支持 SOCKSv4 和 HTTP Proxy,不灶穗陵支持 SOCKS5。詳情參考 《socat 初窺門徑》 。

有些時候,由於網路限制等原因,不能直接連通過 SSH 連到指定伺服器,需要經過代理進行連接。例如如下場景:

其中,
client.net 不能直接訪問 server.net
client.net 可以訪問 proxy.net
proxy.net 可以訪問 server.net

使用 SSH 的 ProxyCommand 選項,配合 nc/Ncat 命令,實現 client.net 通過代理 proxy.net ,以 SSH 訪問 server.net 。

(1) nc

macOS 上常用這種方案。但是 nc 不支持需要認證的代理。

常用參數:

(2) Ncat

Ncat 在 macOS 上通過代理連接時會出現連接斷開的情況。

常用參數:

以 nc 為例,如使用 Ncat 可以自行替換。

默認為 Socket5 代理,這時可以省略 -X 參數
或者採用另一種寫法:

SSH 配置文件位置:

增加如下兩行內容:以 nc 為例,如使用 Ncat 可以自行替換。

使用配置文件之後,就不需要在命令行中進行代理配置了。

對於大部分情況,都可以直接使用 nc 或者 Ncat 解決。但對於一些復雜情況,也可以通過其它方案完成。如在 macOS 上想通過需要認證的代理連接,用 nc 不支持代理認證, Ncat 又有些問題。

對於代理類型的族前問題,可以通過 Brook 來進行類型轉換。

1、 corkscrew

只支持 HTTP 代理

如需要訪問帶認證的代理伺服器

~/.ssh/myauth 的內容:

2、 proxytunnel

只支持 HTTP 代理

命令行里只填用戶名,會提示輸入密碼,或者通過環隱戚境變數傳入。

(完)

8. 請教下python3 上如何實現級聯ssh

首先,我的windows系統上有python2和python3。使用下面命令切換到python3:

activate py3
1
接著使用下面命令下載相關模塊:

pip install ecdsa
pip install Crypto
pip install paramiko
1
2
3
連接伺服器操作:
# -*- coding: utf-8 -*-
import paramiko
# 伺服器相關信息,下面輸入你個人的用戶名、密碼、ip等信息
ip = ""
port = 22
user = ""
password = ""
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 建立連接
ssh.connect(ip,port,user,password,timeout = 10)
#輸入linux命令
stdin,stdout,stderr = ssh.exec_command("pwd")
# 輸出命令執行結果
result = stdout.read()
print(result)
#關閉連接
ssh.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
如下,運行該程序,可以看到控制台輸出的結果:

9. ssh的代理和埠轉發機制介紹

本文介紹通過ssh建立隧道的三種方式。

ssh的隧道均通過埠轉發來實現,包括三種模式早念:

MobaXterm作為一個良心的終端工具,在其MobaSSHTunnel菜單項可以幫助我們基於圖形化的方式建立上述三種隧道,其提供的向導也能幫助我們更有效的理解和記住上面這3個參數。因此本文借用這些向導中的截圖來進行說明。

實現功能:把ssh伺服器能夠訪問的ip和埠映射到客戶端的指定埠,這樣在客戶端網路內訪問客戶端的指定埠就能訪問到ssh伺服器所在網路中的服務。經常使用的場景是客戶端自身通過localhost:<指定埠>去訪問。

參數說明:

實現功能:把ssh客戶端能訪問到的ip和埠映射到ssh伺服器的指定埠,這樣在伺服器端的網路內訪問伺服器的指定埠就能訪問到ssh客戶端算在網路中的服務。

參數說明:

動態埠轉發實際上是陸蔽困本地埠轉發的升級版,除了建立本地埠轉發之外,這種模式還在ssh的通信兩端啟動了socks5代理服務,並且通過本地埠轉發機制把兩個socks5代理連接在一起,因此當訪問本地的socks5服務時實際上也是在訪問遠並宏程的socks5服務。這樣當指定客戶端作為socks5代理之後,實際上相當於把客戶端放入伺服器端所在網路中,能夠訪問網路中的任意一個服務,而無需為每個服務(ip:埠)都配一次本地埠轉發規則。

參數說明:

10. python的paramiko模塊 支持連接交換機嗎

paramiko使用

paramiko模塊是基於python實現了SSH2遠程安全連接,支持認證和密鑰方式,可以實現遠程連接、命令執行、文件傳輸、中間SSH代理功能

安裝

pip install paramiko
或 easy_install paramiko
paramiko依賴第三方的Crypto,Ecdsa和pyhton-devel,所以需要安裝

paramiko核心組件

SSHClient類

SSHClient類是SSH服務會話的高級表示,該類實現了傳輸、通道、以及SFTP的校驗、建立的方法

  • connect 方法

    connect方法實現了遠程ssh連接並作校驗

  • hostname 連接的目標主機

  • port=SSH_PORT 指定埠

  • username=None 驗證的用戶名

  • password=None 驗證的用戶密碼

  • pkey=None 私鑰方式用於身份驗證

  • key_filename=None 一個文件名或文件列表,指定私鑰文件

  • timeout=None 可選的tcp連接超時時間

  • allow_agent=True, 是否允許連接到ssh代理,默認為True 允許

  • look_for_keys=True 是否在~/.ssh中搜索私鑰文件,默認為True 允許

  • compress=False, 是否打開壓縮

  • sock=None,

  • gss_auth=False,

  • gss_kex=False,

  • gss_deleg_creds=True,

  • gss_host=None,

  • banner_timeout=None

  • 參數

  • exec_command方法

    遠程執行命令的方法,該命令的輸入與輸出流為標准輸入、標出輸出、標准錯誤輸出

  • command 執行的命令

  • bufsize=-1 文件緩沖區大小

  • timeout=None

  • get_pty=False

  • 參數

  • load_system_host_key方法

    夾在本地公鑰文件,默認為~/.ssh/known_hosts

  • filename=None 指定本地公鑰文件

  • 參數

  • set_missing_host_key_policy方法
    設置連接的遠程主機沒有本地主機密鑰或HostKeys對象時的策略,目前支持三種:

    用法:
    set_missing_host_key_policy(paramiko.AutoAddPolicy())

  • AutoAddPolicy 自動添加主機名及主機密鑰到本地HostKeys對象,不依賴load_system_host_key的配置。即新建立ssh連接時不需要再輸入yes或no進行確認

  • WarningPolicy 用於記錄一個未知的主機密鑰的python警告。並接受,功能上和AutoAddPolicy類似,但是會提示是新連接

  • RejectPolicy 自動拒絕未知的主機名和密鑰,依賴load_system_host_key的配置。此為默認選項

  • SFTPClient類

    SFTPCLient作為一個sftp的客戶端對象,根據ssh傳輸協議的sftp會話,實現遠程文件操作,如上傳、下載、許可權、狀態

  • from_transport(cls,t) 創建一個已連通的SFTP客戶端通道

  • put(localpath, remotepath, callback=None, confirm=True) 將本地文件上傳到伺服器 參數confirm:是否調用stat()方法檢查文件狀態,返回ls -l的結果

  • get(remotepath, localpath, callback=None) 從伺服器下載文件到本地

  • mkdir() 在伺服器上創建目錄

  • remove() 在伺服器上刪除目錄

  • rename() 在伺服器上重命名目錄

  • stat() 查看伺服器文件狀態

  • listdir() 列出伺服器目錄下的文件

  • 遠程連接並執行命令

    實現遠程連接主機,並執行命令,同時記錄日誌
    * 直接驗證方式


熱點內容
動態規劃01背包演算法 發布:2024-11-05 22:17:40 瀏覽:847
nasm編譯器如何安裝 發布:2024-11-05 22:01:13 瀏覽:177
登錄密碼在微信的哪裡 發布:2024-11-05 22:00:29 瀏覽:736
c防止反編譯工具 發布:2024-11-05 21:56:14 瀏覽:244
安卓虛擬機怎麼用 發布:2024-11-05 21:52:48 瀏覽:342
php時間搜索 發布:2024-11-05 20:58:36 瀏覽:478
燕山大學編譯原理期末考試題 發布:2024-11-05 20:13:54 瀏覽:527
華為電腦出現臨時伺服器 發布:2024-11-05 20:05:08 瀏覽:407
斗戰神免費挖礦腳本 發布:2024-11-05 19:53:25 瀏覽:664
網吧伺服器分別是什麼 發布:2024-11-05 19:45:32 瀏覽:391