引用:SSHアカウントの繰り返し、リモートサーバーからpsqlを呼び出す

引用:SSHアカウントの繰り返し、リモートサーバーからpsqlを呼び出す

これは人間の心で動作しますが、シェルは引用を無視します。

for h in a b; do ssh $h psql -tAc "select * from mytab where mycol='x'"; done

読みやすさを失うことなくこの行をどのように引用できますか?

答え1

引用符をエスケープする必要があります。パッケージ配信ゲームのパッケージレイヤーと考えてください。各シェルは「レイヤー」を開きます。

だから:

echo "this ; is a semicolon"

ただし、SSH経由で実行するには、次の手順を実行します。

ssh $user@$host echo "this ; is a semicolon"

これSSHパッケージの最初のレイヤーが開きます - 転送:

echo this ; is a semicolon

これはセミコロンがシェルによって解釈されるので中断されます。

したがって、これを行うには、最初に引用符をエスケープする必要があり、sshが1つのレイヤーを安全に「ロック解除」することができます。

ssh $user@$host echo "\"this ; is a semicolon\""

したがって、sshは「外部」と「エスケープレイヤー」を削除し、次のものを渡します。

echo "this ; is a semicolon"

これはライナーの1つに対して実行する必要があります。読みやすさを失わないことについては、エスケープや引用の入れ子が必然的に汚れているので、言葉のように簡単ではありません。

私が提供できる最善の方法は、変数を使用してSQL文をラップすることです。これにより、少なくとも「ラップされたドア」を送信することが明らかになります。

THING_TO_ECHO='"this ; is a semicolon"'; ssh $user@host echo $THING_TO_ECHO

関連情報