use*_*585 16 shell ssh quoting
我在执行脚本时遇到问题。
在调试模式 (bash -x) 下执行它时,我可以看到 bash 正在添加额外的引号。因此我的脚本失败了。
这是在我的脚本中:
testvar="\"sudo /home/pi/shared/blink.sh 27 off\""
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar}
Run Code Online (Sandbox Code Playgroud)
这是输出:
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'
Run Code Online (Sandbox Code Playgroud)
Bash 显示单引号以显示有效输入语法的命令。它没有运行在命令的参数中包含这些单引号的ssh命令。
ssh … '"sudo' /home/pi/shared/blink.sh 27 'off"'
Run Code Online (Sandbox Code Playgroud)
告诉你的SSH命令的最后4个参数是"sudo,/home/pi/shared/blink.sh,27和off"。
在远程主机上,ssh 守护进程使用空格作为分隔符连接命令的单词,因此您正在执行的远程命令是
"sudo /home/pi/shared/blink.sh 27 off"
Run Code Online (Sandbox Code Playgroud)
这会尝试执行一个名称为 的命令sudo /home/pi/shared/blink.sh 27 off,该命令当然不存在。
从定义中删除双引号testvar。
这在这里无关紧要,但在您的实际情况中可能很重要:而不是${testvar}, write "$testvar"(或者"${testvar}"如果您愿意,但大括号是可选的)。除非您知道为什么需要将它们排除在外,否则始终在变量替换周围放置双引号。"$testvar"扩展为变量的值testvar,而$testvar当不在双引号中时,将 的值testvar视为以空格分隔的 glob 模式列表。
Shell 将变量的值拆分为单词。双引号它以防止拆分。看到不同:
t='"a b c"'
set -xv
echo $t
echo "$t"
Run Code Online (Sandbox Code Playgroud)