當前位置:首頁 » 編程語言 » sshpython

sshpython

發布時間: 2022-01-22 18:39:27

① 請教個python執行ssh命令的問題

各位我現在想用python寫個ssh登陸的腳本 現在遇見一個問題就是我不太清楚python如何進行變數替換的(機器間已做好ssh互認)

1.1.1.1是我的時間伺服器
比如說beijing_IP 裡面有兩個IP
1.1.1.2
1.1.1.3

import os
IP_FILE=open('/home/cetvuser/beijing_IP','r')
LINES=IP_FILE.readlines()
for i in LINES:
i=i.strip()
os.system("ssh i;ntpdate 1.1.1.1") 這個地方應該怎麼寫?
IP_FILE.close()

報錯內容如下:
[root@xxx]# ./time.py
ssh: i: Name or service not known
25 Apr 11:42:13 ntpdate[7975]: no server suitable for synchronization found
ssh: i: Name or service not known
25 Apr 11:42:17 ntpdate[7979]: no server suitable for synchronization found
ssh: i: Name or service not known

變數替換,看你要在哪裡替換。給你一個簡單的例子。

  • os.system('ssh %s'%(ip))

  • 復制代碼

  • 這個IP就是你想要的替換的IP。

② python 獲取ssh響應嗎

最近在做一個項目,需要在客戶端集成一個互動式ssh功能,大概就是客戶端跟伺服器申請個可用的機器,服務端返回個ip,埠,密碼, 然後客戶端就可以直接登錄到機器上操做了。該程序基於paramiko模塊。

經查找,從paramiko的源碼包demos目錄下,可以看到互動式shell的實現,就是那個demo.py。但是用起來有些bug,於是我給修改了一下interactive.py(我把windows的代碼刪掉了,剩下的只能在linux下用)。代碼如下:

[python]view plain

  • #coding=utf-8

  • importsocket

  • importsys

  • importos

  • importtermios

  • importtty

  • importfcntl

  • importsignal

  • importstruct

  • importselect

  • now_channel=None

  • definteractive_shell(chan):

  • posix_shell(chan)

  • defioctl_GWINSZ(fd):

  • try:

  • cr=struct.unpack('hh',fcntl.ioctl(fd,termios.TIOCGWINSZ,'aaaa'))

  • except:

  • return

  • returncr

  • defgetTerminalSize():

  • cr=ioctl_GWINSZ(0)orioctl_GWINSZ(1)orioctl_GWINSZ(2)

  • returnint(cr[1]),int(cr[0])

  • defresize_pty(signum=0,frame=0):

  • width,height=getTerminalSize()

  • ifnow_channelisnotNone:

  • now_channel.resize_pty(width=width,height=height)

  • defposix_shell(chan):

  • globalnow_channel

  • now_channel=chan

  • resize_pty()

  • signal.signal(signal.SIGWINCH,resize_pty)#終端大小改變時,修改pty終端大小

  • stdin=os.fdopen(sys.stdin.fileno(),'r',0)#stdinbuff置為空,否則粘貼多位元組或者按方向鍵的時候顯示不正確

  • fd=stdin.fileno()

  • oldtty=termios.tcgetattr(fd)

  • newtty=termios.tcgetattr(fd)

  • newtty[3]=newtty[3]|termios.ICANON

  • try:

  • termios.tcsetattr(fd,termios.TCSANOW,newtty)

  • tty.setraw(fd)

  • tty.setcbreak(fd)

  • chan.settimeout(0.0)

  • whileTrue:

  • try:

  • r,w,e=select.select([chan,stdin],[],[])

  • except:

  • #解決SIGWINCH信號將休眠的select系統調用喚醒引發的系統中斷,忽略中斷重新調用解決。

  • continue

  • ifchaninr:

  • try:

  • x=chan.recv(1024)

  • iflen(x)==0:

  • print'rn***EOFrn',

  • break

  • sys.stdout.write(x)

  • sys.stdout.flush()

  • exceptsocket.timeout:

  • pass

  • ifstdininr:

  • x=stdin.read(1)

  • iflen(x)==0:

  • break

  • chan.send(x)

  • finally:

  • termios.tcsetattr(sys.stdin,termios.TCSADRAIN,oldtty)

  • 使用示例:

    [python]view plain

  • #coding=utf8

  • importparamiko

  • importinteractive

  • #記錄日誌

  • paramiko.util.log_to_file('/tmp/aaa')

  • #建立ssh連接

  • ssh=paramiko.SSHClient()

  • ssh.load_system_host_keys()

  • ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

  • ssh.connect('192.168.1.11',port=22,username='hahaha',password='********',compress=True)

  • #建立互動式shell連接

  • channel=ssh.invoke_shell()

  • #建立互動式管道

  • interactive.interactive_shell(channel)

  • #關閉連接

  • channel.close()

  • ssh.close()



  • interactive.py代碼中主要修復了幾個問題:

    1、當讀取鍵盤輸入時,方向鍵會有問題,因為按一次方向鍵會產生3個位元組數據,我的理解是按鍵一次會被select捕捉一次標准輸入有變化,但是我每次只處理1個位元組的數據,其他的數據會存放在輸入緩沖區中,等待下次按鍵的時候一起發過去。這就導致了本來3個位元組才能完整定義一個方向鍵的行為,但是我只發過去一個位元組,所以終端並不知道我要干什麼。所以沒有變化,當下次觸發按鍵,才會把上一次的信息完整發過去,看起來就是按一下方向鍵有延遲。多位元組的粘貼也是一個原理。解決辦法是將輸入緩沖區置為0,這樣就沒有緩沖,有多少發過去多少,這樣就不會有那種顯示的延遲問題了。

    2、終端大小適應。paramiko.channel會創建一個pty(偽終端),有個默認的大小(width=80, height=24),所以登錄過去會發現能顯示的區域很小,並且是固定的。編輯vim的時候尤其痛苦。channel中有resize_pty方法,但是需要獲取到當前終端的大小。經查找,當終端窗口發生變化時,系統會給前台進程組發送SIGWINCH信號,也就是當進程收到該信號時,獲取一下當前size,然後再同步到pty中,那pty中的進程等於也感受到了窗口變化,也會收到SIGWINCH信號。

    3、讀寫『慢』設備(包括pipe,終端設備,網路連接等)。讀時,數據不存在,需要等待;寫時,緩沖區滿或其他原因,需要等待。ssh通道屬於這一類的。本來進程因為網路沒有通信,select調用為阻塞中的狀態,但是當終端窗口大小變化,接收到SIGWINCH信號被喚醒。此時select會出現異常,觸發系統中斷(4, 'Interrupted system call'),但是這種情況只會出現一次,當重新調用select方法又會恢復正常。所以捕獲到select異常後重新進行select可以解決該問題。

