bash スクリプトで別の変数を使用する変数を設定しようとしています。
echo "Enter server IP:"
read serverIP
ssh="ssh $serverIP"
$ssh cp ...
$ssh mv ...
$ssh rm ...
ただし、これは機能しません。この場合の正しい構文は何ですか?
bash スクリプトで別の変数を使用する変数を設定しようとしています。
echo "Enter server IP:"
read serverIP
ssh="ssh $serverIP"
$ssh cp ...
$ssh mv ...
$ssh rm ...
ただし、これは機能しません。この場合の正しい構文は何ですか?
あなたが使用することができます
SERVER_IP="127.0.0.1"
alias ssh="ssh $SERVER_IP"
そして、あなたは行ってもいいです
SSH 経由でリモート コマンドを実行する場合、唯一の安全な方法は、配列とパラメーターのエスケープを使用することです。
まず、コマンド、オプション、フラグ、パラメータなどを格納するために 1 つの配列を使用します。例:
remote_cmd=(touch -- "path with spaces")
echo "${remote_cmd[2]}" # path with spaces
SSH 経由で実行するには、これらの各引数をエスケープする必要があります。
for arg in "${remote_cmd[@]}"
do
remote_cmd_escaped+=("$(printf %q "$arg")")
done
echo "${remote_cmd_escaped[2]}" # path\ with\ spaces
次に、SSH コマンド自体に別の配列を使用する必要があります。
ssh_cmd=(ssh "localhost" "${remote_cmd_escaped[@]}")
これで問題なく実行できます:
"${ssh_cmd[@]}"
ファイルがスペースで作成されたことを確認します。
ls "$HOME/path with spaces"
成功!
試す
eval $ssh cp ...
serverIP と ssh の設定が値の参照に問題があるとは思いません。
Eval は、シェルからシステムへのコマンドの最終送信を延期し、別のパスを許可します。最初のパスで$ssh
展開され、2 番目と最後の (eval) パスで、シェルは $ssh が実際に意味することを確認できますssh 10.10.10.10
(たとえば)。
Eval は悪と見なされます。ユーザーが serverIP 変数を介して正しい sytnax を送信できる可能性があります/bin/rm -rf /*
。ので、使い方には気をつけてください。
最後のトリビアです。1 つの行で 1 つ以上の eval パスを使用することは可能ですが、ほとんどすべての実用的な方法ではありませんeval eval eval... \$${ssh} ....
。
これが役立つことを願っています。