2017-10-31 1 views
0

하나 이상의 토론에서 passwd로 파이프를 사용하는 것은 프로세스 목록에서 반향하기 위해 제공되는 인수를 얻을 수 있기 때문에 위험합니다.passwd로 파이프를 통해 암호를 반향하는 것이 얼마나 위험한 지

현재 도구로 작업 중이며 ssh를 통해 암호를 원격으로 변경합니다. usermod 나 chpasswd를 사용하려면 루트 액세스 권한이 없기 때문에 에코 방법을 사용합니다.

명령 :

echo -e 'old\nnew\nnew' | passwd 

이 얼마나 쉽게 확인하려면 - 나는 시도했다. 그러나 그들을 얻을 수 없었다.

내 방법이었다

#!/bin/bash 
filename=$1 

while true 
do 
    echo "$(pgrep -af passwd)" >> "$filename" 
    sleep 0.1 
done 

내가 몇 번 에코를 통해 비밀번호를 변경하지만 아무것도 볼 수 없었다. 나는 수면 0.1이 문제 일 수 있다고 생각합니다.

프로세스 목록에서 가져 오는 것이 얼마나 쉬운 일이며 이렇게하면이 방법으로 사용하는 것이 얼마나 안전하지 않은지 알 수 있습니다.

+0

누군가 * 다른 사람의 암호 만 변경하려면 루트 액세스가 필요합니다. 터미널 대신 표준 입력에서 데이터를 가져 오면 그 값이 변경되지 않습니다. – chepner

+0

작동하지 않습니다. 그것을 밖으로 시도하십시오. – scagbackbone

답변

2

사용중인 쉘에 echo이 내장되어 있는지 여부 또는 외부 바이너리 (/ bin/echo)를 사용하는지 여부에 따라 다릅니다. 외부 바이너리 인 경우, 인수 목록에 암호가 명백하게 표시된 하위 프로세스로 실행됩니다 (ps, pgrep 등을 통해). 이것이 기본 제공이라면 파이프 라인의 echo 명령은 하위 프로세스로 실행되지만 부모 쉘과 동일한 표시 인수 목록을 가진 서브 쉘 (즉, 안전함)이됩니다.

따라서 일 가능성이 높습니다. 일 수도 있지만 걱정할 몇 가지 합병증이 있습니다. 먼저 ssh을 통해 원격 컴퓨터에서이 프로그램을 실행하는 경우 기본 쉘이 무엇인지 알 필요가 없습니다. 배시라면 괜찮아. 대시라면 문제가 있다고 생각합니다. 둘째, 원격 셸 및/또는 echo 명령에 대해 걱정할 필요가없는 것은 로컬 스크립트에서 해당 원격 echo 명령까지의 모든 단계를 염려해야합니다. 예를 들어, 당신이 사용하는 경우 : (원격 쉘에 따라)

ssh [email protected] "echo -e 'old\nnew\nnew' | passwd" 

가 ... 다음 원격 echo 아마 안전하지만 @thatotherguy는 지적 암호에 표시됩니다 모두 원격 쉘 ( bash -c echo -e 'foo\nbar\nbar' | passwd) ssh 프로세스의 인수 목록에 이 있습니다.

다른 복잡한 문제가 있습니다. echo은 옵션 (예 : -e)을 처리하고 출력 문자열에서 이스케이프 처리하는 방법과 일관성이 없습니다 (예 : this question 참조). printf (예 : printf '%s\n' "$oldpass" "$newpass" "$newpass")을 사용하면 훨씬 편리 할뿐만 아니라 bash의 기본 제공 항목이기도합니다. 또는 bash를 사용하고 있다고 확신하는 경우 here-string (<<<string)을 대신 사용할 수 있습니다. 그것은 전혀 탈출을 해석하지 않습니다,하지만 당신은 그들을 해석하는 배쉬의 $' ' 구문을 사용할 수 있습니다

passwd <<<"$old"$'\n'"$new"$'\n'"$new" 

이 프로세스에 대한 (/bin/echo 또는 서브 쉘 중), 그래서 걱정을 전혀 서브 프로세스를 포함하지 않습니다 표.

불확실 원격 쉘의 문제와 ssh에서 보여주는 암호를 모두 피하기 위해 또 다른 가능성의 인수리스트는 ssh를 통해 암호를 전달하는 것입니다의 표준 입력 : 당신이 호출한다면

ssh [email protected] passwd <<<"$old"$'\n'"$new"$'\n'"$new" 
3

당신의 echo|passwd 명령 ssh을 통해, 예를 들면 : 당신이 볼 필요가 프로세스가 passwd

client$ ssh example.com "echo -e 'foo\nbar\nbar' | passwd" 

하지

하지만 사용자의 로그인 쉘은 레모에 sshd에 의해 호출 쪽 :

server$ until pgrep -af bash | grep passwd; do true; done 
8387 bash -c echo -e 'foo\nbar\nbar' | passwd 
+0

좋은 지적; 나는 그 대답을 놓쳤다. –