cryptsetup - stdout / stdinリダイレクト印刷プロンプトをバイパスする方法は?

cryptsetup - stdout / stdinリダイレクト印刷プロンプトをバイパスする方法は?

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>&-

関連情報