2

次のコマンドを実行します。

mysql -u root -p < load_data.sql > output.tab

この-pフラグは、mysql クライアント (C プログラム) に、パスワードを入力するためのインタラクティブなプロンプトをユーザーに提供するように指示します。

私の知る限り、このような入力は通常、プロンプトを書き込んでから、標準入力から行を読み取るstderrような呼び出しをブロックすることで処理されます。gets

しかし、シェルはすでにファイルを開き、mysql クライアントの をそのファイル記述子にload_data.sql設定しています。したがって、ファイルから最初の行を取得するだけで呼び出すべきではありませんか?stdingets

私が最初に考えたのは、プログラムは行を読み取る前に最後までシークするということでしたが、パイプではそのようにシークすることはできません!

では、これはどのように機能するのでしょうか。何か魔法はありますか?

4

2 に答える 2

3

通常、パスワードを要求するアプリケーションは実際には標準入力からパスワードを読み取りません。これは、(a) パスワードが対話的に入力された場合にパスワードが画面に表示され、(b) プレーンテキストのパスワードが推奨されるためです。物事を自動化する必要があるときに、一般に公開されている場所 (例: を介して他のユーザーに表示されるコマンド ラインps) で乱闘します。PostgreSQL のpsqlSQL シェルは端末デバイスを直接開きますが、mysql も同じことをすると思います。

いくつかの簡単な検索で、この関連する質問が見つかりました。最高評価の回答では、getpass()標準入力をバイパスして端末への直接接続を実際に開く GNU function について言及しています。この関数は、ほとんどのパスワード プロンプト プログラムが *nix で使用しているものだと思います。

于 2012-12-06T04:23:22.343 に答える
0

これは開かれているパイプではなくstdin、ファイルを指すようにリダイレクトされています。したがって、FILE*(つまり、ストリーム) と、操作できる通常のファイル記述子の両方が得られます。下位レベルのファイル記述子の場合、ファイル内を移動するためにlseek()使用できる などのシーク操作があります。read()

ファイルにリダイレクトされている間に制御端末からデータを読み取りたい場合は、制御端末stdinを開いて別のファイル記述子を読み取る必要があります。プロセスの制御端末が何であるかを判断するために使用ctermid()し、別のファイル記述子でそれを再度開くことができます。

于 2012-12-06T04:11:09.657 に答える