48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
import re,chardet,subprocess
|
|
def shell(cmd='', stdout=None, stderr=None, timeout=None):
|
|
match stdout:
|
|
case 'NULL' | 'Null' | 'null':
|
|
stdoutCh = subprocess.DEVNULL
|
|
case _:
|
|
stdoutCh = subprocess.PIPE
|
|
match stderr:
|
|
case 'NULL' | 'Null' | 'null':
|
|
stderrCh = subprocess.DEVNULL
|
|
case _:
|
|
stderrCh = subprocess.PIPE
|
|
try:
|
|
result = subprocess.run(cmd, shell=True, stdout=stdoutCh, stderr=stderrCh, timeout=timeout)
|
|
stdoutContent = ''
|
|
stderrContent = ''
|
|
if result.stdout:
|
|
stdoutContent = result.stdout.decode(chardet.detect(result.stdout)["encoding"] or 'UTF-8')
|
|
if result.stderr:
|
|
stderrContent = result.stderr.decode(chardet.detect(result.stderr)["encoding"] or 'UTF-8')
|
|
return {
|
|
"code": result.returncode, "stdout": stdoutContent, "stderr": stderrContent
|
|
}
|
|
except subprocess.TimeoutExpired:
|
|
return {
|
|
"code": 1,
|
|
"stdout": '',
|
|
"stderr": 'Execution timeout.'
|
|
}
|
|
|
|
if __name__ == '__main__':
|
|
# Example. Normal.
|
|
print(shell('ping www.taobao.com'))
|
|
# Example. No STDOUT.
|
|
print(shell('ping www.taobao.com', stdout='NULL'))
|
|
# Example. No STDERR.
|
|
print(shell('ping www.taobao.com', stderr='NULL'))
|
|
# Example. No STDOUT and STDERR.
|
|
print(shell('ping www.taobao.com', stdout='NULL', stderr='NULL'))
|
|
# Example. With Timeout.
|
|
print(shell('ping www.taobao.com', timeout=3))
|
|
# Example. With Timeout Not.
|
|
print(shell('ping www.taobao.com', timeout=8))
|
|
# Example. Curl.
|
|
print(shell('curl "https://www.baidu.com/"'))
|
|
# Example. Unknown Command.
|
|
print(shell('busybox ls'))
|