【发布时间】:2016-08-30 20:37:46
【问题描述】:
我有一系列 bash 命令,其中一些带有交互式提示,我需要在远程机器上运行。对于不同的场景,我必须按特定顺序调用它们,所以我一直在尝试制作一个 bash 脚本来为我自动执行该过程。但是,似乎所有使用 bash 脚本启动 ssh 会话的方法都会导致 stdin 重定向到最初用于启动脚本的任何字符串或文件。
有没有一种方法可以指定某个脚本在远程机器上执行,同时也可以将stdin 到ssh 转发到本地机器以使用户能够与任何提示进行交互?
这是我必须阐明我正在尝试做什么的要求列表。
- 在远程机器上运行脚本。
- 在远程脚本中间的某处是提示输入的命令。示例:
git commit将显示vim。- 如果该命令是
git commit并显示vim,则用户应该能够与vim交互,就好像它在他们的计算机上本地运行一样。 - 如果该命令提示输入
[y/n]响应,则用户应该能够输入他们的答案。
- 如果该命令是
- 在用户输入必要信息后(通过退出
vim或在提示符下按回车键),脚本应继续正常运行。 - 然后我的脚本将终止 ssh 会话。最终结果是为用户执行了命令,而他们无需知道它是通过远程连接进行的。
我一直在使用我想在远程机器上运行的以下脚本测试各种不同的方法。
#!/bin/bash
echo hello
vim
echo goodbye
exit
用户能够使用vim 至关重要,然后,当用户完成时,应在屏幕上打印“再见”并终止远程会话。
我尝试将临时脚本上传到远程计算机,然后运行ssh user@host bash /tmp/myScript,但这似乎也完全接管了stdin,从而无法让用户响应用户输入的提示。我尝试添加 -t 和 -T 选项(我不确定它们是否不同),但我仍然得到相同的结果。
一位评论者提到使用expect、spawn 和interact,但我不知道如何结合使用这些工具来获得我想要的行为。似乎interact 将导致用户获得对stdin 的控制权,但是一旦用户退出vim 以让我的脚本继续执行,就无法放弃它。
我想要的行为是否可能?
【问题讨论】:
-
@anishsane 是的,我使用该标志通过带有heredoc 的
ssh发送命令,但这完全接管了标准输入,并且不允许我与出现的任何提示进行交互稍后在执行中。vim对此特别不满意——没有占据整个屏幕并拒绝所有输入。我可以在键盘出现时用键盘输入,但这只会导致屏幕顶部出现随机转义码,根本不会影响 vim 实例。 -
如果你重定向
stdin,你期望它是怎样交互的? -
是的,这正是问题所在。如何在不重定向
stdin的情况下做到这一点? -
要么使用
expect到spawn ssh并在命令之间使用interact,要么创建一个长字符串并使用ssh user@host command args语法或将heredoc 内容scp 到远程系统并从那里执行文件... -
ssh -t user@host bash /tmp/myscr?