11

以下は私にとってはうまくいきません:

ssh user@remote.server "k=5; echo $k;"

空行を返すだけです。

リモート セッション (ssh) で変数を割り当てるにはどうすればよいですか?

注:私の質問は、ssh セッションにローカル変数を渡す方法ではなく、リモート変数を作成して割り当てる方法に関するものです(かなり単純な作業でしょうか?)


編集:

より詳細には、私はこれをやろうとしています:

bkp=/some/path/to/backups
ssh user@remote.server "bkps=( $(find $bkp/* -type d | sort) );
                        echo 'number of backups: '${#bkps[@]};
                        while [ ${#bkps[@]} -gt 5 ]; do
                            echo ${bkps[${#bkps[@]}-1]};
                            #rm -rf $bkps[${#bkps[@]}-1];
                            unset bkps[${#bkps[@]}-1];
                        done;"

find コマンドは正常に機能しますが、何らかの理由で$bkpsデータが取り込まれません。だから私の推測では、他のすべてをチェックしたと思うので、変数の割り当ての問題になると思いました...

4

1 に答える 1

19

この呼び出しを考えると:

ssh user@remote.server "k=5; echo $k;"

ローカル シェル$kは実行前に展開されます (設定されていない可能性が最も高い) ssh ...。したがって、接続が確立されると実際にリモート シェルに渡されるコマンドはk=5; echo ;(またはk=5; echo something_else_entirely;k実際にローカルに設定されている場合) です。

これを避けるには、次のようにドル記号をエスケープします。

ssh user@remote.server "k=5; echo \$k;"

または、二重引用符の代わりに単一引用符を使用して、ローカル展開を防ぎます。ただし、これはこの単純な例では機能しますが、リモート側に送信されるコマンド内の一部の変数をローカルで展開することが実際には必要な場合があるため、おそらくバックスラッシュでエスケープする方が適切な方法です。

今後の参考のためset -xに、シェルに入力して、実行中の実際のコマンドをエコーし​​、トラブルシューティングの助けにすることもできます。

于 2012-10-23T15:12:25.167 に答える