具有多个参数的 C# Process.Start() 不起作用 (nmap)

发布于 2025-01-10 17:06:13 字数 1302 浏览 0 评论 0原文

描述

目前我正在尝试通过 C# Process.Start() 调用“nmap”。但我无法让它与我想要的输入参数一起工作。 在 Process.Start() 中,它似乎对参数进行了错误的解析。 你知道我必须如何编写我的命令正确运行的 ArgumentList 吗? 在命令行中,相同的命令就像魅力一样工作......

谢谢!

示例

我的简单示例:(编辑:雷阳的建议)

using System.Diagnostics;


namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using var myprocess = Process.Start
            (
                new ProcessStartInfo
                {
                    FileName = "/bin/zsh",
                    ArgumentList = {"-c nmap -p 8000-9000 -oG - 192.168.178.37/24 | awk -F'[/ ]' '{h=$2; for(i=1;i<=NF;i++){if($i==\"open\"){print h,$(i-1)}}}'" }

                }
            );

            myprocess.WaitForExit();
        }
    }
}

此命令的输出:

zsh: bad option string: '-c nmap -p 8000-9000 -oG - 192.168.178.37/24 | awk -F'[/ ]' '{h=$2; for(i=1;i<=NF;i++){if($i=="open"){print h,$(i-1)}}}''

期望的输出:

192.168.178.1 8089
192.168.178.1 8181
192.168.178.1 8182
192.168.178.1 8183
192.168.178.1 8184
192.168.178.1 8185
192.168.178.1 8186
192.168.178.43 8080

Description

At the moment I am trying to call "nmap" through C# Process.Start(). But I can't get it work with my desired input arguments.
At Process.Start() it seems to make a false parsing of the arguments.
Do you know how I have to write the ArgumentList that my command is running right?
In the commandline the same command works like charm...

Thank you!

Example

My simple example: (Edit: Suggestion of Lei Yang)

using System.Diagnostics;


namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using var myprocess = Process.Start
            (
                new ProcessStartInfo
                {
                    FileName = "/bin/zsh",
                    ArgumentList = {"-c nmap -p 8000-9000 -oG - 192.168.178.37/24 | awk -F'[/ ]' '{h=$2; for(i=1;i<=NF;i++){if($i==\"open\"){print h,$(i-1)}}}'" }

                }
            );

            myprocess.WaitForExit();
        }
    }
}

Output of this command:

zsh: bad option string: '-c nmap -p 8000-9000 -oG - 192.168.178.37/24 | awk -F'[/ ]' '{h=$2; for(i=1;i<=NF;i++){if($i=="open"){print h,$(i-1)}}}''

Desired output:

192.168.178.1 8089
192.168.178.1 8181
192.168.178.1 8182
192.168.178.1 8183
192.168.178.1 8184
192.168.178.1 8185
192.168.178.1 8186
192.168.178.43 8080

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萌能量女王 2025-01-17 17:06:13

在你的帮助下我可以解决这个问题。
谢谢你!

对于有同样问题的人的解决方案:

变体 1:
直接方式:

using System.Diagnostics;


namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using var myprocess = Process.Start
            (
                new ProcessStartInfo
                {
                    FileName = "/bin/zsh",
                    ArgumentList = {  "-c",  "nmap -p 8000-9000 -oG - 192.168.178.37/24 | awk -F'[/ ]' '{h=$2; for(i=1;i<=NF;i++){if($i==\"open\"){print h,$(i-1)}}}'" }

                }
            );

            myprocess.WaitForExit();
        }
    }
}

变体 2:
绕道:Shell脚本
(也许是更简单的方法)
C#:

using System.Diagnostics;


namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using var myprocess = Process.Start
            (
                new ProcessStartInfo
                {
                    FileName = "/bin/zsh",
                    ArgumentList = {"/home/alexander/tst.sh"}
                }
            );

            myprocess.WaitForExit();
        }
    }
}

Shell 脚本:

#!/bin/zsh
nmap -p 8000-9000 -oG - 192.168.178.37/24 | awk -F'[/ ]' '{h=$2; for(i=1;i<=NF;i++){if($i=="open"){print h,$(i-1)}}}'

两种变体的输出:

192.168.178.1 8089
192.168.178.1 8181
192.168.178.1 8182
192.168.178.1 8183
192.168.178.1 8184
192.168.178.1 8185
192.168.178.1 8186
192.168.178.43 8080

With the help of you I could solve the problem.
Thank you!

Solution for someone with the same problem:

Variant 1:
Direct way:

using System.Diagnostics;


namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using var myprocess = Process.Start
            (
                new ProcessStartInfo
                {
                    FileName = "/bin/zsh",
                    ArgumentList = {  "-c",  "nmap -p 8000-9000 -oG - 192.168.178.37/24 | awk -F'[/ ]' '{h=$2; for(i=1;i<=NF;i++){if($i==\"open\"){print h,$(i-1)}}}'" }

                }
            );

            myprocess.WaitForExit();
        }
    }
}

Variant 2:
Detour: Shell script
(Maybe the easier way)
C#:

using System.Diagnostics;


namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using var myprocess = Process.Start
            (
                new ProcessStartInfo
                {
                    FileName = "/bin/zsh",
                    ArgumentList = {"/home/alexander/tst.sh"}
                }
            );

            myprocess.WaitForExit();
        }
    }
}

Shell script:

#!/bin/zsh
nmap -p 8000-9000 -oG - 192.168.178.37/24 | awk -F'[/ ]' '{h=$2; for(i=1;i<=NF;i++){if($i=="open"){print h,$(i-1)}}}'

Output of both variants:

192.168.178.1 8089
192.168.178.1 8181
192.168.178.1 8182
192.168.178.1 8183
192.168.178.1 8184
192.168.178.1 8185
192.168.178.1 8186
192.168.178.43 8080
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文