在bash脚本中模拟ENTER键


97

我创建了一个非常简单的bash脚本,该脚本运行一些命令。这些命令之一在运行时需要用户输入。即,它询问用户“您想等等吗?”,我只想向其发送回车按键,以便脚本将完全自动化。

我不必在运行时等待输入或其他任何东西,它足以发送按键,输入缓冲区将处理其余的内容。


1
如果您要尝试使之自动化的工具是apt-get,则正确的解决方案是在debconf数据库中使用您的首选值;否则,请执行以下步骤:那它不会问你的
三胞胎

您可以使用printf而不是echo:printf“ hello \ n”
hassanzadeh.sd

Answers:


133
echo -ne '\n' | <yourfinecommandhere>

或利用echo生成的隐式换行符(感谢Marcin)

echo | <yourfinecommandhere>

现在我们可以简单地使用以下--sk选项:

--sk--skip-keypress请勿在每次测试后等待按键

sudo rkhunter --sk --checkall


1
如果您将此输出提供给xxd5c6e,则将得到十六进制,即字面量\n。如果这样做的echo | xxd 话,实际上最终会变成十六进制的0a。因此,我猜想使用您的程序需要的任何东西。
Marcin

3
@Marcin,令我惊讶的是,我得到0a0a的仍然不是预期的,添加了一个-n隐式换行符。但是,您当然是对的,echo | ...在这里简单可用。会更新我的答案。
Tilman Vogel,

呵呵,这对我来说似乎不太正确,因此我不得不通过xxd对其进行处理。到目前为止,这是查看命令输出的最简单但有效的方法。必须爱愚蠢的Unix技巧。
Marcin

@Marcin,还是,你为什么得到5c6e?您是否省略了,-e或者您的外壳echo是否选择了该选项?
Tilman Vogel

我得到: echo -ne "\n" | xxd 0000000: 0aecho -n "\n" | xxd 0000000: 5c6eecho "\n" | xxd 0000000: 5c6e 0a 我还没有看到单引号和双引号之间的任何差别。我的shell只是常规的bash,是否有可以调节这种基本功能行为的设置?
Marcin

43

您可能会发现该yes命令很有用。

看到 man yes


56
yes我确实发现它很有用。
Pureferret 2012年

2
这模拟反复按“ y”而不是Enter键。虽然这可能是您想要的是/否的问题,但对于不期望“ y”的任何内容都将无效。
Burhan Ali

5
@BurhanAli:您可以更改yes发送为输出的内容。阅读手册页。
siride

1
我可以为需要默认值[value] {enter}的脚本发送多次

这仅适用于yum之类的东西。该字符串在哪里。
einarc


22

这是使用示例expect

#!/usr/bin/expect
set timeout 360
spawn my_command # Replace with your command.
expect "Do you want to continue?" { send "\r" }

检查:man expect以获取更多信息。


如果需要发送多个Enter键,则特别有用
Andy

这是最好的方法,特别是对于类似phars之类的东西,它们发送了不同的stdout和stdin字符串。
einarc

另外请记住,如果有参数,只需输入my_command arg。
einarc

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.