在 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的主要内容,如果未能解决你的问题,请参考以下文章

在bash中将包含空格的变量传递给命令[重复]

如何在Python中将变量传递给bash命令

在BASH中将日期作为STDIN传递给ruby函数[关闭]

在网络服务器上编写 telnet 脚本

通过 Bash 脚本通过 Telnet 发送命令

Makefile将变量传递给bash脚本