【发布时间】:2018-05-01 01:42:43
【问题描述】:
我正在编写一个 Bash 脚本来跨多个服务器自动执行任务。
我正在通过 SSH 登录到 Centos 7 机器以运行一些编辑器(nano、vi、...)
ssh -tt centos@... '/bb/Conf edit'
/bb/Conf edit 基本上就是vi /bb/conf.yaml。
当我从我的 shell 运行 SSH 命令时,它运行良好。但是,当从 while read ...; do 循环内的 Bash 脚本运行相同的 SSH 命令时,编辑器的大小错误(我猜是 80x40)并且似乎忽略了我按下的键 - 即在 nano 中,Ctrl+x 没有不做任何事。唯一有效的键是 Ctrl+c 关闭连接。
我认为这与TERM 变量有关,根据this,所以我尝试将export TERM=xterm 或TERM=rxvt 添加到/bb/Conf 或调用SSH 的地方。该变量实际上是在目标环境中设置的(我在vi 之前尝试过echo $TERM)。但是终端仍然行为不端。
然后我尝试将单个命令 ssh ... 放到一个新脚本中。运行时,编辑器运行良好。
过了一会儿,我发现它在while read 循环之外有效,但在循环内部无效。我假设编辑器做了一些 stdin/stdout 魔术,然后 read 以某种方式打破了它。
有没有办法在循环中运行像 vi 或 nano 这样的编辑器?
(我的目的是允许用户在多个服务器上编辑文件。)
【问题讨论】:
-
事实证明,它以某种方式被
while read HOST_; do破坏了,ssh在里面。我会重写问题。