標籤:python
paramiko模組提供了ssh及sft進行遠程登入伺服器執行命令和上傳下載檔案的功能。這是一個第三方的軟體包,使用之前需要安裝。
1 基於使用者名稱和密碼的 sshclient 方式登入
import paramikoimport getpasshostip = input("請輸入主機ip:")username = input("請輸入使用者名稱:")passwd = getpass.getpass("請輸入密碼:")while True: cmd = input(‘>>:‘) if cmd == ‘exit‘:break else: # 建立一個sshclient對象 ssh = paramiko.SSHClient() # 允許將信任的主機自動加入到host_allow 列表,此方法必須放在connect方法的前面 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 調用connect方法串連伺服器 ssh.connect(hostname=hostip,port=22,username=username,password=passwd) stdin,stdout,stderr = ssh.exec_command(cmd) print(stdout.read().decode()) ssh.close()
2 基於使用者名稱和密碼的 SFTP傳送檔案
import paramiko# 執行個體化一個trans對象# 執行個體化一個transport對象trans = paramiko.Transport((‘192.168.1.129‘,22))trans.connect(username=‘xxxx‘,password=‘xxxx‘)sftp = paramiko.SFTPClient.from_transport(trans)sftp.put(localpath = r‘E:\tttt\test2.py‘,remotepath =r‘/root/test2.py‘)sftp.get(localpath = r‘/tmp/hello.txt‘,remotepath = r‘hello.txt‘) trans.close()
3 實現輸入命令立馬返回結果的功能
以上操作都是基本的串連,如果我們想實現一個類似xshell工具的功能,登入以後可以輸入命令斷行符號後就返回結果:
import paramikoimport osimport selectimport sys# 建立一個sockettrans = paramiko.Transport((‘192.168.2.129‘, 22))# 啟動一個用戶端trans.start_client()# 如果使用rsa密鑰登入的話‘‘‘default_key_file = os.path.join(os.environ[‘HOME‘], ‘.ssh‘, ‘id_rsa‘)prikey = paramiko.RSAKey.from_private_key_file(default_key_file)trans.auth_publickey(username=‘super‘, key=prikey)‘‘‘# 如果使用使用者名稱和密碼登入trans.auth_password(username=‘super‘, password=‘super‘)# 開啟一個通道channel = trans.open_session()# 擷取終端channel.get_pty()# 啟用終端,這樣就可以登入到終端了,就和我們用類似於xshell登入系統一樣channel.invoke_shell()# 下面就可以執行你所有的操作,用select實現# 對輸入終端sys.stdin和 通道進行監控,# 當使用者在終端輸入命令後,將命令交給channel通道,這個時候sys.stdin就發生變化,select就可以感知# channel的發送命令、擷取結果過程其實就是一個socket的發送和接受資訊的過程while True: readlist, writelist, errlist = select.select([channel, sys.stdin,], [], []) # 如果是使用者輸入命令了,sys.stdin發生變化 if sys.stdin in readlist: # 擷取輸入的內容 input_cmd = sys.stdin.read(1) # 將命令發送給伺服器 channel.sendall(input_cmd) # 伺服器返回了結果,channel通道接受到結果,發生變化 select感知到 if channel in readlist: # 擷取結果 result = channel.recv(1024) # 中斷連線後退出 if len(result) == 0: print("\r\n**** EOF **** \r\n") break # 輸出到螢幕 sys.stdout.write(result.decode()) sys.stdout.flush()# 關閉通道channel.close()# 關閉連結trans.close()
4 支援tab自動補全
import paramikoimport osimport selectimport sysimport ttyimport termios‘‘‘實現一個xshell登入系統的效果,登入到系統就不斷輸入命令同時返回結果支援自動補全,直接調用伺服器終端‘‘‘# 建立一個sockettrans = paramiko.Transport((‘192.168.2.129‘, 22))# 啟動一個用戶端trans.start_client()# 如果使用rsa密鑰登入的話‘‘‘default_key_file = os.path.join(os.environ[‘HOME‘], ‘.ssh‘, ‘id_rsa‘)prikey = paramiko.RSAKey.from_private_key_file(default_key_file)trans.auth_publickey(username=‘super‘, key=prikey)‘‘‘# 如果使用使用者名稱和密碼登入trans.auth_password(username=‘super‘, password=‘super‘)# 開啟一個通道channel = trans.open_session()# 擷取終端channel.get_pty()# 啟用終端,這樣就可以登入到終端了,就和我們用類似於xshell登入系統一樣channel.invoke_shell()# 擷取原操作終端屬性oldtty = termios.tcgetattr(sys.stdin)try: # 將現在的操作終端屬性設定為伺服器上的原生終端屬性,可以支援tab了 tty.setraw(sys.stdin) channel.settimeout(0) while True: readlist, writelist, errlist = select.select([channel, sys.stdin,], [], []) # 如果是使用者輸入命令了,sys.stdin發生變化 if sys.stdin in readlist: # 擷取輸入的內容,輸入一個字元發送1個字元 input_cmd = sys.stdin.read(1) # 將命令發送給伺服器 channel.sendall(input_cmd) # 伺服器返回了結果,channel通道接受到結果,發生變化 select感知到 if channel in readlist: # 擷取結果 result = channel.recv(1024) # 中斷連線後退出 if len(result) == 0: print("\r\n**** EOF **** \r\n") break # 輸出到螢幕 sys.stdout.write(result.decode()) sys.stdout.flush()finally: # 執行完後將現在的終端屬性恢複為原操作終端屬性 termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)# 關閉通道channel.close()# 關閉連結trans.close()
Python模組學習之Paramiko