RHEL8(通过 ssh 默认 bash shell)
> scp source_path remote_host:destination_path &
> fg
Password: @#$#@#myPassword'sVisibleOhNo!!!
首先,这只是我的系统,还是可以重现?它不会提示我输入用户,并且只有当我在后台运行 scp 时才会发生这种情况(这一开始没有意义,但仍然如此)这是预期的行为吗?这不是问题吗?
答案1
它不是scp
回显您键入的字符的 shell,而是根据运行程序给出的设置的内核。 (stty
修改此设置)。
如果您输入stty -echo
,您将没有回声,并且需要(盲目地)输入stty echo
以恢复正常行为。
使用stty -echo &
,bash 似乎使 TTY 状态回到回显模式。它可能与 相同scp
。该行为可能取决于 shell,但 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,而是与 shell 的回显设置之间的不良交互有关。这些可以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。