В вашем сценарии задание ssh
получает тот же стандартный ввод, что и read line
, и в вашем случае происходит сожжение всех строк при первом вызове.Таким образом, read line
может видеть только первую строку ввода.
Решение: закройте стандартный ввод для ssh
или лучше перенаправьте с /dev/null
.(Некоторым программам не нравится закрытие стандартного ввода)
while read line
do
ssh server somecommand </dev/null # Redirect stdin from /dev/null
# for ssh command
# (Does not affect the other commands)
printf '%s\n' "$line"
done < hosts.txt
Если вы не хотите перенаправлять из / dev / null для каждой отдельной работы в цикле, вы также можете попробовать выполнить одно из следующих действий:
while read line
do
{
commands...
} </dev/null # Redirect stdin from /dev/null for all
# commands inside the braces
done < hosts.txt
# In the following, let's not override the original stdin. Open hosts.txt on fd3
# instead
while read line <&3 # execute read command with fd0 (stdin) backed up from fd3
do
commands... # inside, you still have the original stdin
# (maybe the terminal) from outside, which can be practical.
done 3< hosts.txt # make hosts.txt available as fd3 for all commands in the
# loop (so fd0 (stdin) will be unaffected)
# totally safe way: close fd3 for all inner commands at once
while read line <&3
do
{
commands...
} 3<&-
done 3< hosts.txt