2017-03-02 126 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