私はbashスクリプトを作成しており、ホスト名、コマンド、およびファイルという3つのパラメータを使用する関数があります。そのホスト名からコマンドを実行し、出力をファイル名にリダイレクトする必要があります。機能は次のとおりです。
execmd ()
{
P_SERV="$1"
P_CMD="$2"
P_OUT="$3"
X_SERV=`hostname`
if [ "$P_SERV" = "$X_SERV" ] ; then
$P_CMD >> $P_OUT
else
ssh $P_SERV $P_CMD >> $P_OUT
fi
}
私が実行したとき:
execmd venus "cat /proc/meminfo" /tmp/meminfo
エラーが発生しました。
cat /proc/meminfo: no such file or directory
なぜ動作しないのかご存知ですか?ローカルホスト名またはリモートホスト名を使用して呼び出すときの動作は同じです。
答え1
SSHはリモートシェルを実行します。ローカル実行と一貫した動作を得るには、ローカルシェルを実行してください。
if [ "$P_SERV" = "$X_SERV" ] ; then
sh -c "$P_CMD" >> "$P_OUT"
else
ssh "$P_SERV" "$P_CMD" >> "$P_OUT"
fi
忘れないで代替項目を二重引用符で囲みます。。たとえば、二重引用符なしでP_CMD
ワイルドカードを含めると、に含まれますssh $P_SERV $P_CMD
。