cryptsetup
どのFDに転送されても、/dev/null
パスワードの入力を求められます。たとえば、次のプロンプトが表示され続けます。
cryptsetyp luksOpen /dev/sdXY name >/dev/null 2>/dev/null
標準リダイレクトを使用してファイルにリダイレクトできないというターミナルメッセージをどのように表示しますか?
stdoutを使用して親スクリプトに結果を返すので、bashスクリプトでこのような機能を取得したいと思います。しかし、まだインタラクティブなプロンプトを表示したいと思います。 bashを使ってこれを行うことはできますか?
答え1
お試しいただくとstrace
、おそらく直接使用される様子をご覧いただけます/dev/tty
。
...
open("/dev/tty", O_RDWR) = 6
ioctl(6, TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(6, "Enter passphrase for .......: ", 30) = 30
ioctl(6, SNDCTL_TMR_CONTINUE or TCSETSF, {B38400 opost isig icanon -echo ...}) = 0
...
ソースコードから(utils_crypt.c
):
static int interactive_pass(const char *prompt, char *pass, size_t maxlen,
long timeout)
{
[...]
/* Read and write to /dev/tty if available */
infd = open("/dev/tty", O_RDWR);
if (infd == -1) {
infd = STDIN_FILENO;
outfd = STDERR_FILENO;
} else
outfd = infd;
if (tcgetattr(infd, &orig))
goto out_err;
だから、/dev/tty
オンにしてテストし、動作すると使用します。失敗すると、通常のstdin、stdoutに戻り、プロンプトは再び表示されません。
は/dev/tty
プロセスの端末です。詳細についてはを参照してくださいman 4 tty
。
答え2
おそらく自分で書いているようです/dev/tty
(とにかく同じ動作が得られます)。
#!/bin/bash
# set up the new file descriptor
exec 3> /dev/tty
# test
echo "Stdout"
echo "Stderr" >&2
echo "Directly to tty" >&3
または、単に次のこともできます。
echo "Directly to tty" >/dev/tty
$ ./foo.sh >/dev/null 2>/dev/null
Directly to tty
read
これはまだ機能します。
execは、現在のシェルの実行中にリダイレクト状態を維持する必要があります。
単純なコマンドのリダイレクト:
$ echo yes 3>file
コマンドの実行中は持続します。コマンド(この場合はecho)が終了すると、シェルはリダイレクトを削除して「現在のシェル」実行環境に戻ります。
ㅏ:
$ 3>file
実行されたコマンドが「なし」でリダイレクトが長続きしない「簡単なコマンド」です。
代わりに:
$ exec 3>file
execは、「現在のシェル」をリダイレクトを含む新しいシェルに置き換えます。これにより、「現在のシェル」が存在する限り、リダイレクトはアクティブのままです。これは次のようにキャンセルできます(実際にはfd 3を閉じます)。
$ exec 3>&-