컬링에 도움이 필요합니다

컬링에 도움이 필요합니다

다음 명령은 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을 인용하면 성공할 가능성이 더 높습니다. 특히 매개변수 중 하나가 리터럴로 나타나기 때문에 $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'"

관련 정보