로컬 서버에는 미리 정의된 환경 변수( )에 비밀번호를 저장하는 프로그램이 있습니다 SPECIAL_PASSWORD
.
원격 서버에는 미리 정의된 환경 변수( )에서 비밀번호를 읽고 사용하는 프로그램이 있습니다 SPECIAL_PASSWORD
.
원격 서버에서 프로그램을 실행하고, 로컬 환경에서 설정한 비밀번호를 입력하고 싶습니다.
내 시도는 다음과 같습니다.
local_command # produces the SPECIAL_PASSWORD Env Var
ssh -l remote_user remote_server <<EOSSH
export SPECIAL_PASSWORD=${SPECIAL_PASSWORD} # Transfer Env Var
remote_command # consumes SPECIAL_PASSWORD Env Var
EOSSH
또한 예상대로 작동하는 것 같습니다.
- 유닉스는
ps
비밀번호를 유출하지 않는 것 같습니다 - 현재 프로세스 또는 해당 하위 프로세스만 비밀번호에 액세스할 수 있습니다.
하지만 이것이 정말 안전합니까? 비밀번호를 항상 읽을 수 있습니까? 더 나은 옵션이 있습니까?
위의 트릭 없이 환경 변수의 하위 집합을 전송할 수 있도록 sshd_config
( AcceptEnv
) 및 ssh_config
( )를 변경할 수 있습니다 . SendEnv
그러나 시스템은 엄격하게 제어되며 sshd_config에는 관리자 개입이 필요합니다. 제 경우에는 변경이 불가능해 보입니다 sshd_config
.
고쳐 쓰다
저는 실행 중인 원격 SSH 명령으로 데이터를 전송하여 제공되는 다른 솔루션을 사용하고 있습니다. 이 구문은 더 이상 HERE 문서에서 사용되지 않습니다.
sendEnv() {
echo "var1=${var1}"
echo "var2=${var2}"
...
}
sendEnv | ssh -l remote_user remote_server "receiving_command".
내 경우에는 receiving_command
.System.in
그것은 매력처럼 작동합니다.
답변1
remote_user
및 로 읽을 수 있습니다 root
. remote_command
누구나 읽을 수 있는 파일이나 이와 유사한 파일에 작성하지 않는 한 다른 것은 없습니다 .
/proc
파일 시스템의 프로세스 환경을 검사할 수 있습니다 /proc/$pid/environ
. 파일에 대한 권한이 기본적으로 로 설정되어 있으므로 euid
와 동일한 사용자 여야 $pid
합니다 .root
-r-- --- ---
stdin
환경 을 사용하는 것 외에도 ssh
. ssh로 파이프하면 내가 아는 한 루트와 대상 프로그램(및 해당 서브루틴)만 액세스할 수 있습니다(가정 $(cat /proc/sys/kernel/yama/ptrace_scope) == 1
).