【问题标题】:How to enter a string automatically when a command results in a prompt?当命令导致提示时如何自动输入字符串?
【发布时间】:2016-01-20 17:58:50
【问题描述】:

我想使用脚本从 git 下载源代码。

以下git 命令会导致提示:

git clone ssh://url.com/repo.git git_test3
Cloning into 'git_test3'...
The authenticity of host 'url.com (1.1.1.1)' can't be established.
ECDSA key fingerprint is .
Are you sure you want to continue connecting (yes/no)? 

为了让脚本自动输入“是”,我开发了以下脚本:

#!/bin/sh
git_clone() {
    git clone ssh://url.com/repo.git test <<EOF > /dev/null
yes
EOF
}

git_clone

但它不起作用。该脚本始终会导致提示(yes/no)。

我错过了什么?

【问题讨论】:

  • 您可以使用expect 脚本做您想做的事。见expect.sourceforge.net
  • 试试 yes 命令,它可能会起作用。试试这个,yes yes | git clone ssh://url.com/repo.git test,参考stackoverflow.com/questions/8416887/…
  • @ishaan 这只是向git 的标准输入提供重复文本的另一种方式,这是 OP 已经在做的事情。问题是不是git要求响应,而是ssh,而ssh不是从标准输入读取,而是直接从终端读取。
  • 啊,今天学到了新东西。之前已经回答了类似的问题,也许OP可以在那里看看并找到问题的解决方案,参考:serverfault.com/questions/447028/…

标签: linux git bash shell


【解决方案1】:

该消息(和交互)来自 ssh 命令,而不是 git 本身。 (这间接很有用,因为如果您的目标只是避免交互,这意味着您知道要针对哪个命令:您只需要告诉 ssh 您实际上并不关心验证其他主机,或者使用诸如 @ 之类的协议987654322@ 而不是ssh://...。)

如果您真的想自己处理交互,则需要打开一个 pty(可能通过期望,如 Wolf noted in a comment)。原因是 ssh 打开/dev/tty 以强制与用户交互,而不是从任何管道或文件重定向中读取。因此,您必须为其提供一个受您自己的程序控制的控制终端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2014-09-07
    • 2019-01-03
    • 2018-11-25
    相关资源
    最近更新 更多