2

我正在尝试使用我自己的 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']

为什么这不起作用,我该如何解决

4

0 回答 0