RHEL8(ssh를 통한 기본 bash 쉘)
> scp source_path remote_host:destination_path &
> fg
Password: @#$#@#myPassword'sVisibleOhNo!!!
우선, 이것은 단지 내 시스템입니까, 아니면 재현할 수 있습니까? 사용자를 묻는 메시지가 표시되지 않으며 백그라운드에서 scp를 실행할 때만 발생합니다(처음에는 이해가 안 되지만 여전히). 이것이 예상되는 동작입니까? 이것이 문제가 아닌가?
답변1
scp
입력한 문자를 에코하는 쉘이 아니라 실행 중인 프로그램에서 제공한 설정을 기반으로 하는 커널입니다 . ( stty
이 설정을 수정하세요).
를 입력하면 에코가 발생하지 않으며 정상적인 동작을 복원하려면 stty -echo
(맹목적으로) 입력해야 합니다 .stty echo
bash를 사용하면 stty -echo &
TTY 상태가 다시 에코 모드로 전환되는 것 같습니다. 와 같을 수도 있습니다 scp
. 동작은 셸에 따라 다를 수 있지만 Fish와 zsh는 bash와 동일한 동작을 하는 것으로 보입니다.
답변2
@Frédéric Loyer의 답변 덕분에 더 관련성 높은 정보를 얻을 수 있었습니다. 다음 스크립트 중 하나를 사용하여 scp와 유사한 동작을 확인할 수 있습니다.
> safe () (stty -echo; read password; stty echo)
> safe &
그렇지 않으면
> (stty -echo; read password; stty echo)
fg
궁극적으로 근본적인 문제(보안 및 기타)는 scp에만 국한된 것이 아니라 쉘의 에코 설정 간의 잘못된 상호 작용과 관련이 있습니다. 이는 stty -echo/echo
개별적으로 수동으로 활성화/비활성화할 수 있습니다. 이를 통해 여러 호스트, SSH 연결 등을 요구하지 않고도 다양한 시스템의 특정 동작을 검사할 수 있습니다.
MacOS의 zsh
> safe () (stty -echo; read password; stty echo)
> safe &
[1] 12345
>
[1] + suspended (tty output) safe
> fg
[1] + continued safe
stty: tcsetattr: Interrupted system call
im Getting The Same Issue(macOS zsh now)
>
RHEL 및 Ubuntu의 Bash는 더욱 나쁩니다.
> (stty -echo; read password; stty echo) &
[1] 12345
> fg
( stty -echo; read password; stty echo )
[1]+ Stopped ( stty -echo; read password; stty echo )
> fg
( stty -echo; read password; stty echo )
VisiblePassword!!!
>
첫 번째 fg 후에는 완전히 응답하지 않게 됩니다. ctrl+z와 다른 fg를 실행해야 합니다.