【问题标题】:Prevent a sub-command from waiting forever for input from the user防止子命令永远等待用户输入
【发布时间】:2014-04-04 16:36:27
【问题描述】:

我正在为我们的 bash 代码编写一个简单的部署脚本。目前我有一些如下代码,可以正常工作。如果由于某种原因身份验证失败(例如密码已更改但在此脚本中未更改),则svn 命令将要求输入密码。由于这是通过自动化系统运行的,因此不会被任何人看到。

如何让svn 在身份验证失败时返回非 0 错误代码,而不是永远等待(或者只要我一直等待)输入?

代码sn-p是:

if eval "svn update --username xxxxxxx --password xxxxxxx"; then
    echo "Updated from SVN ok"
else
    echo "Update from SVN failed"
    exit 1
fi

# Do more stuff here as update was ok

显然真实的用户名/密码已被替换为 xxxxx。

如果密码错误,那么svn命令的输出如下:

Updating '.':
Authentication realm: <https://xxxxxxxxxxx:443> SVN
Username:

感谢您的帮助。

【问题讨论】:

  • 也许您可以使用expect 来编造一些东西,您可以在其中指定超时...oreilly.com/catalog/expect/chapter/ch03.html
  • 嗨,马克,听起来值得研究。我去看看...
  • eval 在这里是不必要的; if svn update ... ; then 很好。

标签: bash svn input exec eval


【解决方案1】:

我认为--non-interactive 选项可能是您正在寻找的。​​p>

来自svn help update的输出:

Global options:
  <skipped a few items here>
  --non-interactive       : do no interactive prompting

我不是 100% 确定,但听起来好像使用此选项,如果需要密码验证,svn 将失败并返回非零退出代码。

【讨论】:

  • 这看起来可能是个不错的选择。我在扫描帮助页面时错过了这一点。 +1
  • 我在查看帮助页面时也错过了这个!感谢大家的帮助,我们从@Mark Setchell 和 DigitalTrauma 那里得到了一些好主意,我相信我会在未来的应用程序中使用它们,但这必须是公认的答案,因为它是最简单、最可靠/升级证明的。谢谢。
【解决方案2】:

我认为eval 是不必要的(出于安全原因,通常不鼓励使用)。

我不太了解svn,但值得尝试--quiet--force 选项,看看它是否会阻止重新询问用户名/密码:

if svn update --force --username xxxxxxx --password xxxxxxx; then

if svn update --quiet --username xxxxxxx --password xxxxxxx; then

如果你有最新版本的 GNU coreutils(我假设你在 ),那么你可以使用 timeout 命令:

timeout 5 svn update --username xxxxxxx --password xxxxxxx
if (( $? != 124 )); then
    echo "Updated from SVN ok"
else
    echo "Update from SVN timed out after 5 seconds"
    exit 1
fi

【讨论】:

  • 谢谢。根据您的建议,我尝试了 --force--quite 选项,但不幸的是,这两种方法都没有帮助。我很感谢eval 的时间。关于超时的想法,听起来不错,但有时可能会有大的更新发生,你能在命令没有输出一段时间后超时吗?如果这有意义?
  • @LukeCousins - 明白。然后正如 Mark 建议的那样,expect 可能是你最好的选择。
  • 但是等等 - 我知道你是技术总监。您可以调用以切换到体面的版本控制,例如git,而不是笨拙的svn ;-)
  • 哈哈,我们正在考虑切换到 git,但还没有完全成功,因为我们现在有很多事情在使用它!我们也将很快使用 Phing、Capistrano 或类似产品,但这更像是一种快速解决方案,可以帮助我们渡过难关:-)
  • 感谢投票!事后看来,这是一个简陋的答案,我正要删除它,但我想它值得留给timeout 信息。
【解决方案3】:

对于缺少命令行选项的工具,您可以重定向标准输入,因此它们实际上不会尝试从(阻塞)控制台读取:

svn </dev/null update --username xxxxxxx --password xxxxxxx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 2022-01-16
    • 2013-11-24
    • 2012-02-24
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多