スクリプトの実行に問題があります。
デバッグモードで実行すると(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}
これは出力です:
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"'
Bashは、有効な入力構文であるコマンドを示すために、単一引用符を表示しています。 ssh
コマンドのパラメーターにこれらの単一引用符を含むコマンドは実行されていません。
_ssh … '"Sudo' /home/pi/shared/blink.sh 27 'off"'
_
sshコマンドの最後の4つのパラメーターが_"Sudo
_、_/home/pi/shared/blink.sh
_、_27
_および_off"
_であることを示します。
リモートホストでは、sshデーモンがスペースを区切り文字としてコマンドの単語を結合するため、実行しているリモートコマンドは
_"Sudo /home/pi/shared/blink.sh 27 off"
_
これは、もちろん存在しない_Sudo /home/pi/shared/blink.sh 27 off
_という名前のコマンドを実行しようとします。
testvar
の定義から二重引用符を削除します。
ここでは重要ではありませんが、実際のケースではおそらく重要です。_${testvar}
_の代わりに、_"$testvar"
_(または、必要に応じて_"${testvar}"
_と記述しますが、中括弧はオプションです)。 変数の置換を常に二重引用符で囲みますなぜそれらを省略する必要があるかを知らない限り。 _"$testvar"
_は変数testvar
の値に展開されますが、_$testvar
_が二重引用符で囲まれていない場合、testvar
の値は空白で区切られたグロブパターンのリストとして扱われます。
私はあなたが使うべきだと思います:
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}"
これは私のために働いています:
$ bash -x -c 'testvar="la la la"; echo "${testvar}"'
+ testvar='la la la'
+ echo 'la la la'
la la la
しかし、私があなたがしたように同じことを書くと、同じ間違った結果が得られます。
$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"
シェルは変数の値を単語に分割します。分割しないように二重引用符で囲みます。違いを見ます:
t='"a b c"'
set -xv
echo $t
echo "$t"