Шестнадцатеричные ключи сценария оболочки Redis

Создал задание cron, которое удаляет определенные ключи в Redis.

Пример ключа: \xac\xed\x00\x05t\x00\x15test

При использовании bash и redis-cli кажется, что ключи с HEX-значениями не могут быть правильно проанализированы и удалены:

Code below:


 host=${1:-}
port=${2:-6379}
database=${3:-0}
pattern=${4:-"Test"}

cursor=-1
keys=""

echo "Starting to delete"
while [ $cursor -ne 0 ]; do
  if [ $cursor -eq -1 ]
  then
    cursor=0
  fi

  reply=`redis-cli -h $host -p $port SCAN $cursor MATCH $pattern`
  cursor=`expr "$reply" : '\([0-9]*[0-9 ]\)'`
  keys=${reply##[0-9]*[0-9 ]}
  echo "$keys"
  redis-cli -h $host -p $port DEL $keys
done

person DarkMakukudo    schedule 04.11.2020    source источник
comment
Попробуйте заменить "$pattern" на $(printf "$pattern")   -  person Mark Setchell    schedule 04.11.2020
comment
Я бы предложил вам использовать закодированные данные вместо двоичных данных в качестве ключа.   -  person sonus21    schedule 04.11.2020
comment
@MarkSetchell, к сожалению, это не сработало   -  person DarkMakukudo    schedule 05.11.2020
comment
Я думаю, что нуль (\ x00) является проблемой, поскольку bash использует строки с нулевым завершением в стиле C.   -  person Mark Setchell    schedule 05.11.2020
comment
@MarkSetchell да. вместо этого я переключился на python, поэтому у меня есть контроль над декодированием. Это сработало сейчас   -  person DarkMakukudo    schedule 05.11.2020
comment
Круто, молодец. Вы можете написать его и принять свой ответ, если хотите???? Удачи с вашим проектом.   -  person Mark Setchell    schedule 05.11.2020


Ответы (1)


Переключил клиент на удаление ключей. Написал небольшой скрипт на питоне.

#!/usr/bin/env python3

import redis

redis_host = "localhost"
redis_port = 6379
redis_password = ""


def hello_redis():
    """Example Hello Redis Program"""
    print("Start of script")
    # step 3: create the Redis Connection object
    try:
        r = redis.StrictRedis(host=redis_host, port=redis_port, password=redis_password)
 
        for key in r.scan_iter("*key*"):
            print(key)
            r.delete(key)    
   
    except Exception as e:
        print(e)

    print("Terminating script")
if __name__ == '__main__':
    hello_redis()
person DarkMakukudo    schedule 05.11.2020