在Bash脚本中将Telnet命令传递给SSH
问题描述:
我想写一个bash到第一个ssh到服务器,然后从该服务器telnet到ElastiCache Redis端点。在Bash脚本中将Telnet命令传递给SSH
我的代码如下:telnet.sh
#!/bin/bash
...
ssh -t -i $key_home [email protected]$private_ip << EOF
telnet $endpoint $_port
EOF
我想打电话给我的bash脚本,并让用户以交互方式连接到Redis的集群,使用户可以在调用后进入Redis的CLI命令telnet.sh。
上面的代码打开并连接到redis群集,但立即关闭ssh会话。有没有办法保持与Redis集群的连接并将输入重定向回用户?
谢谢!
答
不要使用heredoc覆盖stdin - 您需要它进行用户交互。相反,将脚本作为ssh的命令行参数远程运行。
#!/bin/bash
# ^^^^-- bash, not /bin/sh, to ensure that printf %q is available
# ...ksh can also be used if modified to not need printf -v.
# generate a script to run remotely
printf -v cmd 'telnet %q %q' "$endpoint" "$_port"
# run that script
ssh -t -i "$key_home" "[email protected]$private_ip" "$cmd"
使用printf %q
生成我们的变量的eval
-safe版本,确保内容是通过对telnet
命令传递完全一样,给出 - 确保即使endpoint='$(rm -rf $HOME)'
,该值是通过远程shell解释为一个常量字符串。
非常感谢Charles。这就是诀窍!也感谢您的干净解释! – ysscoding1