我使用SSH登录远程节点,获取服务的状态并想要打印它。
在我的远程节点上运行bash命令会产生。
[root@redis-1 ~]# redis-cli -a '!t3bmjEJss' info replication | grep role | cut -d':' -f2
slave
我编写的python代码是
def serviceDetails(ip,svc):
if svc == 'redis-server':
ssh = subprocess.Popen(["ssh", "%s" % ip, "redis-cli -a '!t3Z9LJt2_wmUDbmjEJss' info replication | grep role | cut -d':' -f2"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
print (result)
else:
print ("Redis service is not running on this node")
我从result
变量得到的输出是:
[b'slave\r\n']
为什么会出现所有这些额外字符?我怎么能摆脱他们?
答案 0 :(得分:1)
当您使用.readlines()
时,它将返回一个行列表。如果您想在一个字符串中使用.read()
,则可以使用.decode('utf-8')
。它有b,因为它是一个字节串。要将其设置为普通字符串,您可以在大多数情况下使用.strip()
。它可能是一个不同的编码,但utf-8可能会工作。然后,要删除新行,您可以使用result = ssh.stdout.read().decode('utf-8').strip()
print(result)
# slave
。把它们放在一起,其中任何一个都可行:
result = [line.decode('utf-8').strip() for line in ssh.stdout.readlines()]
print(result)
# ['slave']
或
\r\n
当你只有一行时,任何一个都可以工作。如果你有多行,第一行将无法正常工作;它会在字符串的中间有multipart.toString().getBytes()
。
答案 1 :(得分:1)
调用subprocess.Popen
然后从其stdout
属性手动读取的整个过程可以压缩为一个调用,该调用也会自动执行字节到字符串的转换:
subprocess.check_output([arg0, arg1, ...], encoding='utf-8')
如果您还想阅读stderr,请添加stderr=subprocess.STDOUT
。
您可以在此处找到subprocess.check_output
的{{3}}。