2012-10-23 7 views
5

次は私のために動作しません:sshリモート変数の割り当て?

ssh [email protected] "k=5; echo $k;" 

それだけで空行を返します。

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

注:私の質問は私のSSHセッションにローカル変数を渡す方法についてではなく、どのようにリモート変数を作成して割り当てることができます。 (かなりまっすぐ進むタスクでなければなりません?)


編集:

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

bkp=/some/path/to/backups 
ssh [email protected] "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が入力されません。 だから私の推測では、私は他のすべてをチェックしていると思うので、それは、変数の代入の問題だろうと...

+1

ヒントコマンドをローカルで試してみるか、sshサーバーにログインして試してみてください。 Bashでは、exportコマンドを使用して環境変数を設定する必要があります。 ssh [email protected] "export k = 5; echo $ k;" – Codeguy007

+0

@ Codeguy007:私は自分の問題の詳細をさらに広げました。実際に環境変数を設定しようとはしていません。単純化された問題は実際に出力をリダイレクトすることと関係があると仮定します。 – Pitt

+3

'ssh [email protected]" k = 5; echo \ $ k; "'を試してください。 '$'の前のバックスラッシュに注意して、シェルが早期に展開しないようにしてください。二重引用符の代わりに一重引用符を使用すると、同じことが達成されます。 – twalberg

答えて

12

は、この呼び出しを与えられた:

ssh [email protected] "k=5; echo $k;" 

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

ssh [email protected] "k=5; echo \$k;" 

はまた、地元の拡大を防ぐために、単一引用符の代わりに二重引用符を使用します。これを回避する

は、このようなドル記号をエスケープ。しかし、この単純な例では動作しますが、リモート側に送信されるコマンド内のいくつかの変数のローカル展開が実際に必要な場合があります。バックスラッシュエスケープはおそらくより良いルートです。

将来参照するには、シェルにset -xと入力して、トラブルシューティングのためのヘルプとして実行されている実際のコマンドをエコーすることもできます。

+0

は "set -x"コマンドの使い方を説明できますか?それはsshコマンドの一部かbashですか? – Pitt