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

Linux 将带引号的字符串传递给ssh,linux,bash,shell,Linux,Bash,Shell,所以,我想在终端中运行这个命令 pssh -h hosts -i "echo "DenyUsers $1" >> /etc/ssh/sshd_config && service sshd config" 如您所见,“之前的echo单词将被打断,并将由之前的DenyUsers$1命令结束。 我已经更改了echo之前和config words之后的“,但它仍然不能像我想要的那样工作 我是这个脚本编写的新手,我不知道我应该在搜索引擎中输入什么关键字:-)如果$1的来源可以

所以,我想在终端中运行这个命令

pssh -h hosts -i "echo "DenyUsers $1" >> /etc/ssh/sshd_config && service sshd config"
如您所见,
之前的echo单词将被打断,并将由
之前的
DenyUsers$1
命令结束。 我已经更改了echo之前和config words之后的
,但它仍然不能像我想要的那样工作


我是这个脚本编写的新手,我不知道我应该在搜索引擎中输入什么关键字:-)

如果
$1
的来源可以信任,那么你可以简单地用
\
跳过内部双引号:

pssh -h hosts -i "echo \"DenyUsers $1\" >> /etc/ssh/sshd_config && service sshd config"

上述方法的缺点是,如果
$1
扩展为恶意内容,例如扩展为
$(rm-fr*)
,那么,
/etc/ssh/sshd\u config
将包含:

echo "DenyUsers $(rm -fr *)"
执行时将运行
rm-fr*


为此,考虑一个更安全的解决方案:基于代码> Prtff%q .< /P> < P>如果源代码<> 1美元可以信任,那么您可以简单地用“代码> \\代码>省略内部双引号:

pssh -h hosts -i "echo \"DenyUsers $1\" >> /etc/ssh/sshd_config && service sshd config"

上述方法的缺点是,如果
$1
扩展为恶意内容,例如扩展为
$(rm-fr*)
,那么,
/etc/ssh/sshd\u config
将包含:

echo "DenyUsers $(rm -fr *)"
执行时将运行
rm-fr*

为此,考虑一个基于<代码> Prtff%q的安全解决方案。

pssh-h hosts-i“echo\”DenyUsers$1\“>/etc/ssh/sshd\u config&service sshd config”

pssh-h hosts-i'echo“DenyUsers$1”>/etc/ssh/sshd\u config&&service sshd config”

你试过了吗
pssh-h hosts-i“echo\”DenyUsers$1\“>/etc/ssh/sshd\u config&service sshd config”

pssh-h hosts-i'echo“DenyUsers$1”>/etc/ssh/sshd\u config&&service sshd config”

以安全的方式执行此操作,即使您不信任您的输入,也会有点麻烦

使用
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
,以提高可预测性;请参阅的应用程序使用部分。

以安全的方式执行此操作,即使您不信任您的输入也有点复杂

使用
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
以获得更高的可预测性;请参阅。

的应用程序使用部分。这实际上是非常专门关于ssh的—在通常情况下,您不会将shell命令作为字符串传递。这实际上是非常专门关于ssh的—在通常情况下,您不会将shell命令作为strin传递只有当您信任
$1
--如果它是
$(rm-rf.)的来源时,这才是安全的
,f/e,那么这将在您的所有机器上运行;如果它是DenyUsers条目,我不会惊讶地看到这个脚本用于以编程方式自动防止尝试登录与作恶相关的名称。使用
printf%q
逃避值更安全只有信任
的源代码,这才是安全的>$1
--如果是
$(rm-rf.)
,f/e,那么这将在您的所有机器上运行;如果它是DenyUsers条目,我不会惊讶地看到这个脚本用于以编程方式自动防止尝试登录与作恶相关的名称。使用
printf%q
OMG来逃避值更安全,我甚至认为a\无法逃避双重身份”排成一行。这就是我使用的答案,因为它很简单。但是,如果你是一个linux操作系统的人,并且比我这样的新手了解得更多,那么这就是正确的答案[根据更多的解释[@NickyPuff,也许你考虑的是单引号——反斜杠是字面意义上的引号。天哪,我甚至不认为a \可以逃脱双引号“在一行中。这是我使用的答案,因为它很简单。但是,如果你是一个linux的家伙,对我这样的新手经验了解得更多,那么这就是正确的答案[根据更多的解释[@NickyPuff,也许你在考虑单引号-,反斜杠是字面意义上的。