linux - 为什么 Capistrano 在执行特定 iptables 命令时会锁定?

标签 linux capistrano iptables

我正在尝试使用 Capistrano 远程打开 iptables 防火墙中的端口。这是我的任务:

  desc "Open up a port in the firewall"
  task :open_port, :roles => :all do
    port = variables[:port] || nil
    if (!port)
      puts "You must specify the port number"
      next
    end
    run "#{sudo} /sbin/iptables -I RH-Firewall-1-INPUT 1 -p tcp --dport #{port.to_s} -j ACCEPT"
    run "#{sudo} /sbin/service iptables save"
    run "#{sudo} /etc/init.d/iptables restart"
  end

问题是任务中的第一个命令被锁定。我尝试使用各种端口号和目标计算机运行此规则,但始终得到相同的结果。

我确实有很多其他规则,看起来很像这个,但工作得很好。事实上,我有一个类似的任务,其中第一个命令是调用 iptables 来创建端口映射,并且该任务运行得很好。

此外,我可以在 Capistrano 主机上成功运行此命令:

  ssh -l deployer core sudo /sbin/iptables -I RH-Firewall-1-INPUT 1 -p tcp --dport 2424 -j ACCEPT

这很好用。这应该正是 Capistrano 正在尝试做的事情。

为什么这个命令会锁定 Capistrano?

TIA 寻求解决方案或任何线索。

祝大家玩得开心!!!

最佳答案

前几天我自己解决了这个问题。问题是我使用名称“port”作为我的任务的参数。 “参数”端口由“运行”命令识别,并导致系统尝试通过该端口而不是普通的 ssh 端口连接到目标计算机。因此锁定。

我将参数名称更改为“dport”,任务开始按我的预期工作。

关于linux - 为什么 Capistrano 在执行特定 iptables 命令时会锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3273145/

相关文章:

c++ - 我的程序是 "Killed"

linux - Mercurial - 以其他用户身份执行

linux - 使用包含空格的参数调用另一个 shell 脚本

JavaScript 缓存、Rails 和 Apache 乘客?

ruby-on-rails - capistrano3 : Don't know how to build task 'deploy:create_db'

docker - 启用从 Docker 容器到外部世界的转发

bash - 有选择地从 'iptables -nvL' 命令输出中删除不必要的列空格吗?

android - 什么是 posix_fallocate 的替代 API

ruby - 使用 capistrano 部署时切换用户?

awk - 使用 awk 从返回值中去除值