2017-03-02 99 views
0

我想写一个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集群的连接并将输入重定向回用户?

谢谢!

回答

2

不要使用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解释为一个常量字符串。

+0

非常感谢Charles。这就是诀窍!也感谢您的干净解释! – ysscoding1

相关问题