给SSH传递带引号字符串问题:pssh命令引号嵌套失效求助
解决pssh命令中引号嵌套导致的截断问题
这问题我之前写批量脚本时也踩过坑!核心原因就是双引号的嵌套冲突:你用外层双引号包裹pssh要执行的远程命令,而里面echo又用了双引号,shell会把第一个内层双引号当成外层引号的结束标记,直接截断了后面的内容,自然达不到预期效果。
给你几个实用的解决方案,按需选就行:
方案1:转义内层双引号
把echo里的双引号用反斜杠\转义,这样shell就不会把它识别为外层引号的结束符:
pssh -h hosts -i "echo \"DenyUsers $1\" >> /etc/ssh/sshd_config && service sshd reload"
⚠️ 注意:如果$1是你本地脚本的参数,这样写没问题;但如果想让$1在远程机器上解析(比如远程机器的环境变量),需要把$也转义成\$1。
方案2:替换外层引号为单引号
单引号在shell里会原样传递所有内容,不会解析变量或转义字符(除了单引号本身),所以把外层的双引号换成单引号,内层保留双引号就不会冲突了:
pssh -h hosts -i 'echo "DenyUsers $1" >> /etc/ssh/sshd_config && service sshd reload'
⚠️ 这里要注意:如果$1是本地脚本的参数,单引号会让它不被本地shell解析,直接传到远程机器。如果要让本地解析$1,可以拆分引号:
pssh -h hosts -i 'echo "DenyUsers '"$1"'" >> /etc/ssh/sshd_config && service sshd reload'
原理是:先以单引号包裹部分内容,遇到$1时关闭单引号,用双引号包裹$1让本地解析,之后再打开单引号继续包裹剩余内容。
额外小提示
你命令里的service sshd config应该是笔误吧?修改sshd配置后,通常需要执行service sshd reload或者systemctl reload sshd(取决于系统版本)来让配置生效哦~
内容的提问来源于stack exchange,提问作者3-commerce
相关产品推荐
相关产品推荐

