所以,我想在终端
中运行此命令pssh -h hosts -i "echo "DenyUsers $1" >> /etc/ssh/sshd_config && service sshd config"
正如您所看到的,"
之前,回声词会被破坏,并且会在"
命令之前由DenyUsers $1
结束。
我在回声和配置单词之后更改了"
,它仍然不能像我想要的那样工作。
我是这个脚本的新手,我不知道应该在搜索引擎中添加哪些关键字: - )
答案 0 :(得分:6)
以安全的方式执行此操作,即使您不信任您的输入也需要更多参与。
使用printf %q
生成eval
- 安全版数据:
#!/usr/bin/env bash
# ^^^^- Requires an extension not available in /bin/sh
# printf %q is also available on ksh, but there you would write:
# echo_str=$(printf 'DenyUsers %q' "$1")
# cmd=$(printf '%q ' printf '%s\n' "$echo_str")
# as the ksh version doesn't have -v, but optimizes away the subshell instead.
printf -v echo_str 'DenyUsers %q' "$1"
printf -v cmd '%q ' printf '%s\n' "$echo_str"
pssh -h hosts -i "$cmd >> /etc/ssh/sshd_config && service sshd config"
请注意,printf
代替echo
,以提高可预测性;请参阅POSIX specification for echo
。
答案 1 :(得分:1)
如果可以信任$1
的来源,那么您可以使用\
转义内部双引号:
pssh -h hosts -i "echo \"DenyUsers $1\" >> /etc/ssh/sshd_config && service sshd config"
上述方法的缺点是如果$1
扩展为恶意,例如$(rm -fr *)
,会发生什么。然后,/etc/ssh/sshd_config
将最终包含:
echo "DenyUsers $(rm -fr *)"
执行时将运行rm -fr *
。
出于这个原因,请考虑this answer以获得基于printf %q
的更安全的解决方案。
答案 2 :(得分:1)
pssh -h hosts -i "echo \"DenyUsers $1\" >> /etc/ssh/sshd_config && service sshd config"
或pssh -h hosts -i 'echo "DenyUsers $1" >> /etc/ssh/sshd_config && service sshd config'