在 Bash 脚本中将 Telnet 命令传递给 SSH

Pass Telnet Command to SSH in Bash Script

我正在尝试编写 bash 以首先通过 ssh 连接到服务器,然后从该服务器通过 telnet 连接到 ElastiCache Redis 端点。

我的代码如下:telnet.sh

#!/bin/bash
...
ssh -t -i $key_home ec2-user@$private_ip << EOF 
        telnet $endpoint $_port
    EOF

我想调用我的 bash 脚本并让用户以交互方式连接到 Redis 集群,以便用户可以在调用 telnet.sh 后输入 redis cli 命令。

以上代码打开并连接到 redis 集群,但立即关闭 ssh 会话。有没有办法保持与 Redis 集群的连接并将输入直接返回给用户?

谢谢!

不要用 heredoc 覆盖标准输入——用户交互需要它。相反,将您的脚本作为 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" "ec2-user@$private_ip" "$cmd"

使用 printf %q 生成我们变量的 eval 安全版本确保内容完全按照给定的方式传递给 telnet 命令——确保即使 endpoint='$(rm -rf $HOME)',该值被远程 shell 解释为常量字符串。