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

Nic*_*uff 1 linux bash shell

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

pssh -h hosts -i "echo "DenyUsers $1" >> /etc/ssh/sshd_config && service sshd config"
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,"在回声词被打破"之前它将在DenyUsers $1命令之前结束.我已经"在echo之前和配置单词之后改变了它并不像我想要的那样工作.

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

Cha*_*ffy 6

即使您不信任您的输入,以安全的方式执行此操作也会涉及更多.

使用printf %q生成eval数据的-safe版本:

#!/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"
Run Code Online (Sandbox Code Playgroud)

请注意,printf使用的是代替echo更高的可预测性; 请参阅POSIX规范echo的"应用程序使用"部分.