ssh コマンド内で割り当てられた変数が適切な値を返さない

ssh コマンド内で割り当てられた変数が適切な値を返さない

sshスクリプトの一部で以下のコマンドを実行しています。このコマンドはls、オプションからファイル サイズを切り取り、それを変数に格納することを目的としています。次に、変数を出力します。

echo "Enter srouce file";
read src_file;
src_size =`ls -latr $src_file | awk  '{ print $5 }' `;
echo "The source file size is $src_size ";

これはコマンドラインで実行すると正常に動作します。

スクリプト内で同じコマンドを実行すると、次のようになりますssh

ssh user@server "echo "enterfile";read src_file;echo "enter path ";read path;cd $path;src_size=`ls -latr $src_file | awk  '{ print $5 }' ` ; echo The source file size is $src_size;"

これは失敗します。ローカルの一時値を保存し、正しいファイル サイズではなく同じ値を返します。

答え1

引用符の問題でコマンドが混乱するのを避けるためにスクリプトを使用します。

よりクリーンで、管理しやすく、見た目も良くなりました :)!

例えば、次のようにします:

echo "Enter source file"
read src_file
ssh user@server 'bash -s' < /path/to/local_script.sh "$src_file"

の内容local_script.sh

#!/bin/bash
src_file="$1"
src_size =`ls -latr $src_file | awk  '{ print $5 }'`
echo "The source file size is $src_size "

パスを追加することを忘れないでくださいlocal_script.sh:)

答え2

エスケープ処理を行わずに二重引用符を他の二重引用符内にネストすることはできません。また、二重引用符内にバックティックを入れると、リモートではなくローカル マシンで評価されます。

次のようなものが、あなたが達成しようとしていることを実現するはずです:

ssh user@server 'echo "Enter file: "; read src_file; echo "Enter path: "; read path; cd $path; src_size=`ls -latr $src_file | awk  "{ print \$5 }"`; echo "The source file size is $src_size;"'

'{ print $5 }'を に変更してを"{ print \$5 }"エスケープする必要があることに注意してください。これは、 が単一引用符ではなく二重引用符で囲まれているためであり、 がシェルによって解釈されることを$望まないためです。$5

関連情報