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

标签 linux bash shell

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

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

如您所见," before echo words 将被破坏,它将被 " before DenyUsers $1 命令结束。 我已经在 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 以获得更好的可预测性;请参阅 POSIX specification for echo 的应用程序使用部分.

关于linux - 将带引号的字符串传递给 ssh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48523268/

相关文章:

php - 如何获取作为管道中第一个命令运行的 PHP 脚本的 PID?

linux - 转换针对Linux和Bash的Makefile

linux - 如何使用 | 获取多个信息grep?

linux - 在带有标题的 block 中分组的行中的数字总和(使用 Bash 和 AWK)

linux - 从 bash 中的文件相乘的单行命令

linux - 使用ash shell "for x in y"

php - 通过另一台计算机上的网络服务器访问本地文件

bash - ${foo//(/\\(} 无法使用启用的 extglobs

当我调用脚本并让脚本保持运行时,C++ 应用程序在退出时挂起

python - 获取 ffmpeg 的结果并将其传递给 python 脚本