59 lines
1.3 KiB
Python
59 lines
1.3 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import signal
|
|
import struct
|
|
import sys
|
|
|
|
|
|
def output(line, stream=sys.stdout, print_only=False):
|
|
if isinstance(line, str):
|
|
line = line.encode("utf-8", "surrogateescape")
|
|
if not print_only:
|
|
stream.buffer.write(struct.pack("@I", len(line)))
|
|
stream.buffer.write(line)
|
|
stream.flush()
|
|
|
|
|
|
def echo_loop():
|
|
while True:
|
|
line = sys.stdin.buffer.readline()
|
|
if not line:
|
|
break
|
|
|
|
output(line)
|
|
|
|
|
|
if sys.platform == "win32":
|
|
import msvcrt
|
|
|
|
msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
|
|
|
|
|
|
cmd = sys.argv[1]
|
|
if cmd == "echo":
|
|
echo_loop()
|
|
elif cmd == "exit":
|
|
sys.exit(int(sys.argv[2]))
|
|
elif cmd == "env":
|
|
for var in sys.argv[2:]:
|
|
output(os.environ.get(var, "!"))
|
|
elif cmd == "pwd":
|
|
output(os.path.abspath(os.curdir))
|
|
elif cmd == "print_args":
|
|
for arg in sys.argv[2:]:
|
|
output(arg)
|
|
elif cmd == "ignore_sigterm":
|
|
signal.signal(signal.SIGTERM, signal.SIG_IGN)
|
|
|
|
output("Ready")
|
|
while True:
|
|
try:
|
|
signal.pause()
|
|
except AttributeError:
|
|
import time
|
|
|
|
time.sleep(3600)
|
|
elif cmd == "print":
|
|
output(sys.argv[2], stream=sys.stdout, print_only=True)
|
|
output(sys.argv[3], stream=sys.stderr, print_only=True)
|