理解してからコマンドラインでパスワードを使用する問題、問題なくプログラムにパスワードを提供する方法を見つける必要があります(パスワードはどこかに記録されません)。
Apache、FastCGI、PHP、およびMySQLソースからLAMPサーバー全体を自動的にインストールするbashスクリプトがあります。これらのインストールにはパスワード、特にMySQLが必要です。
パスワードを漏らさずにスクリプトを完全に自動化するにはどうすればよいですか?
編集(6月9日、3:55 UTC):
コマンドラインからrootを介してパスワードを使用してmysqlを呼び出します。
root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
(私たちの場合はPASS = "p4ssw0rd")通常のユーザー(dor)を介して実行し、以下を実行します
。ps aux | grep mysql
パスワードを表示しない!
(一部)ps
出力は次のとおりです。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3562 0.0 0.0 34156 2864 pts/0 S+ 05:53 0:00 mysql -u root -px xxxxxx
どうやってこれができますか?
答え1
アップデート関連:
プロセスが開始されると、パラメータを格納するための専用メモリ領域と、渡されたパラメータの数を知らせるintがあります。
MEMORY
argc 2
argv[0] program_name
argv[1] foo
argv[2] bar
MySQLはコマンドラインを介してパスワードが渡されたことを確認し-p
、表示されない新しい変数にコピーされると、x
そのメモリ領域を 'es'で上書きします。
簡単に言うと:
argc 2
argv[1] -p
argv[2] p4ssw0rd
new_var = copy(argv[2]);
argv[2] = "xxxxx";
client/mysqladmin.cc
ソースコードにあります。
case 'p':
...
opt_password=my_strdup(argument,MYF(MY_FAE));
while (*argument)
*argument++= 'x'; /* Destroy argument */
実行するとパラメータ( )のメモリ領域をps
読み込むargv[N]
のであるxxxx
。
パスワードは短時間だけ表示されますが、数回のCPUサイクル中にのみ表示されます。
--init-file
特別なオプションと手順を使用してMySQLパスワードを更新できます。C.5.4.1.2。ルートパスワードのリセット:Unixシステム
mysqld_safe --init-file=/home/me/mysql-init &
編集する:
〜のように@ギルスできると言うecho
、printf
またはhere
スクリプトのマニュアルを使用してください。
.my.cnf
ホームディレクトリに追加するか(一時的な) 保管と使用--defaults-extra-file
オプション。(後でより早くコマンドラインに適切なオプションを追加する必要があると思います。)ユーザーを含めることもできます。また参考にしてください追加使いたくない場合は、オプション名にただこのファイルは構成として機能します。
[client]
user=foo
password='password!'
shell> chmod 400 my_tmp.cnf
shell> mysql --defaults-extra-file=my_tmp.conf -...
オプションで、[client]
グループ化はmysqld
構成をスキップできます。
以下も使用できます。MYSQL_PWD
環境変数ですが、これを行う必要があります。いいえ多くの実装では、Linuxのファイルに環境をリストするのと同じように使用できますps
。ps -e
/proc/<PID>/environ
tr '\0' '\n' < /proc/<PID>/environ
このトピックに関する追加情報ここ。
また、見たいと思うかもしれませんMySQL設定ユーティリティこれにより、ホームディレクトリ()の暗号化されたファイルにパスワードを保存できます.mylogin.cnf
。
答え2
一般的な解決策は、ファイルまたは標準入力(または引数として渡される必要がある他のファイル記述子)からパスワードを読み取ることです。
答え3
ftp
これは、一部のプログラム(コマンドラインなど)がパスワードを読み取る/dev/tty
プロセス制御TTYを表す各プロセスの特殊ファイルです。これにより、プログラムがパスワードを画面に表示するのを防ぎ、パスワードのソースをより確実に確認できます。
#!/bin/bash
stty -F /dev/tty -echo
read PASSWORD < /dev/tty
echo $PASSWORD