명령 줄에서 암호를 사용하는 데 따른 문제를 이해 한 후 문제 없이 암호를 프로그램에 공급하는 방법을 찾아야합니다 (비밀번호가 기록되지 않은 상태).
소스, Apache, FastCGI, PHP & MySQL에서 전체 LAMP 서버를 자동으로 설치하는 bash 스크립트가 있습니다. 이러한 설치에는 암호, 특히 MySQL이 필요합니다.
비밀번호를 밝히지 않고 스크립트를 완전히 자동화하려면 어떻게해야합니까?
편집 (6 월 9 일 3:55 UTC) :
루트를 통해 명령 행에서 비밀번호로 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”)
그리고 나는 ps aux | grep mysql
일반 사용자 (dor)를 통해 실행 하는데 암호가 표시되지 않습니다 !
(일부) 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
어떻게 가능합니까?
답변
업데이트와 관련하여 :
프로세스가 시작되면 인수가 저장되는 전용 메모리 영역과 전달 된 인수 수를 나타내는 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 Systems
mysqld_safe --init-file=/home/me/mysql-init &
편집하다:
으로 @Gilles는 말을 수행 할 수 있습니다 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
.
답변
일반적인 해결책은 파일 또는 표준 입력 (또는 매개 변수로 전달해야하는 다른 파일 설명자)에서 비밀번호를 읽는 것입니다.
답변
일부 프로그램 ( ftp
예 : 명령 행 ) /dev/tty
은 프로세스의 제어 TTY를 나타내는 프로세스 별 특수 파일 에서 암호를 읽습니다 . 이를 통해 프로그램은 암호를 화면에 다시 표시하지 않고 암호의 출처를 조금 더 확실하게 확인할 수 있습니다.
#!/bin/bash
stty -F /dev/tty -echo
read PASSWORD < /dev/tty
echo $PASSWORD