ssh -nto prevent ssh from swallowing stdin.
The same error applies to multiple commands, like
ffmpeg -nostdin and
while read -r host do ssh "$host" "uptime" done < hosts.txt
while read -r host do ssh -n "$host" "uptime" done < hosts.txt
while read -r host do ssh "$host" <<'EOF' uptimeEOF done < hosts.txt
Commands that process stdin will compete with the
read statement for input. This is especially tricky for commands you wouldn't expect reads from stdin, like
ssh .. uptime,
The most common symptom of this is a
while read loop only running once, even though the input contains many lines. This is because the rest of the lines are swallowed by the offending command.
To refuse such commands input, you can use a command specific option like
ssh -n or
More generally, you can also redirect their stdin with
< /dev/null. This works for all commands with this behavior.
ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.