次のコマンドは、Windowsデスクトップで実行すると正しく実行されますが、Linuxサーバーで実行するとリソースが見つかりません。
Windowsでは、これが機能することを提案した方法です。
curl -H "Content-Type:application/json" -H "Accept:application/json" -u username:password -X GET http://10.188.102.94:23450/ConfigurationManager/v1/views/lun-paths?$query=ldev.storageDeviceId%20eq%20'00000060489'
Quote以前にhttpでこの方法を試しましたが、UNIXシェルではまだ失敗します。
curl -H "Content-Type:application/json" -H "Accept:application/json" -u username:password 'http://10.188.102.94:23450/ConfigurationManager/v1/views/lun-paths?$query=ldev.storageDeviceId%20eq%20%27900000060489'
ここでは、次のエラーを返します。
{
"errorSource" : "/ConfigurationManager/v1/views/lun-paths?=hostGroup.storageDeviceId%20eq%20900000060489",
"message" : "Resource information could not be obtained.",
"cause" : "The specified storage system is invalid.",
"solution" : "Check and, if necessary, revise the query parameter to obtain information about the storage system."
}
答え1
最新の編集は、最終的にWindowsシステムで正常に実行されていることを示しています。
curl -H "Content-Type:application/json" -H "Accept:application/json" -u username:password -X GET http://10.188.102.94:23450/ConfigurationManager/v1/views/lun-paths?$query=ldev.storageDeviceId%20eq%20'00000060489'
Windows CMDとUNIX / Linuxシェルの引用規則はまったく異なることに注意してください。 URLを引用すると、成功する可能性が高くなります。特に、パラメータの1つがリテラルとして表示されるため、$query
そうでない場合は、UNIX / Linuxシェルで拡張する変数として解釈されます。
Windowsの推奨ルールを確認するには、Windows CMDウィンドウでコマンドを実行し、ターゲットIPアドレスを10.188.102.94から私のLinuxサーバー( "linuxServer")のIPアドレスに変更し、そこから実行してnc -l 23450
着信ポートを作成しました。要件。
# Linux Server
nc -vvv -l 23450
Listening on linuxServer 23450
# Windows PC
curl -H "Content-Type:application/json" -H "Accept:application/json" -u username:password -X GET http://linuxServer:23450/ConfigurationManager/v1/views/lun-paths?$query=ldev.storageDeviceId%20eq%20'00000060489'
Linuxサーバーから受信した出力(HTTP要求):
Connection received on linuxServer 13252
GET /ConfigurationManager/v1/views/lun-paths?$query=ldev.storageDeviceId%20eq%20'00000060489' HTTP/1.1
Host: linuxServer:23450
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
User-Agent: curl/7.83.1
Content-Type:application/json
URLパスに一重引用符が含まれていることは明らかです。それは明らかですRFC 3986これらの文字は許可されるため、一般的ではありませんが、許可されます。これは、シェルで処理されないように二重引用符で囲む必要があることを意味します。ただし、テキストを$query
二重引用符で囲むことはできません。それ以外の場合はシェル変数として扱われるからです。ここでは、URLの最初の部分に一重引用符を選択し、中間に二重引用符を使用するように切り替えます(単一の'abc'"def"
文字列として処理abcdef
)。
curl -H "Content-Type:application/json" -H "Accept:application/json" -u username:password 'http://linuxServer:23450/ConfigurationManager/v1/views/lun-paths?$query=ldev.storageDeviceId%20eq%20'"'00000060489'"
Linuxサーバーから受信した出力(HTTP要求):
Connection received on linuxServer 13993
GET /ConfigurationManager/v1/views/lun-paths?$query=ldev.storageDeviceId%20eq%20'00000060489' HTTP/1.1
Host: linuxServer:23450
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
User-Agent: curl/7.83.1
Content-Type:application/json
同じので、要件を満たしています。 IPアドレスを実際のIPアドレスに置き換えると、次の解決策が完成します。
curl -H "Content-Type:application/json" -H "Accept:application/json" -u username:password 'http://10.188.102.94:23450/ConfigurationManager/v1/views/lun-paths?$query=ldev.storageDeviceId%20eq%20'"'00000060489'"