test.sh
リモートサーバー(私のローカルコンピュータにある)でスクリプトを実行しようとしています。test.sh
多くの場合、2つ以上の単語で構成される主張を受け入れます。
テスト.sh:
#!/bin/bash
while getopts b: opt;
do
case $opt in
b)
bval="$OPTARG"
;;
esac
done
echo $bval
私のローカルコンピュータではうまくいきます。
./test.sh -b "multi word arg"
出力:
multi word arg
ただし、リモートサーバーで次のように実行する場合:
ssh -A user@remotehost "bash -s" -- < ./test.sh -b "multi word arg"
私はちょうど次を得ます:
multi
完全なマルチワード引数をスクリプトに渡す方法のアイデアはありますか?
答え1
異なるレベルの引用が必要です。'"multi word arg"'
引用符の最初のレイヤーはローカルシェルによって削除され、インポートさssh
れますmulti word arg
。その後、ssh
リモートシステムで同様の操作を実行します$SHELL -c "bash -s -- -b multi word arg"
($SHELL
ログインシェルがある場所はbashである可能性が高い)。その後、ログインシェルは引用符(削除する必要はありません)とトークン化を削除し、単一の単語を取得します。
表示するには:
% ssh 192.168.0.2 'printf :%s:\\n' '"foo bar baz"'
:foo bar baz:
% ssh 192.168.0.2 'printf :%s:\\n' 'foo bar baz'
:foo:
:bar:
:baz: