사용중인 쉘에 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"
누군가 * 다른 사람의 암호 만 변경하려면 루트 액세스가 필요합니다. 터미널 대신 표준 입력에서 데이터를 가져 오면 그 값이 변경되지 않습니다. – chepner
작동하지 않습니다. 그것을 밖으로 시도하십시오. – scagbackbone