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

おすすめ記事