使用Python回声与其他服务器回声



手动运行时,以下echo命令正常工作,即它可以触及上述服务器。

echo "{"status": "DOWN", "macaddr": "xyz-123p", "topic": "switches"}" | nc rms-kus-e003.corp.port.net 11

我尝试使用以下方法对其进行自动化。Echo在发送服务器上显示,但未到达目标服务器。

import os
import subprocess
e = 'echo echo \"{\\\"status\\\": \\\"DOWN\\\",  \\\"macaddr\\\": \\\"xyz-123p\\\", \\\"topic\\\": \\\"switches\\\"}\" | nc rms-aus-e003.corp.port.net 11'
subprocess.call(e, shell=True)
#for i in range (0,10):
#   os.system('echo echo \"{\\\"status\\\": \\\"DOWN\\\",  \\\"macaddr\\\": \\\"xyz-123p\\\", \\\"topic\\\": \\\"switches\\\"}\" | nc rms-aus-e003.corp.port.net 11 ')

请建议解决此问题。

您的疯狂引用是什么打破了它。最小的修复将是

#import os  # not needed
import subprocess
e = r'''echo 'echo "{"status": "DOWN", "macaddr": "xyz-123p", "topic": "switches"}"' | nc rms-aus-e003.corp.port.net 11'''
subprocess.call(e, shell=True)

请注意,特别是如何不涂抹管道字符。也没有理由支持破折号或点,因为它们不是壳化元。(您需要在正则表达式中倾斜点点点,以使其成为字面的点,但这根本不是正则是正则。破折号是必要的或正确的 1 。(

您重复的echo某种程度上建议您试图将其作为命令发送到nc以供远程服务器执行,但这不是您的Shell命令所做的;它只是将JSON字符串打印到插座。

无论哪种方式,只需从Python连接到nc,都会更顺畅,并避免使用fugly shell=True

s = subprocess.Popen(['nc', 'rms-aus-e003.corp.port.net', '11'], stdin=subprocess.PIPE)
s.communicate('{"status": "DOWN", "macaddr": "xyz-123p", "topic": "switches"}')
s.close()

如果您有python 3.5 ,则可以进一步简化

subprocess.run(['nc', 'rms-aus-e003.corp.port.net', '11'],
    input='{"status": "DOWN", "macaddr": "xyz-123p", "topic": "switches"}')

但是,当然,在这种简单情况下,nc不会做任何python不能做的事情,因此最简单的解决方案可能是

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('rms-aus-e003.corp.port.net', '11'))
s.sendall(b'{"status": "DOWN", "macaddr": "xyz-123p", "topic": "switches"}rn')
s.shutdown(socket.SHUT_WR)

(这对接收套接字将接受的值有些投机。CRLF线终止在网络协议中很常见,尽管我想如果收件人是U*X,那么如果没有r,它将非常高兴,并且可能并不特别喜欢它在那里。(


1 一些正则方言允许在字符类中进行后斜切的破折号,以放置字面的破折号而不是范围。因此, re.search(r'[:-;]') is a cumbersome way to match a colon, a dash, or a semicolon. The less obfuscated syntax would be re.search('[ - :;;](`它是正确的。

最新更新