我正在编写一个bash脚本来使用vagrant提供我的服务器。我的配置脚本是一个外部bash脚本。
目前我正试图在我的ssh_config文件中设置横幅,但它似乎不起作用。
我正在网上寻找如何替换文件中的字符串:ssh_config中的默认值是'#Banner none',需要'Banner/etc/issue.net'。
我的问题是,我总是得到一个权限拒绝在/etc/issue.net,但我认为它看到的字符串作为一个文件访问,而不是字符串替换。
我的命令text_to_find="#Banner none"
text_to_replace= '"Banner /etc/issue.net"'
sed -i 's/$text_to_find/$text_to_replace/g' /etc/ssh/sshd_config
首先,我尝试不使用单引号,我试图转义字符串,但我尝试的所有事情都没有帮助。
你的第二个作业不是一个作业;在=
后面加一个空格,它将尝试运行一个名为"Banner /etc/issue.net"
的命令,该命令可能不存在,并将变量设置为该命令环境中的空字符串。
另外,您在sed
命令中的引号是错误的,所以一旦您获得正确的分配,您将要求sed
查找文字$text_to_find
并将其替换为$text_to_replace
,而不是您存储在这些变量中的字符串。
最后,如果搜索或替换文本中有/
,则不能使用/
作为seds
命令的分隔符。一旦您修复了赋值和引号,并将您想要的实际文本放入sed中,您将得到这样的结果:
sed -i "s/$text_to_find/$text_to_replace/g"
展开为:
sed -i 's/#Banner none/"#Banner /etc/issue.net"/g'
里面有5个/
。sed
应该如何知道哪些是s
的参数,哪些是这些参数的一部分?幸运的是,您不必使用/
作为分隔符;你可以选择任何角色。例如:
sed -i "s|$text_to_find|$text_to_replace|g"
你也可以使用一些奇特的扩展技巧,在所有斜杠前面插入一个反斜杠:
sed -i "s/${text_to_find////\/}/${text_to_replace////\/}/g"
但是谁会想在shell脚本上到处都是牙签呢?
另外,对text_to_replace
的赋值包括将在文件中结束的文字引号;确保这是你想要的。