Maison > Questions et réponses > le corps du texte
import subprocess
import os
r=open("sad.txt",'a')
p = subprocess.Popen("ssh.exe root@192.168.58.154", stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)
p.stdin.write('password\n')
p.stdin.write('ifconfig\n')
while p.stdout.readline()!=' ':
line = p.stdout.readline() #如果p.stdout中内容被读完之后,程序会卡在这里
#line = line.strip()
print line
r.write(line)
这个卡死如何解决,这时候结束当前进程也没办法结束
或者如何判断卡死,然后p.kill()或“ctrl+c”当前进程
ssh执行p.stdin.write('exit\n')也不行,因为ssh exit之后还会跳回登录界面,进程还是没有结束
ringa_lee2017-04-18 09:05:10
while p.stdout.readline()!=' ':
line = p.stdout.readline() #如果p.stdout中内容被读完之后,程序会卡在这里
#line = line.strip()
print line
r.write(line)
Tout d'abord, je souligne qu'il y a un problème avec ce paragraphe. Il s'agit d'un problème d'impression p.stdout.readline() != '' ne doit pas être placé dans un moment, car après la lecture des données. , il sera supprimé, de sorte que les données complètes ne puissent pas être imprimées et écrites dans le fichier sad.txt
Deuxièmement, je pense que p.stdout devrait être rendu non bloquant pour résoudre le problème bloqué
import subprocess
import os
import fcntal
r=open("sad.txt",'a')
p = subprocess.Popen("ssh.exe root@192.168.58.154", stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)
flags = fcntl.fcntl(p.stdout, fcntl.F_GETFL)
flags |= os.O_NONBLOCK
fcntl.fcntl(p.stdout, fcntl.F_SETFL, flags)
p.stdin.write('password\n')
p.stdin.write('ifconfig\n')
while True:
try:
line = p.stdout.readline() #如果p.stdout中内容被读完之后,程序会卡在这里
if line == '':
break
#line = line.strip()
print line
r.write(line)
except IOError:
break
PHPz2017-04-18 09:05:10
Ce blocage est probablement dû au fait que le processus ssh ne se termine pas.
高洛峰2017-04-18 09:05:10
est bloqué car le tube est vide après lecture de la dernière ligne, et pour la commande ifconfig
, la dernière ligne n'est pas un espace mais n:
p.stdin.write('ifconfig eth0\n')
for line in iter(p.stdout.readline, '\n'):
print line.strip()
Pour prévenir les décès causés par IO, la méthode officiellement recommandée est d'utiliser communicate
, comme celle-ci :
out, err = p.communicate('ifconfig')