
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