如何用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
相关产品推荐
相关产品推荐

