通过 ssh 启动firewalld.service

通过 ssh 启动firewalld.service

当我们在远程机器上配置和启动防火墙时,我们遇到了非常奇怪的问题

当我们通过 ssh 运行以下命令(来自 bash 脚本)时,

  • 我们有 Redhat 7 机器

    systemctl 启动firewalld.service

脚本示例:

ssh $USER@$IP systemctl enable firewalld.service
ssh $USER@$IP systemctl start firewalld.service

然后我们从命令中得到关于超时的消息 - systemctl startfirewalld.service

但是当我们在机器上运行 - systemctl startfirewalld.service manual

然后我们访问并运行它

那么为什么我们不能通过 SSH 运行命令但在本地我们可以运行它?

这里有什么区别?

答案1

我手头没有 Redhat 7 机器,因此无法显示确切的值。但是:

登录后,您通常会获得丰富的环境,方便您在交互会话期间使用。当然,这取决于您的设置,因为您可以设置任何您想要的环境向 /etc/profile、$HOME/.bashrc 以及以许多其他方式添加语句。

相比之下,当仅发出远程命令时,您将获得更简单的环境;某些目录可能不在您的 PATH 环境变量中,例如

查看不同环境的简单方法是以下两个会话:

ssh $USER@$IP env

相对

ssh $USER@$IP
env
exit

您可以先比较 PATH 值,然后尝试systemctl enable firewalld.service在交互式 shell 上运行您的命令,但先将 PATH 变量更改为它的非交互式变体。

如果这还没有让您满意,请将交互式会话的整个环境设置为与非交互式版本完全相同。

这种方式还有另一个不同之处ssh host command:您没有获得 tty;您会看到发出命令tty。您的交互式会话将回答类似 的内容/dev/pts/3,而ssh host tty将回答not a tty。我注意到 systemctl 依赖于 tty 甚至表现得略有不同,但它调用的其他命令可能会这样做。您可能需要 ssh 分配一个 tty,添加 -t 开关,如以ssh -t $USER@$IP systemctl enable firewalld.service查看它是否有所不同。

相关内容