You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SSH.NET执行sudo ufw delete 3并自动确认?能否删除指定IP?

解决SSH.NET执行ufw删除命令无响应及指定IP删除问题

一、解决ufw删除命令无响应的问题

方法1:使用--force参数跳过确认(推荐)

ufw的delete命令支持--force(或简写-f)参数,可直接跳过确认提示,无需手动输入y。这种方式能直接用RunCommand执行,不会出现阻塞无响应的情况:

string _host = "xxx.xxx.xxx.xxx";
string _username = "root";
string _password = "xxxxx";
int _port = 22;

using (SshClient sshClient = new SshClient(_host, _port, _username, _password))
{
    sshClient.Connect();
    // 带--force参数跳过确认
    SshCommand sshCmd = sshClient.RunCommand($"sudo ufw delete --force 3");
    // 可输出命令结果查看执行状态
    Console.WriteLine(sshCmd.Result);
    sshClient.Disconnect();
}

方法2:通过ShellStream处理交互式输入

如果必须保留确认流程,可以使用ShellStream创建交互式shell会话,手动发送命令和确认输入:

string _host = "xxx.xxx.xxx.xxx";
string _username = "root";
string _password = "xxxxx";
int _port = 22;

using (SshClient sshClient = new SshClient(_host, _port, _username, _password))
{
    sshClient.Connect();
    using (var shellStream = sshClient.CreateShellStream("xterm", 80, 24, 800, 600, 1024))
    {
        // 读取初始shell输出,避免阻塞
        ReadShellOutput(shellStream);
        
        // 发送删除命令
        shellStream.WriteLine("sudo ufw delete 3");
        // 等待确认提示出现(也可循环读取输出判断,这里用简单延时)
        System.Threading.Thread.Sleep(1000);
        ReadShellOutput(shellStream);
        
        // 发送确认输入y
        shellStream.WriteLine("y");
        System.Threading.Thread.Sleep(1000);
        string result = ReadShellOutput(shellStream);
        Console.WriteLine(result);
    }
    sshClient.Disconnect();
}

// 辅助方法:读取shell输出内容
private static string ReadShellOutput(ShellStream shellStream)
{
    StringBuilder output = new StringBuilder();
    while (shellStream.DataAvailable)
    {
        byte[] buffer = new byte[1024];
        int bytesRead = shellStream.Read(buffer, 0, buffer.Length);
        output.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
    }
    return output.ToString();
}

二、删除指定IP的ufw规则

ufw支持直接通过规则内容删除指定IP的规则,无需记忆规则编号,有两种常用方式:

1. 直接通过规则内容删除

比如要删除允许192.168.1.100访问的规则:

sudo ufw delete allow from 192.168.1.100

如果是拒绝该IP的规则:

sudo ufw delete deny from 192.168.1.100

同样可以加上--force参数跳过确认,在SSH.NET中执行:

string targetIp = "192.168.1.100";
SshCommand sshCmd = sshClient.RunCommand($"sudo ufw delete --force allow from {targetIp}");

2. 先查编号再删除

如果不确定规则内容,可先执行sudo ufw status numbered获取规则编号,再用编号删除:

sudo ufw status numbered

输出示例:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    192.168.1.100
[ 2] 80/tcp                     ALLOW IN    Anywhere

找到目标IP对应的编号后,用sudo ufw delete --force 编号删除即可。


内容的提问来源于stack exchange,提问作者iop04329

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:50:23