如果失败的脚本预计输入或输入密码(Fail if a script expects input or

2019-09-18 13:21发布

我开发了一个脚本,应该不需要与用户进行交互,如果我的脚本中某个程序需要用户输入的东西,脚本应该会失败,并立即退出。

我已经关闭了STDIN在我的脚本的顶部,这个工程的一些命令,但也有一些期待在另一个文件中描述符(通常是那些要求一样的密码输入gitsudo )。

目前我的脚本是:

#!/bin/bash

# close STDIN
exec 0<&-

# test that $1 exists and it is a valid folder containing a git repository
# ...

cd "$1"

git fetch
# if git is not correctly configured, it asks for a password and
# my script waits for it :(

那么,如何避免这种情况?

注:我不问如何做一个密码的配置在gitsudowhatever ,但要防止一个程序bash (或sh )期待用户输入并立即失败,如果是这样的话。

Answer 1:

而不是试图关闭标准输入或标准错误,你可能会更好只用很短的期望脚本,捞出如果看到一个密码提示。 例如:

#!/bin/bash

cd "$1"

expect -c '
    log_user 0
    spawn git fetch
    expect -timeout 30 -re "ass(phrase|word)" { exit 1 }
    '

# Do something based on the exit status of the expect script.
[[ $? -eq 1 ]] && { echo 'Password prompt detected!' >&2; exit 1; }

该expect脚本将退出状态返回1,如果它看到一个密码或者密钥密码提示。 在bash脚本是那么自由地做同样的,或采取其他行动。

希望帮助!



Answer 2:

首先让我说,我不认为这是接近你的问题的正确方法。 在所有。 必须有一个更好的应用,具体的解决方案,你真的应该找到它。

主要的问题是,不知道什么节目要“强制关闭”你会不知道如何使他们“错误了”。 如果你知道这些程序,CodeGnome的解决方案似乎罚款。

另外请注意,并非所有的程序从STDIN直接读取输入。 例如,Python的getpass模块的直接开辟了一个额外的文件描述符/dev/tty ,所以关闭或重定向STDIN无所谓。 这也是如何sudo接受密码,我相信这是ncurses的是如何工作的,以及。 以这种方式阅读可以让你得到屏幕上显示没有他们的密码。

对于不直接从阅读提示/dev/tty (如bash的read )简单地从标准输入重定向/dev/null (如./prompt.sh </dev/null )可能会得到你的地方。 或者,你可以做你正在做什么和关闭STDIN, 但该程序时遇到一个封闭的STDIN或重定向一个只由正交函数的是你无法控制的行为方式。 我们希望,该计划将报错了,如你所愿,但也许会继续循环,期待有效输入。 谁知道?

此外,无论是关闭还是转向将在全球范围是工作的方式,如果有一个呢。 某些程序可能退出了,你希望关闭STDINs,其他人可能需要从正交函数/dev/null

因此,要做到这一点的方式是不一般的,包含全部类型的解决方案,而是一个适合你放在那个地方的程序。 更重要的是,不要使用try(运行程序),再搭上方法(这里的程序要求输入的情况下),只需拨打该你知道他们不会要求输入方式的程序。

反正都是这样说,可能工作的一种可能性是关闭STDIN和后台进程。 例如:

#!/bin/bash

exec 0<&-
./prompt.sh &

或替代地,重定向STDIN到/ dev / null,并且背景的处理。 例如:

#!/bin/bash

./prompt.sh </dev/null &

然后,您需要检查程序的返回码(与$?看看他们是否正确地退出。 (希望你正在使用的程序的未知列表遵循标准的返回值方案)

STDIN的关闭/重新定向将处理其中STDIN用于接受输入和backgrounding过程将处理其中的情况下的情况下/dev/tty是(因为背景程序执行不具有TTY)。

你对你自己,如果你的程序使用其他一些方法提示(一FD直接打开了你的伪终端,会弹出一个图形化的输入框,向您提供声音提示,等等,等等)。



Answer 3:

大多数(全部?)* NIX有一个tty打印出shell的名称命令tty并退出0如果外壳有一个TTY连接,否则退出1错误。

if ! tty>&/dev/null; then echo "Not a terminal; goodbye."; exit 1; fi


文章来源: Fail if a script expects input or entering passwords
标签: linux bash sh