Подключение к удаленному Memcached из Python через сокет - PullRequest
0 голосов
/ 03 мая 2019

Мне нужен доступ к Memcached на удаленном сервере из локальной программы Python, чтобы я мог выполнять операции set / get.Соединение должно быть сделано через SSH, в то время как доступ к самой Memcache осуществляется через сокет (/var/run/memcached/memcached.sock).

По сути, я выбрал два варианта:

  1. Наиболее удобный вариант - использовать библиотеку, такую ​​как «memcache», с такими методами, как «set» и «get».

    import memcache
    mc = memcache.Client(['127.0.0.1:11211'], debug=0)
    
    mc.set("some_key", "Some value")
    value = mc.get("some_key")
    

Проблема здесь в том, что строка подключения для клиента,Могу ли я использовать какую-либо строку или опцию соединения SSH, например,

mc = memcache.Client(['123.321.123.321:/var/run/memcached/memcached.sock'], ssh_key="~/.ssh/mykey.pem", debug=0)

Не могу найти ничего подобного для "memcache", как и для любой другой библиотеки.

Используйте netcat.

Мне удалось получить некоторые данные, заданные ранее другой службой (не написанные на Python), таким образом:

import sys, paramiko, getpass

user = "ubuntu" 
key_file = "/Users/my_user/.ssh/my_key.pem" 
name = "123.321.123.321" 
command = "echo 'get my_data_123' | nc -U 
/var/run/memcached/memcached.sock" 

ssh = paramiko.SSHClient() 

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname = name, username = user, key_filename = 
 key_file) 

ssh.invoke_shell()
stdin, stdout, stderr = ssh.exec_command (command)
print(stdout.read())

, поэтому можно сделать вывод, что соединение и Memcached работают,Тем не менее, мне еще не удалось сделать правильную команду «set».Я попытался:

echo 'set mykey123 0 50 15 my_data' | nc -U /var/run/memcached/memcached.sock

... и много разных вариантов, таких как:

echo -e 'set mykey321 0 200 20\r\nmy_data\r' | nc -U /var/run/memcached/memcached.sock

Не удалось установить какие-либо данные, не было получено ни ответа, ни какого-либо ответа об ошибке,например,

CLIENT_ERROR bad command line format

или просто

ERROR

Я что-то упустил (возможно, так как документации по этому вопросу немного), или, возможно, это невозможно по какой-то другой причине?

...