在 Bash 脚本中将 Telnet 命令传递给 SSH
Posted
技术标签:
【中文标题】在 Bash 脚本中将 Telnet 命令传递给 SSH【英文标题】:Pass Telnet Command to SSH in Bash Script 【发布时间】:2017-07-22 20:29:54 【问题描述】:我正在尝试编写 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 集群的连接并将输入直接返回给用户?
谢谢!
【问题讨论】:
【参考方案1】:不要用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" "ec2-user@$private_ip" "$cmd"
使用printf %q
生成变量的eval
安全版本可确保内容完全按照给定的方式传递给telnet
命令——确保即使endpoint='$(rm -rf $HOME)'
,该值也被解释为远程 shell 作为常量字符串。
【讨论】:
非常感谢查尔斯。那成功了!也感谢您的清晰解释!以上是关于在 Bash 脚本中将 Telnet 命令传递给 SSH的主要内容,如果未能解决你的问题,请参考以下文章