Мне нужен telnet-клиент, который может принимать команды из файла или стандартного ввода, чтобы я мог выполнять быстрый и грязный автоматический мониторинг memcached. Я думал, что для этого подойдет plink, но, похоже, он делает что-то сверх того, что мне нужно:
Если я подключусь к localhost 11211 и напишу stats
, Я получаю статистику memcached, например:
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 25099
STAT uptime 91182
STAT time 1349191864
STAT version 1.4.5
STAT pointer_size 64
STAT rusage_user 3.570000
STAT rusage_system 2.740000
STAT curr_connections 5
STAT total_connections 23
STAT connection_structures 11
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 82184
STAT bytes_written 7210
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT evictions 0
STAT reclaimed 0
END
Но с plink я получаю странную ошибку. Я использую эту команду:
watch -n 30 plink -v -telnet -P 11211 127.0.0.1 <<< $'\nstats'
В первый раз я получаю:
Looking up host "127.0.0.1"
Connecting to 127.0.0.1 port 11211
client: WILL NAWS
client: WILL TSPEED
client: WILL TTYPE
client: WILL NEW_ENVIRON
client: DO ECHO
client: WILL SGA
client: DO SGA
ERROR
STAT pid 25099
STAT uptime 91245
STAT time 1349191927
STAT version 1.4.5
…
END
Но когда часы повторяют команду, я просто получаю:
Looking up host "127.0.0.1"
Connecting to 127.0.0.1 port 11211
client: WILL NAWS
client: WILL TSPEED
client: WILL TTYPE
client: WILL NEW_ENVIRON
client: DO ECHO
client: WILL SGA
client: DO SGA
Failed to connect to 127.0.0.1: Connection reset by peer
Connection reset by peer
FATAL ERROR: Connection reset by peer
Чем здесь plink отличается от обычного telnet? Как мне к этому поступить? (Я не женат на plink, но мне нужен способ непрерывно отправлять простые команды telnet в memcached без написания полноценного сценария perl.)
Зачем использовать plink
для запросов telnet? В watch
утилита выполнит любую заданную команду с sh -c <command>
, чтобы вы могли напрямую ввести свой telnet-запрос.
watch -n 30 '(echo "stats"; sleep 1; echo "quit") | telnet localhost 11211'
Что можно было бы интерпретировать как sh -c '(echo "stats"; sleep 1; echo "quit") | telnet localhost 11211'
каждые 30 секунд
Кажется watch
имеет проблемы с побегом $'\nstats'
. Пожалуй, самое простое решение с plink
заключается в том, чтобы заключить всю команду в кавычки. У меня работают следующие комбинации:
watch -n 30 "plink -v -telnet -P 11211 127.0.0.1 <<< $'\nstats'"
watch -n 30 '(echo ; echo "stats") | plink -v -telnet -P 11211 127.0.0.1'
watch -n 30 'echo -e "\nstats" | plink -v -telnet -P 11211 127.0.0.1'
Чем здесь plink отличается от обычного telnet?
Первая команда, отданная memcached всегда приводит к ошибке.
bash ~> plink -v -telnet -P 11211 127.0.0.1
plink > Looking up host "127.0.0.1"
plink > Connecting to 127.0.0.1 port 11211
plink > client: WILL NAWS
plink > client: WILL TSPEED
plink > client: WILL TTYPE
plink > client: WILL NEW_ENVIRON
plink > client: DO ECHO
plink > client: WILL SGA
plink > client: DO SGA
memcached < stats
memcached > ERROR
Я полагаю, что это результат plink
выдача дополнительного символа во время соединения или что-то, что сбивает Memcached протокол. Не могу понять, почему, но похоже, что это соответствует telnet-соединениям putty. Вы можете удалить ERROR
переключившись на Plink's -raw
протокол, но вам нужно добавить полные разрывы строк и тихие команды
watch -n 30 "plink -v -raw -P 11211 127.0.0.1 <<< $'stats\r\nquit\r\n'"
Больше работы, но на выходе получше.