12

在任何其他 linux 发行版上,我可以创建一个带有 shebang 的文件并运行 shell 脚本,如下所示:

$ chmod +x test.sh
$ ./test.sh Johnny
hello Johnny

但是在 Google Cloud Platform Container-Optimized OS 上,我得到了-bash: ./test.sh: Permission denied

sh如果我以eg作为前缀,sh test.sh Johnny它将起作用。我怎样才能让它正常工作?

$ cat test.sh
#!/usr/bin/env sh

echo "Hello $@"

matt@rancher-4mmm /tmp/matt $ chmod +x test.sh 
matt@rancher-4mmm /tmp/matt $ sh ./test.sh matt
Hello matt

matt@rancher-4mmm /tmp/matt $ ./test.sh matt
-bash: ./test.sh: Permission denied
matt@rancher-4mmm /tmp/matt $ ls -la
total 4
drwxr-xr-x  2 matt matt  60 Feb 28 20:00 .
drwxrwxrwt 14 root root 280 Feb 28 19:59 ..
-rwxr-xr-x  1 matt matt  35 Feb 28 20:00 test.sh
4

4 回答 4

16

COS 节点上的大多数文件系统都挂载了“noexec”标志,因此您无法从它们执行二进制文件。

一些解决方法:

  • 对于脚本,使用脚本作为参数调用解释器,“bash /path/script.sh”,“python /path/app.py”
  • 在 /mnt/disks 下挂载一个额外的数据磁盘。您可以在没有“noexec”标志的情况下安装它。使用启动脚本在启动时挂载。
于 2018-05-10T18:33:24.987 回答
6

Container-Optimized OS 使用“noexec”标志挂载文件系统,除了“在可写位置中,只有 /var/lib/docker 和 /var/lib/cloud 被挂载为“可执行”(即没有 noexec 挂载标志)。 " [1]。您可以使用以下命令进行验证:

mount | grep noexec

有关 Container-Optimized OS (COS) 文件系统布局的更多信息,请参阅文档。'noexec' 选项不允许在挂载的文件系统上直接执行任何二进制文件。这是因为 COS 上的默认安全锁定实施。

于 2018-03-01T01:20:12.310 回答
2

如果您想一次性运行二进制文件并且不想处理另一个 PD,您也可以只安装一个 tmpfs 设备并从那里运行它。

sudo mkdir /mnt/disks/scratch
sudo mount -t tmpfs tmpfs /mnt/disks/scratch/
于 2019-06-16T06:22:46.897 回答
1

一种解决方案是使用另一个图像系列,例如ubuntu.

在那里,/tmp/没有安装noexec.

于 2021-01-07T13:44:45.707 回答