mount.cifs는 비밀번호 확인을 위해 PASSWD 변수를 사용할 수 있습니다.
다음 예는 문제를 보여줍니다.
export PASSWD=mysecret; ssh foreignhost "echo $PASSWD"
유효합니다. 즉, 환경 변수 PASSWD의 값이 표시됩니다. 훌륭한,
export PASSWD=mysecret; ssh foreignhost "mount -t cifs //server/path /mnt -o username=myuser"
비밀번호를 물어보는데
export PASSWD=mysecret; ssh foreignhost "PASSWD=$PASSWD mount -t cifs //server/path /mnt -o username=myuser"
비밀번호는 필요하지 않지만 인증에는 PASSWD 값이 사용됩니다. 그런데 왜? 보안 문제는 비밀번호가 프로세스 목록에 일반 텍스트로 표시된다는 것입니다.
답변1
export PASSWD=mysecret; ssh foreignhost "echo $PASSWD"
PASSWD
이는 로컬 쉘(및 로컬 쉘에 의해 시작된 하위 프로세스의 환경)에서 쉘 변수를 설정합니다. 그런 다음 echo mysecret
에서 명령을 실행합니다 foreignhost
. 에서 "echo $PASSWD"
로컬 셸은 큰따옴표 사이의 텍스트에 대해 변수 확장을 수행합니다. 비밀번호 문자열은 원격 셸의 명령줄에 나타나므로 프로세스 목록에 표시됩니다.
export PASSWD=mysecret; ssh foreignhost "mount -t cifs //server/path /mnt -o username=myuser"
PASSWD
이는 로컬 쉘(클라이언트 프로세스를 포함하여 로컬 쉘에 의해 시작된 하위 프로세스의 환경)에서 쉘 변수를 설정합니다 ssh
. 클라이언트와 서버의 구성에 따라 SSH 클라이언트는 특정 환경 변수를 서버에 전송할 수 있으며 서버는 이를 수락하거나 수락하지 않을 수 있습니다. 일반적 으로 사용자(또는 배포판)가 SSH 클라이언트에서 및 를 보내도록 구성하지 않은 한 , 허용된 몇 가지 환경 변수(로컬 변수 LANG
및 특별 처리를 받는 변수 LC_*
포함 )만이 SSH를 통해 전달됩니다. SSH 서버가 허용하고 원격 쉘에는 환경 변수가 설정되어 있지 않습니다.TERM
PASSWD
PASSWD
PASSWD
export PASSWD=mysecret; ssh foreignhost "PASSWD=$PASSWD mount -t cifs //server/path /mnt -o username=myuser"
첫 번째 경우와 마찬가지로 원격 쉘 명령에는 비밀번호( PASSWD=mysecret mount …
)가 있으므로 프로세스 목록에 표시됩니다.
많은 배포판에서는 이름이 일치하는 모든 환경 변수를 보내고 수락하도록 SSH를 구성하므로 LC_*
자체 환경 변수를 정의하여 데이터를 전달할 수 있습니다.
LC_ENV_PASSWD=mysecret ssh foreignhost 'export PASSWD="$LC_ENV_PASSWD"; mount …'
매개변수 주위에 작은따옴표가 있습니다 ssh
. 이런 방식으로 원격 호스트에서 실행되는 쉘 명령은 export PASSWD="$LC_ENV_PASSWD"; mount …
비밀번호가 포함되지 않은 상태입니다.
또는 표준 입력을 통해 비밀번호를 전달하십시오.
echo mysecret | ssh foreignhost 'IFS= read -r PASSWD; export PASSWD; mount …'