当我们在远程机器上配置和启动防火墙时,我们遇到了非常奇怪的问题
当我们通过 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
查看它是否有所不同。