我想将带有命令的文本文件通过管道传输到我在 ssh 客户端上打开的 telnet 会话,这可能吗?一个例子:我有一个文本文件cmds
,其中包含如下命令
FirstFunction(A,B,C,0x9001,123456,7);
SecondFunction(A,B,C1,2,4);
ThirdFunction(A,B,C,D,E,F);
我可以复制 7 将每个命令粘贴到我在客户端 ssh shell 中打开的 telnet 会话中。我可以自动执行此操作以将每一行直接流式传输到 telnet 会话中吗?
编辑1
在我的 ssh 主机上,我打开 telnet 会话(命令必须转到的位置),如下所示telnet MyHost
编辑2
我试过:
$ ssh root@cc1 telnet MyHost < cmds
Welcome to MyHost
Trying 10.254.0.2...
Connected to MyHost.
Escape character is '^]'.
Connection closed by foreign host.
ron@jpax-build07:~/tmp$
它似乎根本没有将 cmds 文件通过管道传输到 telnet 会话中。
我也尝试过的是:
$ ssh root@cc1 cmds - | telnet MyHost
Welcome to MyHost
cat: cmds: No such file or directory
telnet: could not resolve MyHost/telnet: Name or service not known
编辑3
我安装expect
并尝试了以下操作:
#!/usr/bin/expect
spawn ssh root@ccTest telnet -l MyHost
#expect Password:
#send "mypassword\r"
expect {-> }
send "some_cmd(20)\r"
expect {$ }
send "exit\r"
expect eof
但这就是我得到的:
$ ./jpax_txcmd.sh
spawn ssh root@ccTest telnet -l MyHost
bad flag "-> ": must be -glob, -regexp, -exact, -notransfer, -nocase, -i, -indices, -iread, -timestamp, -timeout, -nobrace, or --
while executing
"expect {-> }"
(file "./jpax_txcmd.sh" line 5)
$
答案1
telnet 的问题是,一旦它读取到文件结尾,它将关闭连接,并且您将看不到任何输出。一个简单的技巧是让输入保持打开状态一段额外的时间,例如:
(cat cmds; sleep 15) | ssh root@cc1 telnet MyHost
显然,这不是一个可靠的解决方案,因此您应该使用能够检测遥控器何时完成的东西,例如expect
。以下示例 Expect 脚本实现了典型的 telnet over ssh 对话,其中涉及使用myusername
密码登录mypassword
并将命令发送ls -l
到$<space>
shell 提示符:
#!/usr/bin/expect
spawn ssh root@cc1 telnet -l myusername myhost
expect Password:
send "mypassword\r"
expect {$ }
send "ls -l\r"
expect {$ }
send "exit\r"
expect eof