③ Python登錄SSH服務遇到報錯,paramiko.ssh_exception.SSHException: Channel closed.

ssh登錄的時候鏈接埠失敗
這由於server端沒有開機或是網路不通(這個原因很多,最簡單的是網線沒有插。還有就是可能會是網卡down了等)如果是網卡down了ifup相應的網卡再試試

④ python調用shell命令時 有時要用戶手動輸入密碼(如ssh),Python要然Python程序輸入密碼

subprocessing 模塊 popen里可以設置stdout_in的,你可以設輸入信息。不過你可以考慮從ssh本身下手,用公私鑰驗證的方式來避免密碼驗證。

⑤ 請教一個python ssh連接的問題

我也遇到了這個問題,發現如下url可能很有幫助: 【http://stackoverflow.com/questions/22251258/paramiko-error-servname-not-supported-for-ai-socktype】
摘要如下:
Problem is with client.connect() call, it expects port to be second parameter and to be an integer, whereas you are giving username (string) as second parameter. Try replacing that with below line. client.connect(hostname, username=username, password=password), that should work.

⑥ python ssh登錄網管後繼續ssh登錄其它機器,咋寫接下來的代碼

1. 建議使用python+fabric
2. B到A可以使用 scp命令,或者使用ftp命令上傳
3. 可以網路下「python fabric」

⑦ python中怎樣實現ssh遠程登錄伺服器

這個都是自動登陸的了
也是不麻煩的一個操作。
最近寫了一個軟體, 用來批量管理伺服器的。
比如批量操作命令, 批量上傳下載文件的。
也是比較好用多的
如果需要的話, 看一下網名吧

⑧ 使用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()
用了這個可能還有別的問題,試試吧,不行再討論

⑨ python怎麼安裝ssh模塊

你是不是安裝遇到問題了,需要先裝pycryto模塊,安裝pycryto需要有gcc如果我的回答沒幫助到您,請繼續追問。。python怎麼安裝ssh模塊

熱點內容
excel緩存清除 發布:2024-11-15 00:39:53 瀏覽:486
機械鍵盤可編程 發布:2024-11-15 00:39:09 瀏覽:912
php判斷字元開頭 發布:2024-11-15 00:35:33 瀏覽:507
網易蘋果游戲怎麼轉移到安卓 發布:2024-11-15 00:07:52 瀏覽:270
win7php環境搭建 發布:2024-11-15 00:06:55 瀏覽:17
erpjava 發布:2024-11-14 23:52:23 瀏覽:253
電腦版地平線四怎麼連上伺服器 發布:2024-11-14 23:46:42 瀏覽:472
ios怎麼變安卓 發布:2024-11-14 23:46:36 瀏覽:333
win7共享xp列印機拒絕訪問 發布:2024-11-14 23:45:29 瀏覽:750
引起資源配置失效的原因有哪些 發布:2024-11-14 23:35:22 瀏覽:15