我正在尝试使用我自己的 iptables 规则为使用 subprocess.open 的子进程运行子进程。该命令适用于shell=True
. 但是当我删除 shell 选项时,它会将 shell 选项设置为 false。该命令不再起作用。
这是工作代码:
HOST = localhost
PORT: 8000
group_name = "no-external-internet"
subprocess.Popen(
f"addgroup --system {group_name}; "
f"iptables -A OUTPUT -m owner --gid-owner {group_name} -d {HOST} -p tcp --sport {PORT} -j ACCEPT; "
f"iptables -A OUTPUT -m owner --gid-owner {group_name} -j REJECT; "
f"ip6tables -A OUTPUT -m owner --gid-owner {group_name} -j REJECT; "
f"sg {group_name} './run.sh {HOST}:{PORT}'",
shell=True,
cwd="some directory",
preexec_fn=os.setsid,
)
当我删除shell=True
并使用 shlex 拆分我的命令时:
subprocess.Popen(
shlex.split(
f"addgroup --system {group_name}; "
f"iptables -A OUTPUT -m owner --gid-owner {group_name} -d {HOST} -p tcp --sport {PORT} -j ACCEPT; "
f"iptables -A OUTPUT -m owner --gid-owner {group_name} -j REJECT; "
f"ip6tables -A OUTPUT -m owner --gid-owner {group_name} -j REJECT; "
f"sg {group_name} './run.sh {HOST}:{PORT}'",
),
cwd="some directory",
preexec_fn=os.setsid,
)
我收到错误:
Unknown option: m
Unknown option: gid-owner
Option d is ambiguous (debug, disabled-login, disabled-password)
Unknown option: p
Unknown option: sport
Unknown option: j
Unknown option: m
Unknown option: gid-owner
Unknown option: j
Unknown option: m
Unknown option: gid-owner
Unknown option: j
我打印了拆分结果,看起来还不错:
['addgroup', '--system', 'no-external-internet;', 'iptables', '-A', 'OUTPUT', '-m', 'owner', '--gid-owner', 'no-external-internet'、'-d'、'127.0.0.1'、'-p'、'tcp'、'--sport'、'8000'、'-j'、'ACCEPT;'、'iptables '、'-A'、'OUTPUT'、'-m'、'owner'、'--gid-owner'、'no-external-internet'、'-j'、'REJECT;'、'ip6tables'、 '-A'、'OUTPUT'、'-m'、'owner'、'--gid-owner'、'no-external-internet'、'-j'、'REJECT;'、'sg'、'no -external-internet', './run.sh 127.0.0.1:8000']
为什么这不起作用,我该如何解决