python ssh工具paramiko的一點修改

2021-06-29 02:40:24 字數 2455 閱讀 5189

經常使用paramiko工具對幾百台裝置進行管理。主要是每天到上邊取檔案過來,作為備份。

今天發現程式執行了10個小時還沒有結束,就上去看乙個究竟。

檢視日誌,發現在取一台伺服器上的檔案時卡在那裡了。自己手動ssh登入上去,執行了乙個ls命令就卡住了,

原來是這個伺服器的硬碟出問題了。怪不得取不到檔案。

但是想想,程式應該是在一段時間內讀取不到資料就超時退出的阿,怎麼會卡在那裡呢。找到執行命令的那段

sin, sout, serr = ssh.exec_command('tar -zc0 /data/important-file.txt')

這條語句是過去了,但是後邊

sout.read(10240)

這條語句一直卡在那裡,不動彈了。看來sout是沒有設定超時的。查查paramiko的源**吧。找了一下,在client.py中

def exec_command(self, command, bufsize=-1)

chan = self._transport.open_session()

chan.exec_command(command)

stdin = chan.makefile('wb', bufsize)

stdout = chan.makefile('rb', bufsize)

stderr = chan.makefile_stderr('rb', bufsize)

return stdin, stdout, stderr

那個stout就是chan.makefile()出來的。繼續看makefile

def makefile(self, *params):

return channelfile(*([self] + list(params)))

這裡看不出什麼,重點在channelfile的read方法上,查到read方法。channelfile繼承了bufferedfile,因為文件中寫道,這個

channelfile是個file-like的object, 所以_read方法應該是實際read去呼叫的方法。看**

def _read(self, size):

return self.channel.recv(size)

很簡單,是channel的recv方法(這個channel就是makefile時的第乙個引數self,也就是transport.open_session()出來的那個chan)。

還是回到channel去,recv方法

def recv(self, nbytes):

try:

out = self.in_buffer.read(nbytes, self.timeout)

except pipetimeout, e:

raise socket.timeout()

ack = self._check_add_window(len(out))

# no need to hold the channel lock when sending this

if ack > 0:

m = message()

m.add_byte(chr(msg_channel_window_adjust))

m.add_int(self.remote_chanid)

m.add_int(ack)

self.transport._send_user_message(m)

return out

從黑體的部分可以看出,原來recv是可以設定timeout的,只是paramiko預設的沒有設定而已。好了,把timeout設定上,就ok。

修改了一下paramiko**,執行了一下,程式也沒有卡在那個地方,除了那台出問題的伺服器,其餘的都正常取到。

修改辦法如下,修改client.py的exec_command方法如下

def exec_command(self, command, bufsize=-1, timeout = none):

chan = self._transport.open_session()

if timeout is not none:

chan.settimeout(timeout)

chan.exec_command(command)

stdin = chan.makefile('wb', bufsize)

stdout = chan.makefile('rb', bufsize)

stderr = chan.makefile_stderr('rb', bufsize)

return stdin, stdout, stderr

黑體部分為增加的部分。而在呼叫的地方,改為

sin, sout, serr = ssh.exec_command('tar -zc0 /data/important-file.txt', timeout = 20.0)

python SSH連線工具類

import os import paramiko class sshconnectionutils hostname port 22 username password ssh def init self,hostname,port,username,password self.hostname ...

python ssh登入 python ssh連線

pip install paramiko 檢視並啟動ssh服務 service ssh status 新增使用者 useradd d home zet zet passwd zet 賦予ssh許可權 vi etc ssh sshd config 新增allowusers zet 客戶端 coding...

python ssh之paramiko模組使用

1.安裝 sudo pip install paramiko 2.連線到linux伺服器 方法一 paramiko.util.log to file ssh.log 寫日誌檔案 client paramiko.sshclient client.set missing host key policy ...