将带引号的字符串传递给ssh

时间:2018-01-30 13:59:47

标签: linux bash shell

所以,我想在终端

中运行此命令
pssh -h hosts -i "echo "DenyUsers $1" >> /etc/ssh/sshd_config && service sshd config"

正如您所看到的,"之前,回声词会被破坏,并且会在"命令之前由DenyUsers $1结束。 我在回声和配置单词之后更改了",它仍然不能像我想要的那样工作。

我是这个脚本的新手,我不知道应该在搜索引擎中添加哪些关键字: - )

3 个答案:

答案 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'