如何在herdoc中处理shell脚本参数?

如何在herdoc中处理shell脚本参数?,shell,Shell,我需要切换到oracle用户以更改对tnsnames.ora文件的权限。我将此文件路径作为参数传递,但看起来语法有问题。感谢您帮助解决此问题 下面是我的剧本 #!/bin/bash sudo su - oracle <<-"EOF" chmod 777 "$1" EOF 此处指定了文件的操作,其中说明: 如果word中有任何字符被引用,则分隔符应通过对word执行引号删除来形成,此处的文档行不应展开。否则,分隔符应为单词本身 若word中未引用任何字符,则应展开此处文件的

我需要切换到oracle用户以更改对tnsnames.ora文件的权限。我将此文件路径作为参数传递,但看起来语法有问题。感谢您帮助解决此问题

下面是我的剧本

#!/bin/bash

sudo su - oracle <<-"EOF"
    chmod 777 "$1"
EOF

此处指定了文件的操作,其中说明:

如果word中有任何字符被引用,则分隔符应通过对word执行引号删除来形成,此处的文档行不应展开。否则,分隔符应为单词本身

若word中未引用任何字符,则应展开此处文件的所有行,以进行参数展开、命令替换和算术展开。在这种情况下,输入中的
表现为双引号内的
(请参见双引号)。但是,除非双引号出现在“$()”、“``”或“${}”中,否则在here文档中不应特别处理双引号字符(““”)


因此,通过使用
如果您以任何方式关心安全性,正确的做法不是更改报价,而是保持原样,并使用
bash-s
将参数直接传递给以
oracle
用户身份运行的shell:

#!/bin/bash
sudo -u oracle bash -s "$@" <<-'EOF'
    chmod 777 "$1"
EOF

使用这两种方法中的任何一种,您的内部shell都会运行
$1
扩展本身,并且命令行上的数据不会被替换为代码,也不会被解析为代码。

引用
EOF
herdoc标记告诉shell不要扩展herdoc的内容。如果您希望它这样做,那么您就不想引用该标记。thanks用于快速响应。它起作用了。现有的答案只适用于普通情况。如果您希望能够安全地传递任意值,它会更有趣。要测试这些实践的安全影响吗?请尝试运行
/yourscript'$(touch/tmp/hello)
;如果操作正确,您将得到一个错误(或更改了名为
/$(touch/tmp/hello)
的文件的权限(如果存在);如果做错了,您将创建一个名为
/tmp/hello
的文件。鼓励会导致外壳注入漏洞的做法?Tsk,Tsk。@CharlesDuffy我顺便指出,这通常不是人们希望在这里做的,但您肯定正确,您的解决方案更安全。
#!/bin/bash
sudo -u oracle bash -s "$@" <<-'EOF'
    chmod 777 "$1"
EOF
#!/bin/bash
printf -v sudo_cmd '%q ' bash -s "$@"
sudo su - oracle -c "$sudo_cmd" <<-'EOF'
    chmod 777 "$1"
EOF