我需要一个可以从文件或 stdin 中获取命令的 telnet 客户端,这样我就可以快速自动监控 memcached。我以为 plink 可以胜任这项工作,但它似乎做了一些超出我需求的事情:
如果我通过 telnet 进入 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
但是当 watch 重复命令时我只得到:
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,但我需要一种方法来连续向 memcached 发送简单的 telnet 命令,而无需编写完整的 perl 脚本。)
答案1
为什么使用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协议。想不出为什么,但它似乎与 putty 的 telnet 连接一致。您可以ERROR
通过切换到 plink 的-raw
协议来删除,但您需要添加完整的换行符和安静命令
watch -n 30 "plink -v -raw -P 11211 127.0.0.1 <<< $'stats\r\nquit\r\n'"
工作量更大,但输出更漂亮。