복붙노트

[REDIS] 레디 스와 통신 할 컬을 남용

REDIS

레디 스와 통신 할 컬을 남용

지금은 그냥 레디 스-CLI를 설치할 수있을뿐 아니라, 연결이 작동하는지 확인하기 위해 레디 스에 PING을 보내려고합니다,하지만 난 싶지 않아 및 컬이 이미있다. 그래서 그렇게 컬 남용 할 수있는 방법? 기본적으로 나는 전송이 여기에 무엇을 해제해야 :

> GET / HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:6379
> Accept: */*
> 
-ERR wrong number of arguments for 'get' command
-ERR unknown command 'User-Agent:'
-ERR unknown command 'Host:'
-ERR unknown command 'Accept:'

나는 모두 ""-A를 추가하여 사용자 에이전트를 제거 할 수 있었다, 그러나 나는 나머지 다른 아무것도 찾을 수 없습니다. 내가 그렇게 할 수있는 방법을 어떤 생각?

해결법

  1. ==============================

    1.당신은 컬을 사용하려는 경우 RESP는 webdis처럼 tinywebdis 또는 turbowebdis을 통해, 당신은 REST 필요가있다. https://github.com/markuman/tinywebdis#turbowebdis-tinywebdis--cherrywebdis 참조

    당신은 컬을 사용하려는 경우 RESP는 webdis처럼 tinywebdis 또는 turbowebdis을 통해, 당신은 REST 필요가있다. https://github.com/markuman/tinywebdis#turbowebdis-tinywebdis--cherrywebdis 참조

    $ curl -w '\n' http://127.0.0.1:8888/ping
    {"ping":"PONG"}
    

    레디 스를위한 REST 인터페이스를 사용하지 않고, 당신은 예를 들어, netcat을 사용할 수 있습니다.

    $ (printf "PING\r\n";) | nc localhost 6379 
    +PONG
    

    netcat을 사용하면 자동으로 RESP 프로토콜을 구축해야합니다. http://redis.io/topics/protocol 참조

    나는 TCP를 통해 어떤 비용으로 레디 스 인스턴스를 인쇄하는 강력한 bash는 기능을 구축했습니다

        function redis-ping() {
                # ping a redis server at any cost
                redis-cli -h $1 ping 2>/dev/null || \
                        echo $((printf "PING\r\n";) | nc $1 6379 2>/dev/null || \
                        exec 3<>/dev/tcp/$1/6379 && echo -e "PING\r\n" >&3 && head -c 7 <&3)
        }
    

    사용 레디 스 - 핑 로컬 호스트

  2. ==============================

    2.아니 컬하지만, (당신이 NC 설치하지 않은 컨테이너와 같은 뭔가 큰)는 HTTP 인터페이스 또는 NC를 필요로하지 않는다

    아니 컬하지만, (당신이 NC 설치하지 않은 컨테이너와 같은 뭔가 큰)는 HTTP 인터페이스 또는 NC를 필요로하지 않는다

    간부 3 <> / 디바이스 / TCP / / 6379 127.0.0.1 && 에코 -e "PING \ R \ n"> & 3 && 헤드-C7 <3 &

    당신에게해야

    + PONG

    이 환상적인 기사에서에 무슨 일이 일어나고 있는지에 대한 자세한 내용을보실 수 있습니다.

  3. ==============================

    3.나는 원격 시스템에서 작동하도록 얻을 @Markus에서 제공하는 NC에 잠을 추가하는 데 필요한 :

    나는 원격 시스템에서 작동하도록 얻을 @Markus에서 제공하는 NC에 잠을 추가하는 데 필요한 :

    (printf "PING\r\n"; sleep 1) | nc remote.redis.hostname 6379
    

    자세한 내용은 레디 스 파이프 라인 : 요청 / 응답 프로토콜과 RTT를 참조하십시오.

  4. ==============================

    4.@Joel B의 훌륭한 답변에 부연. 나는 아무 컬, 아니 레디 스-CLI없이 NC와, 고정 표시기 컨테이너 쉘 스크립트에서이 필요 ... 내가 테스트하고있어 레디 스 여기에서는 Kubernetes에 대한 공개 레디 스 - 하 투구 차트이다 : https://github.com/helm/charts/tree/master/stable/redis-ha

    @Joel B의 훌륭한 답변에 부연. 나는 아무 컬, 아니 레디 스-CLI없이 NC와, 고정 표시기 컨테이너 쉘 스크립트에서이 필요 ... 내가 테스트하고있어 레디 스 여기에서는 Kubernetes에 대한 공개 레디 스 - 하 투구 차트이다 : https://github.com/helm/charts/tree/master/stable/redis-ha

    세트 변수는 다음과 같습니다

    기술의 복잡성은 주석 (- 미래의 자기 - 특정 광기에서 꺾쇠 괄호를 해독하려고 할 때 난 당신이 동료를 저장하는 장소에 주석을 유지하는 것이 좋습니다)에 설명되어 있습니다

    # wait for 10 mins and check again every 15 seconds
    let n=${REDIS_STARTUP_TIMEOUT:-600}
    let m=${REDIS_STARTUP_RETRY:-15}
    ready=false
    while ((n > 0)); do
        # These scripts are the best way to check if redis is running without having access to nc, curl or redis-cli
        # They write a "PING" to the redis and sentinel ports on the hostname "dc-ecm-redis-ha"
        # and look for a "PONG+" in return.
        #
        # Detailed explanation:
        # -  3<>/dev/tcp... opens a file handle identified as #3 for input and output on the tcp host and port
        #    The host $REDIS_HOST is defined in DNS by the Kubernetes _service_, and the port is for redis or sentinel
        #    (Uses linux's low-level network-as-filesystem support. Think of it as a sort of poor-man's telnet)
        # -  "PING" followed by carriage-return is sent to the port by redirecting to the handle with >&3
        # -  The response from the port is sent to the head command with <&3
        # -  The first 5 bytes of the response are captured with -c 5. This removes the linebreak (\r) from the response
        # -  Standard shell $() around the whole thing stores the result in a variable (master or sentinel)
        # -  When Redis is NOT ready, the result is generally a failure in the exec or some other error, which goes
        #    to stderr, so we wrap it in  { } > 2>&1 to capture that error in the variable too.
        # -  Success is measured by "+PONG" being in the variable
        # -  If you set the variable DEBUG to "true" (or "TRUE" -> the {,,} lower-cases it) the failed responses are echoed
        # -  (There are easier ways to do this if you have redis-cli installed or nc, but typically you don't on a docker container)
        # -  The whole thing waits n seconds for Redis to be ready, checking every m seconds
        #
        master=$( { exec 3<>/dev/tcp/${REDIS_HOST}/6379 && echo -e "PING\r\n" >&3 && head -c 5 <&3; } 2>&1 )
        sentinel=$( { exec 3<>/dev/tcp/${REDIS_HOST}/26379 && echo -e "PING\r\n" >&3 && head -c 5 <&3; } 2>&1 )
        if [ "$sentinel" = "+PONG" -a "$master" = "+PONG" ]; then ready=true;
           break;
       else echo "$(date) : Waiting $n more seconds for Redis master and sentinel to respond to PING"
            [[ "${DEBUG,,}" = "true" ]] && echo "master response was [$master]";
            [[ "${DEBUG,,}" = "true" ]] && echo "sentinel response was [$sentinel]";
            sleep $m
            ((n-=m))
        fi
    done
    
    if [ "$ready" = true ]
        then echo "$(date) : REDIS is ready"
        # do something when Redis is ready
    else
        echo "$(date) : ERROR: REDIS is still not ready. Giving up waiting"
        # do something when Redis fails
    fi
    
  5. ==============================

    5.연결에 성공, 타입 핑 될 것입니다 경우에도 텔넷 로컬 호스트 6379 사용할 수 있습니다

    연결에 성공, 타입 핑 될 것입니다 경우에도 텔넷 로컬 호스트 6379 사용할 수 있습니다

    외출하기 위해 사용 종료

  6. from https://stackoverflow.com/questions/33243121/abuse-curl-to-communicate-with-redis by cc-by-sa and MIT license