0

bash スクリプトで別の変数を使用する変数を設定しようとしています。

echo "Enter server IP:"
read serverIP

ssh="ssh $serverIP"

$ssh cp ...
$ssh mv ...
$ssh rm ...

ただし、これは機能しません。この場合の正しい構文は何ですか?

4

3 に答える 3

1

あなたが使用することができます

SERVER_IP="127.0.0.1"
alias ssh="ssh $SERVER_IP"

そして、あなたは行ってもいいです

于 2012-05-24T03:37:34.780 に答える
1

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"

成功!

于 2012-05-24T12:23:35.657 に答える
0

試す

 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} ....

これが役立つことを願っています。

于 2012-05-24T03:32:36.793 に答える